Index: Source/core/frame/PinchViewport.cpp |
diff --git a/Source/core/frame/PinchViewport.cpp b/Source/core/frame/PinchViewport.cpp |
index 498d68197960a8d3c9d6693c3d696879895ec203..7f863bf52bd95b0a40958980f05f52e28cfeef02 100644 |
--- a/Source/core/frame/PinchViewport.cpp |
+++ b/Source/core/frame/PinchViewport.cpp |
@@ -63,14 +63,17 @@ using WebCore::GraphicsLayerFactory; |
namespace WebCore { |
PinchViewport::PinchViewport(FrameHost& owner) |
- : m_owner(owner) |
+ : m_frameHost(owner) |
{ |
} |
PinchViewport::~PinchViewport() { } |
-void PinchViewport::setViewportSize(const WebCore::IntSize& newSize) |
+void PinchViewport::setSize(const IntSize& newSize) |
{ |
+ // TODO: This is currently called from WebViewImpl with the main frame size which |
+ // is (or will be) incorrect, address in future patches. |
+ |
if (!m_innerViewportContainerLayer || !m_innerViewportScrollLayer) |
return; |
@@ -85,6 +88,25 @@ void PinchViewport::setViewportSize(const WebCore::IntSize& newSize) |
setupScrollbar(WebScrollbar::Vertical); |
} |
+void PinchViewport::setLocation(const IntPoint& newLocation) |
+{ |
+ // TODO: The update from the LayerTree will occur here before the scale delta is applied. |
+ // this means that the clamping below may be incorrect. Once scaling is done in PinchViewport |
+ // change it so they happen at the same time. |
+ |
+ // Clamp the location within our extents. |
+ IntPoint location(newLocation); |
+ location.shrunkTo(maximumScrollPosition()); |
+ location.expandedTo(minimumScrollPosition()); |
+ |
+ m_visibleRect.setLocation(newLocation); |
+ |
+ ScrollingCoordinator* coordinator = m_frameHost.page().scrollingCoordinator(); |
+ ASSERT(coordinator); |
+ |
+ coordinator->scrollableAreaScrollLayerDidChange(this); |
+} |
+ |
// Modifies the top of the graphics layer tree to add layers needed to support |
// the inner/outer viewport fixed-position model for pinch zoom. When finished, |
// the tree will look like this (with * denoting added layers): |
@@ -125,7 +147,7 @@ void PinchViewport::attachToLayerTree(GraphicsLayer* currentLayerTreeRoot, Graph |
m_overlayScrollbarHorizontal = GraphicsLayer::create(graphicsLayerFactory, this); |
m_overlayScrollbarVertical = GraphicsLayer::create(graphicsLayerFactory, this); |
- WebCore::ScrollingCoordinator* coordinator = m_owner.page().scrollingCoordinator(); |
+ WebCore::ScrollingCoordinator* coordinator = m_frameHost.page().scrollingCoordinator(); |
ASSERT(coordinator); |
coordinator->setLayerIsContainerForFixedPositionLayers(m_innerViewportScrollLayer.get(), true); |
@@ -143,6 +165,9 @@ void PinchViewport::attachToLayerTree(GraphicsLayer* currentLayerTreeRoot, Graph |
m_innerViewportContainerLayer->addChild(m_overlayScrollbarHorizontal.get()); |
m_innerViewportContainerLayer->addChild(m_overlayScrollbarVertical.get()); |
+ // Ensure this class is set as the scroll layer's ScrollableArea |
+ coordinator->scrollableAreaScrollLayerDidChange(this); |
+ |
// Setup the inner viewport overlay scrollbars. |
setupScrollbar(WebScrollbar::Horizontal); |
setupScrollbar(WebScrollbar::Vertical); |
@@ -157,9 +182,9 @@ void PinchViewport::attachToLayerTree(GraphicsLayer* currentLayerTreeRoot, Graph |
// away, we would re-enable the drawing of these scrollbars. |
// FIXME: This doesn't seem to work (at least on Android). Commenting out for now until |
// I figure out how to access RenderLayerCompositor from here. |
- // if (GraphicsLayer* scrollbar = m_owner->compositor()->layerForHorizontalScrollbar()) |
+ // if (GraphicsLayer* scrollbar = m_frameHost->compositor()->layerForHorizontalScrollbar()) |
// scrollbar->setDrawsContent(!page->mainFrame()->view()->hasOverlayScrollbars()); |
- // if (GraphicsLayer* scrollbar = m_owner->compositor()->layerForVerticalScrollbar()) |
+ // if (GraphicsLayer* scrollbar = m_frameHost->compositor()->layerForVerticalScrollbar()) |
// scrollbar->setDrawsContent(!page->mainFrame()->view()->hasOverlayScrollbars()); |
} |
@@ -171,12 +196,12 @@ void PinchViewport::setupScrollbar(WebScrollbar::Orientation orientation) |
OwnPtr<WebScrollbarLayer>& webScrollbarLayer = isHorizontal ? |
m_webOverlayScrollbarHorizontal : m_webOverlayScrollbarVertical; |
- const int overlayScrollbarThickness = m_owner.settings().pinchOverlayScrollbarThickness(); |
+ const int overlayScrollbarThickness = m_frameHost.settings().pinchOverlayScrollbarThickness(); |
if (!webScrollbarLayer) { |
- WebCore::ScrollingCoordinator* coordinator = m_owner.page().scrollingCoordinator(); |
+ ScrollingCoordinator* coordinator = m_frameHost.page().scrollingCoordinator(); |
ASSERT(coordinator); |
- WebCore::ScrollbarOrientation webcoreOrientation = isHorizontal ? WebCore::HorizontalScrollbar : WebCore::VerticalScrollbar; |
+ ScrollbarOrientation webcoreOrientation = isHorizontal ? HorizontalScrollbar : VerticalScrollbar; |
webScrollbarLayer = coordinator->createSolidColorScrollbarLayer(webcoreOrientation, overlayScrollbarThickness, false); |
webScrollbarLayer->setClipLayer(m_innerViewportContainerLayer->platformLayer()); |
@@ -190,18 +215,18 @@ void PinchViewport::setupScrollbar(WebScrollbar::Orientation orientation) |
int height = isHorizontal ? overlayScrollbarThickness : m_innerViewportContainerLayer->size().height() - overlayScrollbarThickness; |
// Use the GraphicsLayer to position the scrollbars. |
- scrollbarGraphicsLayer->setPosition(WebCore::IntPoint(xPosition, yPosition)); |
- scrollbarGraphicsLayer->setSize(WebCore::IntSize(width, height)); |
- scrollbarGraphicsLayer->setContentsRect(WebCore::IntRect(0, 0, width, height)); |
+ scrollbarGraphicsLayer->setPosition(IntPoint(xPosition, yPosition)); |
+ scrollbarGraphicsLayer->setSize(IntSize(width, height)); |
+ scrollbarGraphicsLayer->setContentsRect(IntRect(0, 0, width, height)); |
} |
-void PinchViewport::registerViewportLayersWithTreeView(WebLayerTreeView* layerTreeView) const |
+void PinchViewport::registerLayersWithTreeView(WebLayerTreeView* layerTreeView) const |
{ |
ASSERT(layerTreeView); |
- ASSERT(m_owner.page().mainFrame()); |
- ASSERT(m_owner.page().mainFrame()->contentRenderer()); |
+ ASSERT(m_frameHost.page().mainFrame()); |
+ ASSERT(m_frameHost.page().mainFrame()->contentRenderer()); |
- WebCore::RenderLayerCompositor* compositor = m_owner.page().mainFrame()->contentRenderer()->compositor(); |
+ RenderLayerCompositor* compositor = m_frameHost.page().mainFrame()->contentRenderer()->compositor(); |
// Get the outer viewport scroll layer. |
WebLayer* scrollLayer = compositor->scrollLayer()->platformLayer(); |
@@ -215,18 +240,93 @@ void PinchViewport::registerViewportLayersWithTreeView(WebLayerTreeView* layerTr |
scrollLayer); |
} |
-void PinchViewport::clearViewportLayersForTreeView(WebLayerTreeView* layerTreeView) const |
+void PinchViewport::clearLayersForTreeView(WebLayerTreeView* layerTreeView) const |
{ |
ASSERT(layerTreeView); |
layerTreeView->clearViewportLayers(); |
} |
+int PinchViewport::scrollSize(ScrollbarOrientation orientation) const |
+{ |
+ IntSize scrollDimensions = maximumScrollPosition() - minimumScrollPosition(); |
+ return (orientation == HorizontalScrollbar) ? scrollDimensions.width() : scrollDimensions.height(); |
+} |
+ |
+IntPoint PinchViewport::minimumScrollPosition() const |
+{ |
+ return IntPoint(); |
+} |
+ |
+IntPoint PinchViewport::maximumScrollPosition() const |
+{ |
+ // TODO: Doesn't take scale into account yet. |
+ IntPoint maxScrollPosition(contentsSize() - visibleRect().size()); |
+ maxScrollPosition.clampNegativeToZero(); |
+ return maxScrollPosition; |
+} |
+ |
+IntRect PinchViewport::scrollableAreaBoundingBox() const |
+{ |
+ // This method should return the bounding box in the parent view's coordinate |
+ // space; however, PinchViewport technically isn't a child of any Frames. |
+ // Nonetheless, the PinchViewport always occupies the entire main frame so just |
+ // return that. |
+ LocalFrame* frame = m_frameHost.page().mainFrame(); |
+ |
+ if (!frame || !frame->view()) |
+ return IntRect(); |
+ |
+ return frame->view()->frameRect(); |
+} |
+ |
+IntSize PinchViewport::contentsSize() const |
+{ |
+ LocalFrame* frame = m_frameHost.page().mainFrame(); |
+ |
+ if (!frame || !frame->view()) |
+ return IntSize(); |
+ |
+ // TODO: This will be visibleContentSize once page scale is removed from FrameView |
+ return frame->view()->unscaledVisibleContentSize(IncludeScrollbars); |
+} |
+ |
+void PinchViewport::invalidateScrollbarRect(Scrollbar*, const IntRect&) |
+{ |
+ // Do nothing. Pinch scrollbars live on the compositor thread and will |
+ // be updated when the viewport is synced to the CC. |
+} |
+ |
+void PinchViewport::setScrollOffset(const IntPoint& offset) |
+{ |
+ setLocation(offset); |
+} |
+ |
+GraphicsLayer* PinchViewport::layerForContainer() const |
+{ |
+ return m_innerViewportContainerLayer.get(); |
+} |
+ |
+GraphicsLayer* PinchViewport::layerForScrolling() const |
+{ |
+ return m_innerViewportScrollLayer.get(); |
+} |
+ |
+GraphicsLayer* PinchViewport::layerForHorizontalScrollbar() const |
+{ |
+ return m_overlayScrollbarHorizontal.get(); |
+} |
+ |
+GraphicsLayer* PinchViewport::layerForVerticalScrollbar() const |
+{ |
+ return m_overlayScrollbarVertical.get(); |
+} |
+ |
void PinchViewport::notifyAnimationStarted(const GraphicsLayer*, double monotonicTime) |
{ |
} |
-void PinchViewport::paintContents(const GraphicsLayer*, WebCore::GraphicsContext&, WebCore::GraphicsLayerPaintingPhase, const WebCore::IntRect& inClip) |
+void PinchViewport::paintContents(const GraphicsLayer*, GraphicsContext&, GraphicsLayerPaintingPhase, const IntRect& inClip) |
{ |
} |