Diff
Modified: trunk/Source/WebCore/ChangeLog (100507 => 100508)
--- trunk/Source/WebCore/ChangeLog 2011-11-16 22:34:41 UTC (rev 100507)
+++ trunk/Source/WebCore/ChangeLog 2011-11-16 22:37:55 UTC (rev 100508)
@@ -1,3 +1,36 @@
+2011-11-16 Alexandre Elias <ael...@google.com>
+
+ [chromium] Improvements for page scale delta during commit
+ https://bugs.webkit.org/show_bug.cgi?id=72471
+
+ Reviewed by James Robinson.
+
+ Page scale now follows the same commit flow as scroll position:
+ the delta is folded into m_pageScale at BFAC time, and a "sent" value
+ is preserved for temporary use until the commit finishes.
+
+ I also merged setPageScaleFactor and setPageScaleFactorLimits into one
+ function on the impl side. The reason is that setPageFactor must
+ be applied after the limits are updated, but on the other hand setting
+ the limits first may cause an unnecessary clamp of the scale delta.
+ Merging the methods avoids this bind.
+
+ No new tests. (planning to add later: https://bugs.webkit.org/show_bug.cgi?id=71529)
+
+ * platform/graphics/chromium/cc/CCLayerTreeHost.cpp:
+ (WebCore::CCLayerTreeHost::finishCommitOnImplThread):
+ (WebCore::CCLayerTreeHost::applyScrollAndScale):
+ * platform/graphics/chromium/cc/CCLayerTreeHostCommon.h:
+ * platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp:
+ (WebCore::CCLayerTreeHostImpl::CCLayerTreeHostImpl):
+ (WebCore::CCLayerTreeHostImpl::setPageScaleFactorAndLimits):
+ (WebCore::CCLayerTreeHostImpl::adjustScrollsForPageScaleChange):
+ (WebCore::CCLayerTreeHostImpl::setScaleDelta):
+ (WebCore::CCLayerTreeHostImpl::applyScaleDeltaToScrollLayer):
+ (WebCore::CCLayerTreeHostImpl::scrollRootLayer):
+ (WebCore::CCLayerTreeHostImpl::processScrollDeltas):
+ * platform/graphics/chromium/cc/CCLayerTreeHostImpl.h:
+
2011-11-16 Joshua Bell <jsb...@chromium.org>
IndexedDB: Reduce nested key depth threshold, re-enable flaky test
Modified: trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.h (100507 => 100508)
--- trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.h 2011-11-16 22:34:41 UTC (rev 100507)
+++ trunk/Source/WebCore/platform/graphics/chromium/LayerChromium.h 2011-11-16 22:37:55 UTC (rev 100508)
@@ -138,7 +138,7 @@
IntSize scrollDelta() const { return IntSize(); }
- float scaleDelta() const { return 1; }
+ float pageScaleDelta() const { return 1; }
bool doubleSided() const { return m_doubleSided; }
void setDoubleSided(bool doubleSided) { m_doubleSided = doubleSided; setNeedsCommit(); }
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.cpp (100507 => 100508)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.cpp 2011-11-16 22:34:41 UTC (rev 100507)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.cpp 2011-11-16 22:37:55 UTC (rev 100508)
@@ -52,7 +52,7 @@
, m_usesLayerClipping(false)
, m_isNonCompositedContent(false)
, m_drawsContent(false)
- , m_scaleDelta(1)
+ , m_pageScaleDelta(1)
, m_targetRenderSurface(0)
, m_drawDepth(0)
, m_drawOpacity(0)
@@ -405,10 +405,10 @@
}
}
-void CCLayerImpl::setScaleDelta(float scaleDelta)
+void CCLayerImpl::setPageScaleDelta(float pageScaleDelta)
{
- if (m_scaleDelta != scaleDelta) {
- m_scaleDelta = scaleDelta;
+ if (m_pageScaleDelta != pageScaleDelta) {
+ m_pageScaleDelta = pageScaleDelta;
noteLayerPropertyChangedForSubtree();
}
}
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h (100507 => 100508)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h 2011-11-16 22:34:41 UTC (rev 100507)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerImpl.h 2011-11-16 22:37:55 UTC (rev 100508)
@@ -160,8 +160,8 @@
const IntSize& scrollDelta() const { return m_scrollDelta; }
void setScrollDelta(const IntSize&);
- float scaleDelta() const { return m_scaleDelta; }
- void setScaleDelta(float);
+ float pageScaleDelta() const { return m_pageScaleDelta; }
+ void setPageScaleDelta(float);
const IntSize& sentScrollDelta() const { return m_sentScrollDelta; }
void setSentScrollDelta(const IntSize& sentScrollDelta) { m_sentScrollDelta = sentScrollDelta; }
@@ -253,7 +253,7 @@
IntSize m_scrollDelta;
IntSize m_sentScrollDelta;
IntSize m_maxScrollPosition;
- float m_scaleDelta;
+ float m_pageScaleDelta;
// Properties owned exclusively by this CCLayerImpl.
// Debugging.
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp (100507 => 100508)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp 2011-11-16 22:34:41 UTC (rev 100507)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHost.cpp 2011-11-16 22:37:55 UTC (rev 100508)
@@ -131,8 +131,7 @@
hostImpl->setHaveWheelEventHandlers(m_haveWheelEventHandlers);
hostImpl->setZoomAnimatorTransform(m_zoomAnimatorTransform);
hostImpl->setViewport(viewportSize());
- hostImpl->setPageScale(pageScale());
- hostImpl->setPageScaleFactorLimits(m_minPageScale, m_maxPageScale);
+ hostImpl->setPageScaleFactorAndLimits(pageScale(), m_minPageScale, m_maxPageScale);
// Synchronize trees, if one exists at all...
if (rootLayer())
@@ -464,7 +463,7 @@
ASSERT(info.scrolls.size() == 1);
IntSize scrollDelta = info.scrolls[0].scrollDelta;
- m_client->applyScrollAndScale(scrollDelta, info.pageScale);
+ m_client->applyScrollAndScale(scrollDelta, info.pageScaleDelta);
}
void CCLayerTreeHost::startRateLimiter(GraphicsContext3D* context)
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostCommon.cpp (100507 => 100508)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostCommon.cpp 2011-11-16 22:34:41 UTC (rev 100507)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostCommon.cpp 2011-11-16 22:37:55 UTC (rev 100508)
@@ -198,13 +198,13 @@
TransformationMatrix layerLocalTransform;
// LT = Tr[origin] * M[zoomAnimator]
layerLocalTransform.multiply(layer->zoomAnimatorTransform());
- // LT = Tr[origin] * M[zoomAnimator] * S[scaleDelta]
- layerLocalTransform.scale(layer->scaleDelta());
- // LT = Tr[origin] * M[zoomAnimator] * S[scaleDelta] * Tr[origin2anchor]
+ // LT = Tr[origin] * M[zoomAnimator] * S[pageScaleDelta]
+ layerLocalTransform.scale(layer->pageScaleDelta());
+ // LT = Tr[origin] * M[zoomAnimator] * S[pageScaleDelta] * Tr[origin2anchor]
layerLocalTransform.translate3d(position.x(), position.y(), layer->anchorPointZ());
- // LT = Tr[origin] * M[zoomAnimator] * S[scaleDelta] * Tr[origin2anchor] * M[layer]
+ // LT = Tr[origin] * M[zoomAnimator] * S[pageScaleDelta] * Tr[origin2anchor] * M[layer]
layerLocalTransform.multiply(layer->transform());
- // LT = Tr[origin] * M[zoomAnimator] * S[scaleDelta] * Tr[origin2anchor] * M[layer] * Tr[anchor2center]
+ // LT = Tr[origin] * M[zoomAnimator] * S[pageScaleDelta] * Tr[origin2anchor] * M[layer] * Tr[anchor2center]
layerLocalTransform.translate3d(centerOffsetX, centerOffsetY, -layer->anchorPointZ());
TransformationMatrix combinedTransform = parentMatrix;
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostCommon.h (100507 => 100508)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostCommon.h 2011-11-16 22:34:41 UTC (rev 100507)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostCommon.h 2011-11-16 22:37:55 UTC (rev 100508)
@@ -53,7 +53,7 @@
struct CCScrollAndScaleSet {
Vector<CCLayerTreeHostCommon::ScrollUpdateInfo> scrolls;
- float pageScale;
+ float pageScaleDelta;
};
template<typename LayerType>
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp (100507 => 100508)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp 2011-11-16 22:34:41 UTC (rev 100507)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.cpp 2011-11-16 22:37:55 UTC (rev 100508)
@@ -49,7 +49,8 @@
, m_visible(true)
, m_haveWheelEventHandlers(false)
, m_pageScale(1)
- , m_scaleDelta(1)
+ , m_pageScaleDelta(1)
+ , m_sentPageScaleDelta(1)
, m_minPageScale(0)
, m_maxPageScale(0)
, m_pinchGestureActive(false)
@@ -194,27 +195,42 @@
m_layerRenderer->viewportChanged();
}
-void CCLayerTreeHostImpl::setPageScale(float pageScale)
+void CCLayerTreeHostImpl::setPageScaleFactorAndLimits(float pageScale, float minPageScale, float maxPageScale)
{
- if (!pageScale || pageScale == m_pageScale)
+ if (!pageScale)
return;
- // Maintain constant the product of m_pageScale * m_scaleDelta.
- float scaleChange = pageScale / m_pageScale;
- float oldMagnifyScale = m_pageScale * m_scaleDelta;
+ if (m_sentPageScaleDelta == 1 && pageScale == m_pageScale && minPageScale == m_minPageScale && maxPageScale == m_maxPageScale)
+ return;
+
+ m_minPageScale = minPageScale;
+ m_maxPageScale = maxPageScale;
+
+ float pageScaleChange = pageScale / m_pageScale;
m_pageScale = pageScale;
+ m_sentPageScaleDelta = 1;
- setScaleDelta(oldMagnifyScale / pageScale);
+ // Clamp delta to limits and refresh display matrix.
+ setPageScaleDelta(m_pageScaleDelta);
+ applyPageScaleDeltaToScrollLayer();
+ adjustScrollsForPageScaleChange(pageScaleChange);
+}
+
+void CCLayerTreeHostImpl::adjustScrollsForPageScaleChange(float pageScaleChange)
+{
+ if (pageScaleChange == 1)
+ return;
+
// We also need to convert impl-side scroll deltas to pageScale space.
- if (m_scrollLayerImpl && m_scrollLayerImpl->scrollable()) {
+ if (m_scrollLayerImpl) {
IntSize scrollDelta = m_scrollLayerImpl->scrollDelta();
- scrollDelta.scale(scaleChange);
+ scrollDelta.scale(pageScaleChange);
m_scrollLayerImpl->setScrollDelta(scrollDelta);
}
}
-void CCLayerTreeHostImpl::setScaleDelta(float delta)
+void CCLayerTreeHostImpl::setPageScaleDelta(float delta)
{
// Clamp to the current min/max limits.
float finalMagnifyScale = m_pageScale * delta;
@@ -223,24 +239,19 @@
else if (m_maxPageScale && finalMagnifyScale > m_maxPageScale)
delta = m_maxPageScale / m_pageScale;
- if (delta == m_scaleDelta)
+ if (delta == m_pageScaleDelta)
return;
- m_scaleDelta = delta;
+ m_pageScaleDelta = delta;
updateMaxScrollPosition();
-
- if (m_scrollLayerImpl && m_scrollLayerImpl->scrollable())
- m_scrollLayerImpl->setScaleDelta(m_scaleDelta);
+ applyPageScaleDeltaToScrollLayer();
}
-void CCLayerTreeHostImpl::setPageScaleFactorLimits(float minPageScale, float maxPageScale)
+void CCLayerTreeHostImpl::applyPageScaleDeltaToScrollLayer()
{
- m_minPageScale = minPageScale;
- m_maxPageScale = maxPageScale;
-
- // This will clamp m_scaleDelta and apply side effects if clamped.
- setScaleDelta(m_scaleDelta);
+ if (m_scrollLayerImpl)
+ m_scrollLayerImpl->setPageScaleDelta(m_pageScaleDelta * m_sentPageScaleDelta);
}
void CCLayerTreeHostImpl::updateMaxScrollPosition()
@@ -249,7 +260,7 @@
return;
FloatSize viewBounds = m_viewportSize;
- viewBounds.scale(1 / m_scaleDelta);
+ viewBounds.scale(1 / m_pageScaleDelta);
// TODO(aelias): Hardcoding the first child here is weird. Think of
// a cleaner way to get the contentBounds on the Impl side.
@@ -274,7 +285,7 @@
void CCLayerTreeHostImpl::scrollRootLayer(const IntSize& scrollDelta)
{
TRACE_EVENT("CCLayerTreeHostImpl::scrollRootLayer", this, 0);
- if (!m_scrollLayerImpl || !m_scrollLayerImpl->scrollable())
+ if (!m_scrollLayerImpl)
return;
m_scrollLayerImpl->scrollBy(scrollDelta);
@@ -304,9 +315,9 @@
// Keep the center-of-pinch anchor specified by (x, y) in a stable
// position over the course of the magnify.
- FloatPoint prevScaleAnchor(anchor.x() / m_scaleDelta, anchor.y() / m_scaleDelta);
- setScaleDelta(m_scaleDelta * magnifyDelta);
- FloatPoint newScaleAnchor(anchor.x() / m_scaleDelta, anchor.y() / m_scaleDelta);
+ FloatPoint prevScaleAnchor(anchor.x() / m_pageScaleDelta, anchor.y() / m_pageScaleDelta);
+ setPageScaleDelta(m_pageScaleDelta * magnifyDelta);
+ FloatPoint newScaleAnchor(anchor.x() / m_pageScaleDelta, anchor.y() / m_pageScaleDelta);
FloatSize move = prevScaleAnchor - newScaleAnchor;
@@ -325,14 +336,17 @@
PassOwnPtr<CCScrollAndScaleSet> CCLayerTreeHostImpl::processScrollDeltas()
{
OwnPtr<CCScrollAndScaleSet> scrollInfo = adoptPtr(new CCScrollAndScaleSet());
- bool didMove = m_scrollLayerImpl && (!m_scrollLayerImpl->scrollDelta().isZero() || m_scaleDelta != 1.0f);
+ bool didMove = m_scrollLayerImpl && (!m_scrollLayerImpl->scrollDelta().isZero() || m_pageScaleDelta != 1.0f);
if (!didMove || m_pinchGestureActive) {
- scrollInfo->pageScale = m_pageScale;
+ m_sentPageScaleDelta = scrollInfo->pageScaleDelta = 1;
return scrollInfo.release();
}
+ m_sentPageScaleDelta = scrollInfo->pageScaleDelta = m_pageScaleDelta;
+ m_pageScale = m_pageScale * m_sentPageScaleDelta;
+ setPageScaleDelta(1);
+
// FIXME: track scrolls from layers other than the root
- scrollInfo->pageScale = m_pageScale * m_scaleDelta;
CCLayerTreeHostCommon::ScrollUpdateInfo scroll;
scroll.layerId = m_scrollLayerImpl->id();
scroll.scrollDelta = m_scrollLayerImpl->scrollDelta();
@@ -343,6 +357,8 @@
m_scrollLayerImpl->setSentScrollDelta(m_scrollLayerImpl->scrollDelta());
m_scrollLayerImpl->setScrollDelta(IntSize());
+ adjustScrollsForPageScaleChange(m_sentPageScaleDelta);
+
return scrollInfo.release();
}
Modified: trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h (100507 => 100508)
--- trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h 2011-11-16 22:34:41 UTC (rev 100507)
+++ trunk/Source/WebCore/platform/graphics/chromium/cc/CCLayerTreeHostImpl.h 2011-11-16 22:37:55 UTC (rev 100508)
@@ -99,9 +99,8 @@
const IntSize& viewportSize() const { return m_viewportSize; }
void setZoomAnimatorTransform(const TransformationMatrix&);
- void setPageScale(float);
+ void setPageScaleFactorAndLimits(float pageScale, float minPageScale, float maxPageScale);
float pageScale() const { return m_pageScale; }
- void setPageScaleFactorLimits(float minPageScale, float maxPageScale);
const CCSettings& settings() const { return m_settings; }
@@ -109,7 +108,6 @@
virtual void pinchGestureUpdate(float, const IntPoint&);
virtual void pinchGestureEnd();
PassOwnPtr<CCScrollAndScaleSet> processScrollDeltas();
- void updateMaxScrollPosition();
protected:
CCLayerTreeHostImpl(const CCSettings&, CCLayerTreeHostImplClient*);
@@ -118,7 +116,10 @@
int m_frameNumber;
private:
- void setScaleDelta(float);
+ void setPageScaleDelta(float);
+ void applyPageScaleDeltaToScrollLayer();
+ void adjustScrollsForPageScaleChange(float);
+ void updateMaxScrollPosition();
OwnPtr<LayerRendererChromium> m_layerRenderer;
RefPtr<CCLayerImpl> m_rootLayerImpl;
@@ -129,7 +130,8 @@
bool m_haveWheelEventHandlers;
float m_pageScale;
- float m_scaleDelta;
+ float m_pageScaleDelta;
+ float m_sentPageScaleDelta;
float m_minPageScale, m_maxPageScale;
bool m_pinchGestureActive;
Modified: trunk/Source/WebKit/chromium/ChangeLog (100507 => 100508)
--- trunk/Source/WebKit/chromium/ChangeLog 2011-11-16 22:34:41 UTC (rev 100507)
+++ trunk/Source/WebKit/chromium/ChangeLog 2011-11-16 22:37:55 UTC (rev 100508)
@@ -1,3 +1,25 @@
+2011-11-16 Alexandre Elias <ael...@google.com>
+
+ [chromium] Improvements for page scale delta during commit
+ https://bugs.webkit.org/show_bug.cgi?id=72471
+
+ Reviewed by James Robinson.
+
+ Page scale now follows the same commit flow as scroll position:
+ the delta is folded into m_pageScale at BFAC time, and a "sent" value
+ is preserved for temporary use until the commit finishes.
+
+ I also merged setPageScaleFactor and setPageScaleFactorLimits into one
+ function on the impl side. The reason is that setPageFactor must
+ be applied after the limits are updated, but on the other hand setting
+ the limits first may cause an unnecessary clamp of the scale delta.
+ Merging the methods avoids this bind.
+
+ No new tests. (planning to add later: https://bugs.webkit.org/show_bug.cgi?id=71529)
+
+ * src/WebViewImpl.cpp:
+ (WebKit::WebViewImpl::applyScrollAndScale):
+
2011-11-16 Dave Michael <dmich...@chromium.org>
Fix up chromium API for creating events, initializing message events
Modified: trunk/Source/WebKit/chromium/src/WebViewImpl.cpp (100507 => 100508)
--- trunk/Source/WebKit/chromium/src/WebViewImpl.cpp 2011-11-16 22:34:41 UTC (rev 100507)
+++ trunk/Source/WebKit/chromium/src/WebViewImpl.cpp 2011-11-16 22:37:55 UTC (rev 100508)
@@ -2792,16 +2792,12 @@
layout();
}
-void WebViewImpl::applyScrollAndScale(const IntSize& scrollDelta, float scaleFactor)
+void WebViewImpl::applyScrollAndScale(const IntSize& scrollDelta, float pageScaleDelta)
{
if (!mainFrameImpl() || !mainFrameImpl()->frameView())
return;
- float oldScale = pageScaleFactor();
- if (!oldScale)
- oldScale = 1;
-
- if (!scaleFactor || oldScale == scaleFactor)
+ if (pageScaleDelta == 1)
mainFrameImpl()->frameView()->scrollBy(scrollDelta);
else {
// The page scale changed, so apply a scale and scroll in a single
@@ -2811,10 +2807,9 @@
WebSize scrollOffset = mainFrame()->scrollOffset();
scrollOffset.width += scrollDelta.width();
scrollOffset.height += scrollDelta.height();
- float scaleDelta = scaleFactor / oldScale;
- WebPoint scaledScrollOffset(scrollOffset.width * scaleDelta,
- scrollOffset.height * scaleDelta);
- setPageScaleFactor(scaleFactor, scaledScrollOffset);
+ WebPoint scaledScrollOffset(scrollOffset.width * pageScaleDelta,
+ scrollOffset.height * pageScaleDelta);
+ setPageScaleFactor(pageScaleFactor() * pageScaleDelta, scaledScrollOffset);
}
}
Modified: trunk/Source/WebKit/chromium/tests/CCLayerImplTest.cpp (100507 => 100508)
--- trunk/Source/WebKit/chromium/tests/CCLayerImplTest.cpp 2011-11-16 22:34:41 UTC (rev 100507)
+++ trunk/Source/WebKit/chromium/tests/CCLayerImplTest.cpp 2011-11-16 22:37:55 UTC (rev 100508)
@@ -111,7 +111,7 @@
EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->scrollBy(arbitraryIntSize));
EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->setScrollDelta(arbitraryIntSize));
EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->setScrollPosition(arbitraryIntPoint));
- EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->setScaleDelta(arbitraryNumber));
+ EXECUTE_AND_VERIFY_SUBTREE_CHANGED(root->setPageScaleDelta(arbitraryNumber));
// Changing these properties only affects the layer itself.
EXECUTE_AND_VERIFY_ONLY_LAYER_CHANGED(root->setContentBounds(arbitraryIntSize));
@@ -149,7 +149,7 @@
EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->setDoubleSided(false)); // constructor initializes it to "true".
EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->setScrollDelta(arbitraryIntSize));
EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->setScrollPosition(arbitraryIntPoint));
- EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->setScaleDelta(arbitraryNumber));
+ EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->setPageScaleDelta(arbitraryNumber));
EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->setContentBounds(arbitraryIntSize));
EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->setOpaque(true));
EXECUTE_AND_VERIFY_SUBTREE_DID_NOT_CHANGE(root->setOpacity(arbitraryNumber));