Fix scrolling in iframe over overflow:scroll.
authorJaehun Lim <ljaehun.lim@samsung.com>
Fri, 5 Apr 2013 05:19:21 +0000 (14:19 +0900)
committerGerrit Code Review <gerrit2@kim11>
Mon, 8 Apr 2013 05:46:40 +0000 (14:46 +0900)
[Title] Fix scrolling in iframe over overflow:scroll
[Issue#] DCM-1191
[Problem] Scroll is disabled after releasing selected string
[Cause] The EventHandler doesn't sync between the event target
        frame and the focused frame.
[Solution] Change the focused frame  whenever the event target
           frame is changed.

Change-Id: If86e12d21c863c205230df35c3a95cf06fa59419

Source/WebCore/page/EventHandler.cpp
Source/WebCore/page/EventHandler.h
Source/WebKit2/WebProcess/WebPage/efl/WebPageEfl.cpp

index 5d35bbc..68bd9bc 100755 (executable)
@@ -1248,6 +1248,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);
         return false;
     }
@@ -1262,6 +1263,7 @@ bool EventHandler::setMousePressNodeAtPoint(const IntPoint& point, bool checkOve
                     && renderer->enclosingLayer()->hasAcceleratedTouchScrolling()
                     && renderer->enclosingLayer()->layerForScrollingContents()) {
                     overflowRenderer = renderer;
+                    changeFocusedFrame(node->document()->frame());
                     setMousePressNode(node);
                     return true;
                 }
@@ -1270,12 +1272,14 @@ 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);
                 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);
                 return true;
             }
@@ -1289,9 +1293,20 @@ bool EventHandler::setMousePressNodeAtPoint(const IntPoint& point, bool checkOve
             node = 0;
     } while (node);
 
+    changeFocusedFrame(m_frame->page() ? m_frame->page()->mainFrame() : 0);
     setMousePressNode(0);
     return false;
 }
+
+void EventHandler::changeFocusedFrame(PassRefPtr<Frame> targetFrame)
+{
+    if (!m_frame->page())
+        return;
+
+    bool changedFocusedFrame = targetFrame != m_frame->page()->focusController()->focusedOrMainFrame();
+    if (changedFocusedFrame)
+        m_frame->page()->focusController()->setFocusedFrame(targetFrame);
+}
 #endif
 
 bool EventHandler::logicalScrollOverflow(ScrollLogicalDirection direction, ScrollGranularity granularity, Node* startingNode)
index 9bc0762..fc2612e 100644 (file)
@@ -147,6 +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>);
 #endif
     bool scrollRecursively(ScrollDirection, ScrollGranularity, Node* startingNode = 0);
     bool logicalScrollRecursively(ScrollLogicalDirection, ScrollGranularity, Node* startingNode = 0);
index c276791..364e8b4 100755 (executable)
@@ -1088,7 +1088,7 @@ void WebPage::setPressedNodeAtPoint(const IntPoint& point, bool checkOverflowLay
 {
     RenderObject* renderer = 0;
     id = 0;
-    pressed = m_page->focusController()->focusedOrMainFrame()->eventHandler()->setMousePressNodeAtPoint(point, checkOverflowLayer, renderer);
+    pressed = m_page->mainFrame()->eventHandler()->setMousePressNodeAtPoint(point, checkOverflowLayer, renderer);
 #if ENABLE(TIZEN_CSS_OVERFLOW_SCROLL_ACCELERATION_ON_UI_SIDE)
     if (pressed && renderer)
         id = toWebGraphicsLayer(renderer->enclosingLayer()->layerForScrollingContents())->id();