Sync the focused Frame with the mouse pressed Node.
authorJaehun Lim <ljaehun.lim@samsung.com>
Fri, 26 Apr 2013 06:11:38 +0000 (15:11 +0900)
committerJaehun Lim <ljaehun.lim@samsung.com>
Fri, 26 Apr 2013 06:11:38 +0000 (15:11 +0900)
[Title] Sync the focused Frame with the mouse pressed Node.
[Issus#] N_SE-35881
[Problem] The scrolling is disabled in Google+ notification.
[Cause] The pressed Node is not in the focused Frame sometimes.
[Solution] changeFocusedFrameAndNode() changes both Frame and Node.

Change-Id: I2db4c7db5162c2fe1119feb9539a807b31ed2111

Source/WebCore/page/EventHandler.cpp
Source/WebCore/page/EventHandler.h

index ffc50f2..64ac373 100755 (executable)
@@ -1275,8 +1275,7 @@ bool EventHandler::setMousePressNodeAtPoint(const IntPoint& point, bool checkOve
     HitTestResult result = hitTestResultAtPoint(point, false);
     Node* node = result.innerNode();
     if (!node) {
-        changeFocusedFrame(m_frame->page() ? m_frame->page()->mainFrame() : 0);
-        setMousePressNode(0);
+        changeFocusedFrameAndNode(0);
         return false;
     }
 
@@ -1290,8 +1289,7 @@ bool EventHandler::setMousePressNodeAtPoint(const IntPoint& point, bool checkOve
                     && renderer->enclosingLayer()->hasAcceleratedTouchScrolling()
                     && renderer->enclosingLayer()->layerForScrollingContents()) {
                     overflowRenderer = renderer;
-                    changeFocusedFrame(node->document()->frame());
-                    setMousePressNode(node);
+                    changeFocusedFrameAndNode(node);
                     return true;
                 }
             }
@@ -1299,15 +1297,13 @@ bool EventHandler::setMousePressNodeAtPoint(const IntPoint& point, bool checkOve
             // Find overflow node.
             if (renderer->isBox() && toRenderBox(renderer)->scrollsOverflow()
                 && toRenderBox(renderer)->canBeScrolledAndHasScrollableArea()) {
-                changeFocusedFrame(node->document()->frame());
-                setMousePressNode(node);
+                changeFocusedFrameAndNode(node);
                 return true;
             }
 #if ENABLE(TIZEN_INPUT_BOX_SCROLL)
             // Setting mouse press for inline text box
             if (renderer->isBox() && renderer->isTextField()) {
-                changeFocusedFrame(node->document()->frame());
-                setMousePressNode(node);
+                changeFocusedFrameAndNode(node);
                 return true;
             }
 #endif
@@ -1320,19 +1316,25 @@ bool EventHandler::setMousePressNodeAtPoint(const IntPoint& point, bool checkOve
             node = 0;
     } while (node);
 
-    changeFocusedFrame(m_frame->page() ? m_frame->page()->mainFrame() : 0);
-    setMousePressNode(0);
+    changeFocusedFrameAndNode(0);
     return false;
 }
 
-void EventHandler::changeFocusedFrame(PassRefPtr<Frame> targetFrame)
+void EventHandler::changeFocusedFrameAndNode(PassRefPtr<Node> targetNode)
 {
     if (!m_frame->page())
         return;
 
-    bool changedFocusedFrame = targetFrame != m_frame->page()->focusController()->focusedOrMainFrame();
-    if (changedFocusedFrame)
-        m_frame->page()->focusController()->setFocusedFrame(targetFrame);
+    if (!targetNode) {
+        m_frame->page()->focusController()->setFocusedFrame(m_frame->page()->mainFrame());
+        setMousePressNode(0);
+        return;
+    }
+
+    setMousePressNode(0);
+    Frame* targetFrame = targetNode->document()->frame();
+    m_frame->page()->focusController()->setFocusedFrame(targetFrame);
+    targetFrame->eventHandler()->setMousePressNode(targetNode);
 }
 #endif
 
index fc2612e..6380aaa 100644 (file)
@@ -147,7 +147,7 @@ public:
 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION)
     bool scrollOverflow(const FloatPoint&);
     bool setMousePressNodeAtPoint(const IntPoint&, bool checkOverflowLayer, RenderObject*&);
-    void changeFocusedFrame(PassRefPtr<Frame>);
+    void changeFocusedFrameAndNode(PassRefPtr<Node>);
 #endif
     bool scrollRecursively(ScrollDirection, ScrollGranularity, Node* startingNode = 0);
     bool logicalScrollRecursively(ScrollLogicalDirection, ScrollGranularity, Node* startingNode = 0);