[chromium] Write unit tests for compositor-thread zooming
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 21 Jan 2012 03:19:11 +0000 (03:19 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sat, 21 Jan 2012 03:19:11 +0000 (03:19 +0000)
https://bugs.webkit.org/show_bug.cgi?id=71529

Patch by Alexandre Elias <aelias@google.com> on 2012-01-20
Reviewed by James Robinson.

Add unit tests for pinch zoom and page scale animation.  Includes
small cleanups in CCLayerTreeHostImpl for testability.

Source/WebCore:

* platform/graphics/chromium/cc/CCInputHandler.h:
* platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
(WebCore::CCLayerTreeHostImpl::startPageScaleAnimation):
(WebCore::CCLayerTreeHostImpl::setViewportSize):
* platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:

Source/WebKit/chromium:

* tests/CCLayerTreeHostImplTest.cpp:
(WebKit::CCLayerTreeHostImplTest::setupScrollAndContentsLayers):
(WebKit::TEST_F):

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@105566 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/graphics/chromium/cc/CCInputHandler.h
Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp
Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/tests/CCLayerTreeHostImplTest.cpp

index 1772b75..7297fcb 100644 (file)
@@ -1,3 +1,19 @@
+2012-01-20  Alexandre Elias  <aelias@google.com>
+
+        [chromium] Write unit tests for compositor-thread zooming
+        https://bugs.webkit.org/show_bug.cgi?id=71529
+
+        Reviewed by James Robinson.
+
+        Add unit tests for pinch zoom and page scale animation.  Includes
+        small cleanups in CCLayerTreeHostImpl for testability.
+
+        * platform/graphics/chromium/cc/CCInputHandler.h:
+        * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
+        (WebCore::CCLayerTreeHostImpl::startPageScaleAnimation):
+        (WebCore::CCLayerTreeHostImpl::setViewportSize):
+        * platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:
+
 2012-01-20  David Reveman  <reveman@chromium.org>
 
         [Chromium] Incremental texture updates are not atomic.
index 1c25fb1..057d79b 100644 (file)
@@ -43,7 +43,6 @@ class IntSize;
 class CCInputHandlerClient {
     WTF_MAKE_NONCOPYABLE(CCInputHandlerClient);
 public:
-    virtual double currentTimeMs() const = 0;
     virtual void setNeedsRedraw() = 0;
 
     enum ScrollStatus { ScrollFailed, ScrollStarted, ScrollIgnored };
@@ -73,6 +72,7 @@ public:
     virtual void startPageScaleAnimation(const IntSize& targetPosition,
                                          bool anchorPoint,
                                          float pageScale,
+                                         double startTimeMs,
                                          double durationMs) = 0;
 
 protected:
index 02186ca..6c2c742 100644 (file)
@@ -114,7 +114,7 @@ void CCLayerTreeHostImpl::animate(double frameBeginTimeMs)
     }
 }
 
-void CCLayerTreeHostImpl::startPageScaleAnimation(const IntSize& targetPosition, bool anchorPoint, float pageScale, double durationMs)
+void CCLayerTreeHostImpl::startPageScaleAnimation(const IntSize& targetPosition, bool anchorPoint, float pageScale, double startTimeMs, double durationMs)
 {
     if (!m_scrollLayerImpl)
         return;
@@ -125,7 +125,7 @@ void CCLayerTreeHostImpl::startPageScaleAnimation(const IntSize& targetPosition,
     IntSize scaledContentSize = m_scrollLayerImpl->children()[0]->contentBounds();
     scaledContentSize.scale(m_pageScaleDelta);
 
-    m_pageScaleAnimation = CCPageScaleAnimation::create(scrollTotal, scaleTotal, m_viewportSize, scaledContentSize, currentTimeMs());
+    m_pageScaleAnimation = CCPageScaleAnimation::create(scrollTotal, scaleTotal, m_viewportSize, scaledContentSize, startTimeMs);
 
     if (anchorPoint) {
         IntSize windowAnchor(targetPosition);
@@ -368,7 +368,9 @@ void CCLayerTreeHostImpl::setViewportSize(const IntSize& viewportSize)
 
     m_viewportSize = viewportSize;
     updateMaxScrollPosition();
-    m_layerRenderer->viewportChanged();
+
+    if (m_layerRenderer)
+        m_layerRenderer->viewportChanged();
 }
 
 void CCLayerTreeHostImpl::setPageScaleFactorAndLimits(float pageScale, float minPageScale, float maxPageScale)
@@ -450,11 +452,6 @@ void CCLayerTreeHostImpl::updateMaxScrollPosition()
     // TODO(aelias): Also update sublayers.
 }
 
-double CCLayerTreeHostImpl::currentTimeMs() const
-{
-    return monotonicallyIncreasingTime() * 1000.0;
-}
-
 void CCLayerTreeHostImpl::setNeedsRedraw()
 {
     m_client->setNeedsRedrawOnImplThread();
index e4d006d..deba6c8 100644 (file)
@@ -62,7 +62,6 @@ public:
     virtual ~CCLayerTreeHostImpl();
 
     // CCInputHandlerTarget implementation
-    virtual double currentTimeMs() const;
     virtual void setNeedsRedraw();
     virtual CCInputHandlerClient::ScrollStatus scrollBegin(const IntPoint&);
     virtual void scrollBy(const IntSize&);
@@ -113,7 +112,7 @@ public:
     void setPageScaleFactorAndLimits(float pageScale, float minPageScale, float maxPageScale);
     float pageScale() const { return m_pageScale; }
 
-    void startPageScaleAnimation(const IntSize& targetPosition, bool anchorPoint, float pageScale, double durationMs);
+    void startPageScaleAnimation(const IntSize& targetPosition, bool anchorPoint, float pageScale, double startTimeMs, double durationMs);
 
     const CCSettings& settings() const { return m_settings; }
 
index 9dca3c6..02539ad 100644 (file)
@@ -1,3 +1,17 @@
+2012-01-20  Alexandre Elias  <aelias@google.com>
+
+        [chromium] Write unit tests for compositor-thread zooming
+        https://bugs.webkit.org/show_bug.cgi?id=71529
+
+        Reviewed by James Robinson.
+
+        Add unit tests for pinch zoom and page scale animation.  Includes
+        small cleanups in CCLayerTreeHostImpl for testability.
+
+        * tests/CCLayerTreeHostImplTest.cpp:
+        (WebKit::CCLayerTreeHostImplTest::setupScrollAndContentsLayers):
+        (WebKit::TEST_F):
+
 2012-01-20  David Reveman  <reveman@chromium.org>
 
         [Chromium] Incremental texture updates are not atomic.
index 5227892..8683b84 100644 (file)
@@ -74,6 +74,20 @@ public:
         ASSERT_EQ(timesEncountered, 1);
     }
 
+    void setupScrollAndContentsLayers(const IntSize& contentSize)
+    {
+        RefPtr<CCLayerImpl> root = CCLayerImpl::create(0);
+        root->setScrollable(true);
+        root->setScrollPosition(IntPoint(0, 0));
+        root->setMaxScrollPosition(contentSize);
+        RefPtr<CCLayerImpl> contents = CCLayerImpl::create(1);
+        contents->setDrawsContent(true);
+        contents->setBounds(contentSize);
+        contents->setContentBounds(contentSize);
+        root->addChild(contents);
+        m_hostImpl->setRootLayer(root);
+    }
+
 protected:
     DebugScopedSetImplThread m_alwaysImplThread;
     OwnPtr<CCLayerTreeHostImpl> m_hostImpl;
@@ -156,6 +170,112 @@ TEST_F(CCLayerTreeHostImplTest, scrollRootCallsCommitAndRedraw)
     EXPECT_TRUE(m_didRequestCommit);
 }
 
+TEST_F(CCLayerTreeHostImplTest, pinchGesture)
+{
+    setupScrollAndContentsLayers(IntSize(100, 100));
+    m_hostImpl->setViewportSize(IntSize(50, 50));
+
+    CCLayerImpl* scrollLayer = m_hostImpl->scrollLayer();
+    ASSERT(scrollLayer);
+
+    const float minPageScale = 0.5, maxPageScale = 4;
+
+    // Basic pinch zoom in gesture
+    {
+        m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
+        scrollLayer->setPageScaleDelta(1);
+
+        float pageScaleDelta = 2;
+        m_hostImpl->pinchGestureBegin();
+        m_hostImpl->pinchGestureUpdate(pageScaleDelta, IntPoint(50, 50));
+        m_hostImpl->pinchGestureEnd();
+        EXPECT_TRUE(m_didRequestRedraw);
+        EXPECT_TRUE(m_didRequestCommit);
+
+        OwnPtr<CCScrollAndScaleSet> scrollInfo = m_hostImpl->processScrollDeltas();
+        EXPECT_EQ(scrollInfo->pageScaleDelta, pageScaleDelta);
+    }
+
+    // Zoom-in clamping
+    {
+        m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
+        scrollLayer->setPageScaleDelta(1);
+        float pageScaleDelta = 10;
+
+        m_hostImpl->pinchGestureBegin();
+        m_hostImpl->pinchGestureUpdate(pageScaleDelta, IntPoint(50, 50));
+        m_hostImpl->pinchGestureEnd();
+
+        OwnPtr<CCScrollAndScaleSet> scrollInfo = m_hostImpl->processScrollDeltas();
+        EXPECT_EQ(scrollInfo->pageScaleDelta, maxPageScale);
+    }
+
+    // Zoom-out clamping
+    {
+        m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
+        scrollLayer->setPageScaleDelta(1);
+        scrollLayer->setScrollPosition(IntPoint(50, 50));
+
+        float pageScaleDelta = 0.1;
+        m_hostImpl->pinchGestureBegin();
+        m_hostImpl->pinchGestureUpdate(pageScaleDelta, IntPoint(0, 0));
+        m_hostImpl->pinchGestureEnd();
+
+        OwnPtr<CCScrollAndScaleSet> scrollInfo = m_hostImpl->processScrollDeltas();
+        EXPECT_EQ(scrollInfo->pageScaleDelta, minPageScale);
+
+        // Pushed to (0,0) via clamping against contents layer size.
+        expectContains(*scrollInfo.get(), scrollLayer->id(), IntSize(-50, -50));
+    }
+}
+
+TEST_F(CCLayerTreeHostImplTest, pageScaleAnimation)
+{
+    setupScrollAndContentsLayers(IntSize(100, 100));
+    m_hostImpl->setViewportSize(IntSize(50, 50));
+
+    CCLayerImpl* scrollLayer = m_hostImpl->scrollLayer();
+    ASSERT(scrollLayer);
+
+    const float minPageScale = 0.5, maxPageScale = 4;
+    const double startTimeMs = 1000;
+    const double durationMs = 100;
+
+    // Non-anchor zoom-in
+    {
+        m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
+        scrollLayer->setPageScaleDelta(1);
+        scrollLayer->setScrollPosition(IntPoint(50, 50));
+
+        m_hostImpl->startPageScaleAnimation(IntSize(0, 0), false, 2, startTimeMs, durationMs);
+        m_hostImpl->animate(startTimeMs + durationMs / 2);
+        EXPECT_TRUE(m_didRequestRedraw);
+        m_hostImpl->animate(startTimeMs + durationMs);
+        EXPECT_TRUE(m_didRequestCommit);
+
+        OwnPtr<CCScrollAndScaleSet> scrollInfo = m_hostImpl->processScrollDeltas();
+        EXPECT_EQ(scrollInfo->pageScaleDelta, 2);
+        expectContains(*scrollInfo.get(), scrollLayer->id(), IntSize(-50, -50));
+    }
+
+    // Anchor zoom-out
+    {
+        m_hostImpl->setPageScaleFactorAndLimits(1, minPageScale, maxPageScale);
+        scrollLayer->setPageScaleDelta(1);
+        scrollLayer->setScrollPosition(IntPoint(50, 50));
+
+        m_hostImpl->startPageScaleAnimation(IntSize(25, 25), true, minPageScale, startTimeMs, durationMs);
+        m_hostImpl->animate(startTimeMs + durationMs);
+        EXPECT_TRUE(m_didRequestRedraw);
+        EXPECT_TRUE(m_didRequestCommit);
+
+        OwnPtr<CCScrollAndScaleSet> scrollInfo = m_hostImpl->processScrollDeltas();
+        EXPECT_EQ(scrollInfo->pageScaleDelta, minPageScale);
+        // Pushed to (0,0) via clamping against contents layer size.
+        expectContains(*scrollInfo.get(), scrollLayer->id(), IntSize(-50, -50));
+    }
+}
+
 class BlendStateTrackerContext: public FakeWebGraphicsContext3D {
 public:
     BlendStateTrackerContext() : m_blend(false) { }