⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 154382 in webkit


Ignore:
Timestamp:
Aug 21, 2013, 5:52:31 AM (13 years ago)
Author:
tonikitoo@webkit.org
Message:

Text dragging can scroll overflow:hidden boxes https://bugs.webkit.org/show_bug.cgi?id=119760

Reviewed by Darin Adler.
Patch by Antonio Gomes <a1.gomes@sisa.samsung.com>

Source/WebCore:

Consider the case of the following HTML:
<div style="overflow:hidden; width: 100px; height: 100px" >

<input id="input" type="text" size=10 value="any text here!"/>
<button style="position:relative; top: 100px; left: 100px"/>

</div>

If ones starts a text selection by dragging the mouse from within the input
field, and continues to drag beyong the outer div boundary, the latter will
be scrolled no matter its overflow:hidden style.
That happens because when the autoscroll has started, it gets propagated up
to the current layer's parent layer, instead of the to current layer's enclosing
scrollable layer.

Patch fixes the issue by hardening the way scrolling is
propagated upwards when autoscroll is being performed.

RenderLayer::enclosingScrollableLayer method also got rewritten
in terms of RenderLayer tree traversing, instead of RenderObject tree.
The rewrite adds support for cross frame upwards traversal.

Test: fast/events/autoscroll-upwards-propagation.html

  • rendering/RenderLayer.cpp:

(WebCore::parentLayerCrossFrame):
(WebCore::RenderLayer::enclosingScrollableLayer):
(WebCore::RenderLayer::scrollRectToVisible):

LayoutTests:

  • fast/events/autoscroll-upwards-propagation-expected.txt: Added.
  • fast/events/autoscroll-upwards-propagation.html: Added.
Location:
trunk
Files:
2 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r154379 r154382  
     12013-08-19  Antonio Gomes  <a1.gomes@sisa.samsung.com>
     2
     3        Text dragging can scroll overflow:hidden boxes
     4        https://bugs.webkit.org/show_bug.cgi?id=119760
     5
     6        Reviewed by Darin Adler.
     7        Patch by Antonio Gomes <a1.gomes@sisa.samsung.com>
     8
     9        * fast/events/autoscroll-upwards-propagation-expected.txt: Added.
     10        * fast/events/autoscroll-upwards-propagation.html: Added.
     11
    1122013-08-20  Gavin Barraclough  <barraclough@apple.com>
    213
  • trunk/Source/WebCore/ChangeLog

    r154378 r154382  
     12013-08-19  Antonio Gomes  <a1.gomes@sisa.samsung.com>
     2
     3        Text dragging can scroll overflow:hidden boxes
     4        https://bugs.webkit.org/show_bug.cgi?id=119760
     5
     6        Reviewed by Darin Adler.
     7
     8        Consider the case of the following HTML:
     9        <div style="overflow:hidden; width: 100px; height: 100px" >
     10          <input id="input" type="text" size=10 value="any text here!"/>
     11          <button style="position:relative; top: 100px; left: 100px"/>
     12        </div>
     13
     14        If ones starts a text selection by dragging the mouse from within the input
     15        field, and continues to drag beyong the outer div boundary, the latter will
     16        be scrolled no matter its overflow:hidden style.
     17        That happens because when the autoscroll has started, it gets propagated up
     18        to the current layer's parent layer, instead of the to current layer's enclosing
     19        scrollable layer.
     20
     21        Patch fixes the issue by hardening the way scrolling is
     22        propagated upwards when autoscroll is being performed.
     23
     24        RenderLayer::enclosingScrollableLayer method also got rewritten
     25        in terms of RenderLayer tree traversing, instead of RenderObject tree.
     26        The rewrite adds support for cross frame upwards traversal.
     27
     28        Test: fast/events/autoscroll-upwards-propagation.html
     29
     30        * rendering/RenderLayer.cpp:
     31        (WebCore::parentLayerCrossFrame):
     32        (WebCore::RenderLayer::enclosingScrollableLayer):
     33        (WebCore::RenderLayer::scrollRectToVisible):
     34
    1352013-08-20  Jer Noble  <jer.noble@apple.com>
    236
  • trunk/Source/WebCore/rendering/RenderLayer.cpp

    r154286 r154382  
    13801380}
    13811381
     1382static RenderLayer* parentLayerCrossFrame(const RenderLayer* layer)
     1383{
     1384    ASSERT(layer);
     1385    if (layer->parent())
     1386        return layer->parent();
     1387
     1388    RenderObject* renderer = layer->renderer();
     1389    Document* document = renderer->document();
     1390    if (!document)
     1391        return 0;
     1392
     1393    HTMLFrameOwnerElement* ownerElement = document->ownerElement();
     1394    if (!ownerElement)
     1395        return 0;
     1396
     1397    RenderObject* ownerRenderer = ownerElement->renderer();
     1398    if (!ownerRenderer)
     1399        return 0;
     1400
     1401    return ownerRenderer->enclosingLayer();
     1402}
     1403
    13821404RenderLayer* RenderLayer::enclosingScrollableLayer() const
    13831405{
    1384     for (RenderObject* nextRenderer = renderer()->parent(); nextRenderer; nextRenderer = nextRenderer->parent()) {
    1385         if (nextRenderer->isBox() && toRenderBox(nextRenderer)->canBeScrolledAndHasScrollableArea())
    1386             return nextRenderer->enclosingLayer();
     1406    for (RenderLayer* nextLayer = parentLayerCrossFrame(this); nextLayer; nextLayer = parentLayerCrossFrame(nextLayer)) {
     1407        if (nextLayer->renderer()->isBox() && toRenderBox(nextLayer->renderer())->canBeScrolledAndHasScrollableArea())
     1408            return nextLayer;
    13871409    }
    13881410
     
    23672389    }
    23682390   
     2391    if (renderer()->frame()->eventHandler().autoscrollInProgress())
     2392        parentLayer = enclosingScrollableLayer();
     2393
    23692394    if (parentLayer)
    23702395        parentLayer->scrollRectToVisible(newRect, alignX, alignY);
Note: See TracChangeset for help on using the changeset viewer.