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;