Changeset 145415 in webkit


Ignore:
Timestamp:
Mar 11, 2013 3:25:51 PM (11 years ago)
Author:
commit-queue@webkit.org
Message:

[BlackBerry] Add a method to find the ScrollView for a text selection.
https://bugs.webkit.org/show_bug.cgi?id=112061

Patch by Genevieve Mak <gmak@rim.com> on 2013-03-11
Reviewed by Rob Buis.

Internally reviewed by Mike Fenton and Jakob Petsovits.
PR #278490

Refactor the code in InRegionScroller so that we can add a method to find
the InRegionScrollableArea for a text selection.

  • Api/InRegionScroller.cpp:

(BlackBerry::WebKit::InRegionScrollerPrivate::clipToRect):

  • Pull out recursive clipping code into its own function.

(WebKit):
(BlackBerry::WebKit::InRegionScrollerPrivate::calculateInRegionScrollableAreasForPoint):
(BlackBerry::WebKit::InRegionScrollerPrivate::firstScrollableInRegionForNode):

  • This new method allows us to get just the first scrollable region instead of looking for more nested ones. We may want to refactor in the future because some of the code is very similar to calculateInRegionScrollableAreasForPoint.

(BlackBerry::WebKit::InRegionScrollerPrivate::clipAndCreateInRegionScrollableArea):

  • Add a convenience method for the previous function
  • Api/InRegionScroller.h:

(WebKit):

  • Api/InRegionScroller_p.h:

(InRegionScrollerPrivate):

Location:
trunk/Source/WebKit/blackberry
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/blackberry/Api/InRegionScroller.cpp

    r140046 r145415  
    11/*
    2  * Copyright (C) 2011, 2012 Research In Motion Limited. All rights reserved.
     2 * Copyright (C) 2011, 2012, 2013 Research In Motion Limited. All rights reserved.
    33 *
    44 * This library is free software; you can redistribute it and/or
     
    204204}
    205205
     206WebCore::IntRect InRegionScrollerPrivate::clipToRect(const WebCore::IntRect& clippingRect, InRegionScrollableArea* scrollable)
     207{
     208    RenderLayer* layer = scrollable->layer();
     209    if (!layer)
     210        return clippingRect;
     211
     212    if (layer->renderer()->isRenderView()) { // #document case
     213        FrameView* view = toRenderView(layer->renderer())->frameView();
     214        ASSERT(view);
     215        ASSERT(canScrollInnerFrame(view->frame()));
     216
     217        WebCore::IntRect frameWindowRect = m_webPage->mapToTransformed(m_webPage->getRecursiveVisibleWindowRect(view));
     218        frameWindowRect.intersect(clippingRect);
     219        return frameWindowRect;
     220    }
     221
     222    RenderBox* box = layer->renderBox();
     223    ASSERT(box);
     224    ASSERT(canScrollRenderBox(box));
     225
     226    // We want the window rect in pixel viewport coordinates clipped to the clipping rect.
     227    WebCore::IntRect visibleWindowRect = enclosingIntRect(box->absoluteClippedOverflowRect());
     228    visibleWindowRect = box->frame()->view()->contentsToWindow(visibleWindowRect);
     229    visibleWindowRect = m_webPage->mapToTransformed(visibleWindowRect);
     230    visibleWindowRect.intersect(clippingRect);
     231    return visibleWindowRect;
     232}
     233
    206234void InRegionScrollerPrivate::calculateInRegionScrollableAreasForPoint(const WebCore::IntPoint& documentPoint)
    207235{
     
    217245    if (!layer)
    218246        return;
     247
    219248    do {
     249
    220250        RenderObject* renderer = layer->renderer();
    221251
    222         if (renderer->isRenderView()) {
     252        if (renderer && renderer->isRenderView()) {
    223253            if (RenderView* renderView = toRenderView(renderer)) {
    224254                FrameView* view = renderView->frameView();
     
    259289    WebCore::IntRect recursiveClippingRect(WebCore::IntPoint::zero(), m_webPage->transformedViewportSize());
    260290
    261     std::vector<Platform::ScrollViewBase*>::reverse_iterator rend = m_activeInRegionScrollableAreas.rend();
    262     for (std::vector<Platform::ScrollViewBase*>::reverse_iterator rit = m_activeInRegionScrollableAreas.rbegin(); rit != rend; ++rit) {
    263 
    264         InRegionScrollableArea* curr = static_cast<InRegionScrollableArea*>(*rit);
    265         RenderLayer* layer = curr->layer();
    266         if (!layer)
    267             continue;
    268 
    269         if (layer->renderer()->isRenderView()) { // #document case
    270             FrameView* view = toRenderView(layer->renderer())->frameView();
    271             ASSERT(view);
    272             ASSERT(canScrollInnerFrame(view->frame()));
    273 
    274             WebCore::IntRect frameWindowRect = m_webPage->mapToTransformed(m_webPage->getRecursiveVisibleWindowRect(view));
    275             frameWindowRect.intersect(recursiveClippingRect);
    276             curr->setVisibleWindowRect(frameWindowRect);
    277             recursiveClippingRect = frameWindowRect;
    278 
    279         } else { // RenderBox-based elements case (scrollable boxes (div's, p's, textarea's, etc)).
    280 
    281             RenderBox* box = layer->renderBox();
    282             ASSERT(box);
    283             ASSERT(canScrollRenderBox(box));
    284 
    285             WebCore::IntRect visibleWindowRect = enclosingIntRect(box->absoluteClippedOverflowRect());
    286             visibleWindowRect = box->frame()->view()->contentsToWindow(visibleWindowRect);
    287             visibleWindowRect = m_webPage->mapToTransformed(visibleWindowRect);
    288             visibleWindowRect.intersect(recursiveClippingRect);
    289 
    290             curr->setVisibleWindowRect(visibleWindowRect);
    291             recursiveClippingRect = visibleWindowRect;
     291    for (int i = m_activeInRegionScrollableAreas.size() - 1; i >= 0; --i) {
     292        InRegionScrollableArea* scrollable = static_cast<InRegionScrollableArea*>(m_activeInRegionScrollableAreas[i]);
     293        scrollable->setVisibleWindowRect(clipToRect(recursiveClippingRect, scrollable));
     294        recursiveClippingRect = scrollable->visibleWindowRect();
     295    }
     296}
     297
     298Platform::ScrollViewBase* InRegionScrollerPrivate::firstScrollableInRegionForNode(const Node* node)
     299{
     300    if (!node || !node->renderer())
     301        return 0;
     302
     303    RenderLayer* layer = node->renderer()->enclosingLayer();
     304    if (!layer)
     305        return 0;
     306    do {
     307        RenderObject* renderer = layer->renderer();
     308
     309        if (renderer->isRenderView()) {
     310            if (RenderView* renderView = toRenderView(renderer)) {
     311                FrameView* view = renderView->frameView();
     312                if (!view) {
     313                    reset();
     314                    return 0;
     315                }
     316
     317                if (!renderView->compositor()->scrollLayer())
     318                    continue;
     319
     320                if (canScrollInnerFrame(view->frame()))
     321                    return clipAndCreateInRegionScrollableArea(layer);
     322            }
     323        } else if (canScrollRenderBox(layer->renderBox()))
     324            return clipAndCreateInRegionScrollableArea(layer);
     325
     326        // If we run into a fix positioned layer, set the last scrollable in-region object
     327        // as not able to propagate scroll to its parent scrollable.
     328        if (isNonRenderViewFixedPositionedContainer(layer) && m_activeInRegionScrollableAreas.size()) {
     329            Platform::ScrollViewBase* end = m_activeInRegionScrollableAreas.back();
     330            end->setCanPropagateScrollingToEnclosingScrollable(false);
    292331        }
    293     }
     332
     333    } while (layer = parentLayer(layer));
     334    return 0;
     335}
     336
     337Platform::ScrollViewBase* InRegionScrollerPrivate::clipAndCreateInRegionScrollableArea(RenderLayer* layer)
     338{
     339    WebCore::IntRect recursiveClippingRect(WebCore::IntPoint::zero(), m_webPage->transformedViewportSize());
     340    InRegionScrollableArea* scrollable = new InRegionScrollableArea(m_webPage, layer);
     341    scrollable->setVisibleWindowRect(clipToRect(recursiveClippingRect, scrollable));
     342    return scrollable;
    294343}
    295344
  • trunk/Source/WebKit/blackberry/Api/InRegionScroller.h

    r137908 r145415  
    3232class TouchEventHandler;
    3333class WebPagePrivate;
     34class SelectionHandler;
    3435
    3536class BLACKBERRY_EXPORT InRegionScroller {
     
    4546    friend class WebPagePrivate;
    4647    friend class TouchEventHandler;
     48    friend class SelectionHandler;
    4749    InRegionScrollerPrivate *d;
    4850    DISABLE_COPY(InRegionScroller)
  • trunk/Source/WebKit/blackberry/Api/InRegionScroller_p.h

    r137532 r145415  
    5454    void calculateInRegionScrollableAreasForPoint(const WebCore::IntPoint&);
    5555    const std::vector<Platform::ScrollViewBase*>& activeInRegionScrollableAreas() const;
     56    Platform::ScrollViewBase* firstScrollableInRegionForNode(const WebCore::Node*);
    5657
    5758    void clearDocumentData(const WebCore::Document*);
     
    7071
    7172    void adjustScrollDelta(const WebCore::IntPoint& maxOffset, const WebCore::IntPoint& currentOffset, WebCore::IntSize& delta) const;
     73    Platform::ScrollViewBase* clipAndCreateInRegionScrollableArea(WebCore::RenderLayer*);
    7274
    7375    bool isValidScrollableLayerWebKitThread(WebCore::LayerWebKitThread*) const;
    7476    bool isValidScrollableNode(WebCore::Node*) const;
     77    WebCore::IntRect clipToRect(const WebCore::IntRect&, InRegionScrollableArea*);
    7578    std::vector<Platform::ScrollViewBase*> m_activeInRegionScrollableAreas;
    7679};
  • trunk/Source/WebKit/blackberry/ChangeLog

    r145396 r145415  
     12013-03-11  Genevieve Mak  <gmak@rim.com>
     2
     3        [BlackBerry] Add a method to find the ScrollView for a text selection.
     4        https://bugs.webkit.org/show_bug.cgi?id=112061
     5
     6        Reviewed by Rob Buis.
     7
     8        Internally reviewed by Mike Fenton and Jakob Petsovits.
     9        PR #278490
     10
     11        Refactor the code in InRegionScroller so that we can add a method to find
     12        the InRegionScrollableArea for a text selection.
     13
     14        * Api/InRegionScroller.cpp:
     15        (BlackBerry::WebKit::InRegionScrollerPrivate::clipToRect):
     16            - Pull out recursive clipping code into its own function.
     17        (WebKit):
     18        (BlackBerry::WebKit::InRegionScrollerPrivate::calculateInRegionScrollableAreasForPoint):
     19        (BlackBerry::WebKit::InRegionScrollerPrivate::firstScrollableInRegionForNode):
     20            - This new method allows us to get just the first scrollable region instead of looking
     21              for more nested ones. We may want to refactor in the future because some of the code is
     22              very similar to calculateInRegionScrollableAreasForPoint.
     23        (BlackBerry::WebKit::InRegionScrollerPrivate::clipAndCreateInRegionScrollableArea):
     24            - Add a convenience method for the previous function
     25        * Api/InRegionScroller.h:
     26        (WebKit):
     27        * Api/InRegionScroller_p.h:
     28        (InRegionScrollerPrivate):
     29
    1302013-03-11  Genevieve Mak  <gmak@rim.com>
    231
Note: See TracChangeset for help on using the changeset viewer.