rendered paste body==== //depot/qt/4.4/src/3rdparty/webkit/WebCore/page/FrameView.cpp#2 - /home/ben/dev/qt-4.4/src/3rdparty/webkit/WebCore/page/FrameView.cpp ====
@@ -29,6 +29,7 @@
#include "AXObjectCache.h"
#include "EventHandler.h"
#include "FloatRect.h"
+#include "FocusController.h"
#include "Frame.h"
#include "FrameLoader.h"
#include "FrameLoaderClient.h"
@@ -37,11 +38,18 @@
#include "HTMLFrameSetElement.h"
#include "HTMLNames.h"
#include "OverflowEvent.h"
+#include "Page.h"
#include "RenderPart.h"
#include "RenderPartObject.h"
#include "RenderTheme.h"
#include "RenderView.h"
+#if PLATFORM(QT)
+#include "qwebframe.h"
+#include "qwebframe_p.h"
+#include "qwebpage_p.h"
+#endif
+
namespace WebCore {
using namespace HTMLNames;
@@ -1008,4 +1016,26 @@
}
#endif
+#if PLATFORM(QT)
+void FrameView::setFocus()
+{
+ // When a node is focused its corresponding frame is also set to active. Then
+ // Document::setFocusedNode calls setFocus() on the FrameView. When the frame is set to active
+ // we paint the caret and the focus frame accordingly. However we should really only do that if
+ // our QWebPage has the focus, otherwise we should reset the frame back to inactive. When the
+ // QWebPage receives the focus back it'll reactivate the frame, the focus controller remembers
+ // it.
+
+ Frame *f = static_cast<FrameView*>(this)->frame();
+ if (f && f->isActive() && f->page() && f->page()->focusController()->focusedFrame() == f) {
+ ScrollView* topLevel = this->topLevel();
+ if (topLevel && topLevel->isFrameView()) {
+ QWebFrame* qWebFrame = QWebFramePrivate::kit(static_cast<FrameView*>(topLevel)->frame());
+ if (!qWebFrame->page()->d->hasFocus)
+ f->setIsActive(false);
+ }
+ }
+}
+#endif
+
}
==== //depot/qt/4.4/src/3rdparty/webkit/WebCore/page/FrameView.h#2 - /home/ben/dev/qt-4.4/src/3rdparty/webkit/WebCore/page/FrameView.h ====
@@ -143,6 +143,11 @@
void layoutIfNeededRecursive();
#endif
+#if PLATFORM(QT)
+ void setFocus();
+#endif
+
+
private:
void init();
==== //depot/qt/4.4/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp#40 - /home/ben/dev/qt-4.4/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.cpp ====
@@ -119,6 +119,7 @@
, view(0)
, modified(false)
, viewportSize(QSize(0,0))
+ , hasFocus(false)
{
chromeClient = new ChromeClientQt(q);
contextMenuClient = new ContextMenuClientQt();
@@ -629,14 +630,36 @@
void QWebPagePrivate::focusInEvent(QFocusEvent *ev)
{
- if (ev->reason() != Qt::PopupFocusReason)
- page->focusController()->setFocusedFrame(QWebFramePrivate::core(mainFrame));
+ if (ev->reason() == Qt::PopupFocusReason)
+ return;
+
+ hasFocus = true;
+
+ FocusController *focusController = page->focusController();
+ if (focusController->focusedFrame()) {
+ Frame *frame = focusController->focusedFrame();
+ frame->setIsActive(true);
+ frame->setWindowHasFocus(true);
+ } else {
+ focusController->setFocusedFrame(QWebFramePrivate::core(mainFrame));
+ }
}
void QWebPagePrivate::focusOutEvent(QFocusEvent *ev)
{
- if (ev->reason() != Qt::PopupFocusReason)
- page->focusController()->setFocusedFrame(0);
+ if (ev->reason() == Qt::PopupFocusReason)
+ return;
+
+ hasFocus = false;
+
+ // only set the focused frame inactive so that we stop painting the caret
+ // and the focus frame. But don't tell the focus controller so that upon
+ // focusInEvent() we can re-activate the frame.
+ Frame *frame = page->focusController()->focusedFrame();
+ if (frame) {
+ frame->setIsActive(false);
+ frame->setWindowHasFocus(false);
+ }
}
void QWebPagePrivate::dragEnterEvent(QDragEnterEvent *ev)
==== //depot/qt/4.4/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.h#16 - /home/ben/dev/qt-4.4/src/3rdparty/webkit/WebKit/qt/Api/qwebpage.h ====
@@ -54,6 +54,7 @@
class InspectorClientQt;
class ResourceHandle;
class HitTestResult;
+ class FrameView;
}
class QWEBKIT_EXPORT QWebPage : public QObject
@@ -286,6 +287,7 @@
friend class WebCore::FrameLoaderClientQt;
friend class WebCore::InspectorClientQt;
friend class WebCore::ResourceHandle;
+ friend class WebCore::FrameView;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QWebPage::FindFlags)
==== //depot/qt/4.4/src/3rdparty/webkit/WebKit/qt/Api/qwebpage_p.h#13 - /home/ben/dev/qt-4.4/src/3rdparty/webkit/WebKit/qt/Api/qwebpage_p.h ====
@@ -102,6 +102,7 @@
bool modified;
bool insideOpenCall;
+ bool hasFocus;
quint64 m_totalBytes;
quint64 m_bytesReceived;