Changeset 108937 in webkit


Ignore:
Timestamp:
Feb 26, 2012 5:04:20 PM (12 years ago)
Author:
jamesr@google.com
Message:

[chromium] Wire up shouldUpdateScrollPositionOnMainThread and nonFastScrollableRegion to compositor
https://bugs.webkit.org/show_bug.cgi?id=79155

Reviewed by Adam Barth.

Source/WebCore:

This hooks up ScrollingCoordinator::setNonFastScrollableRegion() and
ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread() to the chromium compositor
implementation and implements them on the impl thread.

New compositor behavior is covered by unit tests in LayerChromiumTests and CCLayerTreeHostImplTests. The rest is
just glue code.

  • page/scrolling/chromium/ScrollingCoordinatorChromium.cpp:

(WebCore::ScrollingCoordinator::setNonFastScrollableRegion):
(WebCore::ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread):

  • platform/graphics/chromium/LayerChromium.cpp:

(WebCore::LayerChromium::LayerChromium):
(WebCore::LayerChromium::setShouldScrollOnMainThread):
(WebCore):
(WebCore::LayerChromium::setNonFastScrollableRegion):
(WebCore::LayerChromium::pushPropertiesTo):

  • platform/graphics/chromium/LayerChromium.h:

(WebCore):
(LayerChromium):

  • platform/graphics/chromium/cc/CCLayerImpl.cpp:

(WebCore::CCLayerImpl::CCLayerImpl):

  • platform/graphics/chromium/cc/CCLayerImpl.h:

(WebCore::CCLayerImpl::shouldScrollOnMainThread):
(WebCore::CCLayerImpl::setShouldScrollOnMainThread):
(CCLayerImpl):
(WebCore::CCLayerImpl::nonFastScrollableRegion):
(WebCore::CCLayerImpl::setNonFastScrollableRegion):

  • platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:

(WebCore::CCLayerTreeHostImpl::scrollBegin):

Source/WebKit/chromium:

Add new tests for shouldScrollOnMainThread and nonFastScrollableRegion properties.

  • tests/CCLayerTreeHostImplTest.cpp:

(WebKit::TEST_F):
(WebKit):

  • tests/LayerChromiumTest.cpp:
Location:
trunk/Source
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r108936 r108937  
     12012-02-26  James Robinson  <jamesr@chromium.org>
     2
     3        [chromium] Wire up shouldUpdateScrollPositionOnMainThread and nonFastScrollableRegion to compositor
     4        https://bugs.webkit.org/show_bug.cgi?id=79155
     5
     6        Reviewed by Adam Barth.
     7
     8        This hooks up ScrollingCoordinator::setNonFastScrollableRegion() and
     9        ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread() to the chromium compositor
     10        implementation and implements them on the impl thread.
     11
     12        New compositor behavior is covered by unit tests in LayerChromiumTests and CCLayerTreeHostImplTests. The rest is
     13        just glue code.
     14
     15        * page/scrolling/chromium/ScrollingCoordinatorChromium.cpp:
     16        (WebCore::ScrollingCoordinator::setNonFastScrollableRegion):
     17        (WebCore::ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread):
     18        * platform/graphics/chromium/LayerChromium.cpp:
     19        (WebCore::LayerChromium::LayerChromium):
     20        (WebCore::LayerChromium::setShouldScrollOnMainThread):
     21        (WebCore):
     22        (WebCore::LayerChromium::setNonFastScrollableRegion):
     23        (WebCore::LayerChromium::pushPropertiesTo):
     24        * platform/graphics/chromium/LayerChromium.h:
     25        (WebCore):
     26        (LayerChromium):
     27        * platform/graphics/chromium/cc/CCLayerImpl.cpp:
     28        (WebCore::CCLayerImpl::CCLayerImpl):
     29        * platform/graphics/chromium/cc/CCLayerImpl.h:
     30        (WebCore::CCLayerImpl::shouldScrollOnMainThread):
     31        (WebCore::CCLayerImpl::setShouldScrollOnMainThread):
     32        (CCLayerImpl):
     33        (WebCore::CCLayerImpl::nonFastScrollableRegion):
     34        (WebCore::CCLayerImpl::setNonFastScrollableRegion):
     35        * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
     36        (WebCore::CCLayerTreeHostImpl::scrollBegin):
     37
    1382012-02-26  Kentaro Hara  <haraken@chromium.org>
    239
  • trunk/Source/WebCore/page/scrolling/chromium/ScrollingCoordinatorChromium.cpp

    r108698 r108937  
    7474}
    7575
    76 void ScrollingCoordinator::setNonFastScrollableRegion(const Region&)
     76void ScrollingCoordinator::setNonFastScrollableRegion(const Region& region)
    7777{
    78     // FIXME: Implement!
     78    if (LayerChromium* layer = m_private->scrollLayer())
     79        layer->setNonFastScrollableRegion(region);
    7980}
    8081
     
    9495void ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread(bool should)
    9596{
    96     // FIXME: Implement!
     97    if (LayerChromium* layer = m_private->scrollLayer())
     98        layer->setShouldScrollOnMainThread(should);
    9799}
    98100
  • trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.cpp

    r108886 r108937  
    4343#include "PlatformContextSkia.h"
    4444#endif
    45 #include "Region.h"
    4645#include "RenderLayerBacking.h"
    4746#include "TextStream.h"
     
    6564    , m_layerAnimationController(CCLayerAnimationController::create())
    6665    , m_scrollable(false)
     66    , m_shouldScrollOnMainThread(false)
    6767    , m_haveWheelEventHandlers(false)
     68    , m_nonFastScrollableRegionChanged(false)
    6869    , m_anchorPoint(0.5, 0.5)
    6970    , m_backgroundColor(0, 0, 0, 0)
     
    441442}
    442443
     444void LayerChromium::setShouldScrollOnMainThread(bool shouldScrollOnMainThread)
     445{
     446    if (m_shouldScrollOnMainThread == shouldScrollOnMainThread)
     447        return;
     448    m_shouldScrollOnMainThread = shouldScrollOnMainThread;
     449    setNeedsCommit();
     450}
     451
    443452void LayerChromium::setHaveWheelEventHandlers(bool haveWheelEventHandlers)
    444453{
     
    446455        return;
    447456    m_haveWheelEventHandlers = haveWheelEventHandlers;
     457    setNeedsCommit();
     458}
     459
     460void LayerChromium::setNonFastScrollableRegion(const Region& region)
     461{
     462    if (m_nonFastScrollableRegion == region)
     463        return;
     464    m_nonFastScrollableRegion = region;
     465    m_nonFastScrollableRegionChanged = true;
    448466    setNeedsCommit();
    449467}
     
    503521    layer->setMasksToBounds(m_masksToBounds);
    504522    layer->setScrollable(m_scrollable);
     523    layer->setShouldScrollOnMainThread(m_shouldScrollOnMainThread);
    505524    layer->setHaveWheelEventHandlers(m_haveWheelEventHandlers);
     525    // Copying a Region is more expensive than most layer properties, since it involves copying two Vectors that may be
     526    // arbitrarily large depending on page content, so we only push the property if it's changed.
     527    if (m_nonFastScrollableRegionChanged) {
     528        layer->setNonFastScrollableRegion(m_nonFastScrollableRegion);
     529        m_nonFastScrollableRegionChanged = false;
     530    }
    506531    layer->setName(m_name);
    507532    layer->setOpaque(m_opaque);
  • trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.h

    r108886 r108937  
    4040#include "PlatformString.h"
    4141#include "ProgramBinding.h"
     42#include "Region.h"
    4243#include "RenderSurfaceChromium.h"
    4344#include "ShaderChromium.h"
     
    6162class CCTextureUpdater;
    6263class GraphicsContext3D;
    63 class Region;
    6464
    6565// Base class for composited layers. Special layer types are derived from
     
    135135
    136136    void setScrollable(bool);
     137    void setShouldScrollOnMainThread(bool);
    137138    void setHaveWheelEventHandlers(bool);
     139    void setNonFastScrollableRegion(const Region&);
    138140
    139141    IntSize scrollDelta() const { return IntSize(); }
     
    285287    IntPoint m_scrollPosition;
    286288    bool m_scrollable;
     289    bool m_shouldScrollOnMainThread;
    287290    bool m_haveWheelEventHandlers;
     291    Region m_nonFastScrollableRegion;
     292    bool m_nonFastScrollableRegionChanged;
    288293    FloatPoint m_position;
    289294    FloatPoint m_anchorPoint;
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.cpp

    r108886 r108937  
    4949    , m_anchorPointZ(0)
    5050    , m_scrollable(false)
     51    , m_shouldScrollOnMainThread(false)
    5152    , m_haveWheelEventHandlers(false)
    5253    , m_backgroundCoversViewport(false)
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h

    r108886 r108937  
    3131#include "FloatRect.h"
    3232#include "IntRect.h"
     33#include "Region.h"
    3334#include "TextStream.h"
    3435#include "TransformationMatrix.h"
     
    182183    void setScrollable(bool scrollable) { m_scrollable = scrollable; }
    183184
     185    bool shouldScrollOnMainThread() const { return m_shouldScrollOnMainThread; }
     186    void setShouldScrollOnMainThread(bool shouldScrollOnMainThread) { m_shouldScrollOnMainThread = shouldScrollOnMainThread; }
     187
    184188    bool haveWheelEventHandlers() const { return m_haveWheelEventHandlers; }
    185189    void setHaveWheelEventHandlers(bool haveWheelEventHandlers) { m_haveWheelEventHandlers = haveWheelEventHandlers; }
     190
     191    const Region& nonFastScrollableRegion() const { return m_nonFastScrollableRegion; }
     192    void setNonFastScrollableRegion(const Region& region) { m_nonFastScrollableRegion = region; }
    186193
    187194    const IntRect& visibleLayerRect() const { return m_visibleLayerRect; }
     
    252259    IntPoint m_scrollPosition;
    253260    bool m_scrollable;
     261    bool m_shouldScrollOnMainThread;
    254262    bool m_haveWheelEventHandlers;
     263    Region m_nonFastScrollableRegion;
    255264    Color m_backgroundColor;
    256265    bool m_backgroundCoversViewport;
  • trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp

    r108886 r108937  
    489489}
    490490
    491 CCInputHandlerClient::ScrollStatus CCLayerTreeHostImpl::scrollBegin(const IntPoint& point, CCInputHandlerClient::ScrollInputType type)
     491CCInputHandlerClient::ScrollStatus CCLayerTreeHostImpl::scrollBegin(const IntPoint& viewportPoint, CCInputHandlerClient::ScrollInputType type)
    492492{
    493493    // TODO: Check for scrollable sublayers.
     
    495495        TRACE_EVENT("scrollBegin Ignored no scrollable", this, 0);
    496496        return ScrollIgnored;
     497    }
     498
     499    if (m_scrollLayerImpl->shouldScrollOnMainThread()) {
     500        TRACE_EVENT("scrollBegin Failed shouldScrollOnMainThread", this, 0);
     501        return ScrollFailed;
     502    }
     503
     504    IntPoint scrollLayerContentPoint(m_scrollLayerImpl->screenSpaceTransform().inverse().mapPoint(viewportPoint));
     505    if (m_scrollLayerImpl->nonFastScrollableRegion().contains(scrollLayerContentPoint)) {
     506        TRACE_EVENT("scrollBegin Failed nonFastScrollableRegion", this, 0);
     507        return ScrollFailed;
    497508    }
    498509
  • trunk/Source/WebKit/chromium/ChangeLog

    r108902 r108937  
     12012-02-26  James Robinson  <jamesr@chromium.org>
     2
     3        [chromium] Wire up shouldUpdateScrollPositionOnMainThread and nonFastScrollableRegion to compositor
     4        https://bugs.webkit.org/show_bug.cgi?id=79155
     5
     6        Reviewed by Adam Barth.
     7
     8        Add new tests for shouldScrollOnMainThread and nonFastScrollableRegion properties.
     9
     10        * tests/CCLayerTreeHostImplTest.cpp:
     11        (WebKit::TEST_F):
     12        (WebKit):
     13        * tests/LayerChromiumTest.cpp:
     14
    1152012-02-25  Adrienne Walker  <enne@google.com>
    216
  • trunk/Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp

    r108886 r108937  
    206206}
    207207
     208TEST_F(CCLayerTreeHostImplTest, shouldScrollOnMainThread)
     209{
     210    RefPtr<CCLayerImpl> root = CCLayerImpl::create(0);
     211    root->setScrollable(true);
     212    root->setScrollPosition(IntPoint(0, 0));
     213    root->setMaxScrollPosition(IntSize(100, 100));
     214    m_hostImpl->setRootLayer(root);
     215    root->setShouldScrollOnMainThread(true);
     216    EXPECT_EQ(m_hostImpl->scrollBegin(IntPoint(0, 0), CCInputHandlerClient::Wheel), CCInputHandlerClient::ScrollFailed);
     217    EXPECT_EQ(m_hostImpl->scrollBegin(IntPoint(0, 0), CCInputHandlerClient::Gesture), CCInputHandlerClient::ScrollFailed);
     218}
     219
     220TEST_F(CCLayerTreeHostImplTest, nonFastScrollableRegionBasic)
     221{
     222    RefPtr<CCLayerImpl> root = CCLayerImpl::create(0);
     223    root->setScrollable(true);
     224    root->setScrollPosition(IntPoint(0, 0));
     225    root->setMaxScrollPosition(IntSize(100, 100));
     226    m_hostImpl->setRootLayer(root);
     227    root->setNonFastScrollableRegion(IntRect(0, 0, 50, 50));
     228    // All scroll types inside the non-fast scrollable region should fail.
     229    EXPECT_EQ(m_hostImpl->scrollBegin(IntPoint(25, 25), CCInputHandlerClient::Wheel), CCInputHandlerClient::ScrollFailed);
     230    EXPECT_EQ(m_hostImpl->scrollBegin(IntPoint(25, 25), CCInputHandlerClient::Gesture), CCInputHandlerClient::ScrollFailed);
     231
     232    // All scroll types outside this region should succeed.
     233    EXPECT_EQ(m_hostImpl->scrollBegin(IntPoint(75, 75), CCInputHandlerClient::Wheel), CCInputHandlerClient::ScrollStarted);
     234    m_hostImpl->scrollBy(IntSize(0, 10));
     235    m_hostImpl->scrollEnd();
     236    EXPECT_EQ(m_hostImpl->scrollBegin(IntPoint(75, 75), CCInputHandlerClient::Gesture), CCInputHandlerClient::ScrollStarted);
     237    m_hostImpl->scrollBy(IntSize(0, 10));
     238    m_hostImpl->scrollEnd();
     239}
     240
     241TEST_F(CCLayerTreeHostImplTest, nonFastScrollableRegionWithOffset)
     242{
     243    GraphicsContext3D::Attributes attrs;
     244    RefPtr<GraphicsContext3D> context = GraphicsContext3DPrivate::createGraphicsContextFromWebContext(adoptPtr(new FakeWebGraphicsContext3D()), attrs, 0, GraphicsContext3D::RenderDirectlyToHostWindow, GraphicsContext3DPrivate::ForUseOnThisThread);
     245    m_hostImpl->initializeLayerRenderer(context);
     246
     247    RefPtr<CCLayerImpl> root = CCLayerImpl::create(0);
     248    root->setScrollable(true);
     249    root->setScrollPosition(IntPoint(0, 0));
     250    root->setMaxScrollPosition(IntSize(100, 100));
     251    m_hostImpl->setRootLayer(root);
     252    root->setNonFastScrollableRegion(IntRect(0, 0, 50, 50));
     253    root->setPosition(FloatPoint(-25, 0));
     254    m_hostImpl->drawLayers(); // Update draw transforms so we can correctly map points into layer space.
     255
     256    // This point would fall into the non-fast scrollable region except that we've moved the layer down by 25 pixels.
     257    EXPECT_EQ(m_hostImpl->scrollBegin(IntPoint(40, 10), CCInputHandlerClient::Wheel), CCInputHandlerClient::ScrollStarted);
     258    m_hostImpl->scrollBy(IntSize(0, 1));
     259    m_hostImpl->scrollEnd();
     260
     261    // This point is still inside the non-fast region.
     262    EXPECT_EQ(m_hostImpl->scrollBegin(IntPoint(10, 10), CCInputHandlerClient::Wheel), CCInputHandlerClient::ScrollFailed);
     263}
     264
    208265TEST_F(CCLayerTreeHostImplTest, pinchGesture)
    209266{
  • trunk/Source/WebKit/chromium/tests/LayerChromiumTest.cpp

    r108698 r108937  
    516516    EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setSublayerTransform(TransformationMatrix(0, 0, 0, 0, 0, 0)));
    517517    EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setScrollable(true));
     518    EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setShouldScrollOnMainThread(true));
     519    EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setNonFastScrollableRegion(Region(IntRect(1, 1, 2, 2))));
    518520    EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setHaveWheelEventHandlers(true));
    519521    EXECUTE_AND_VERIFY_SET_NEEDS_COMMIT_BEHAVIOR(1, testLayer->setScrollPosition(IntPoint(10, 10)));
Note: See TracChangeset for help on using the changeset viewer.