PinchViewports::PinchViewports(WebViewImpl* owner) : m_owner(owner) , m_innerViewportContainerLayer(GraphicsLayer::create(m_owner->graphicsLayerFactory(), this)) , m_pageScaleLayer(GraphicsLayer::create(m_owner->graphicsLayerFactory(), this)) , m_innerViewportScrollLayer(GraphicsLayer::create(m_owner->graphicsLayerFactory(), this)) , m_overlayScrollbarHorizontal(GraphicsLayer::create(m_owner->graphicsLayerFactory(), this)) , m_overlayScrollbarVertical(GraphicsLayer::create(m_owner->graphicsLayerFactory(), this)) { ASSERT(m_owner); WebCore::ScrollingCoordinator* coordinator = m_owner->page()->scrollingCoordinator(); ASSERT(coordinator); coordinator->setLayerIsContainerForFixedPositionLayers(m_innerViewportScrollLayer.get(), true); // No need for the inner viewport to clip, since the compositing // surface takes care of it -- and clipping here would interfere with // dynamically-sized viewports on Android. m_innerViewportContainerLayer->setMasksToBounds(false); m_innerViewportScrollLayer->platformLayer()->setScrollClipLayer( m_innerViewportContainerLayer->platformLayer()); m_innerViewportScrollLayer->platformLayer()->setUserScrollable(true, true); m_innerViewportContainerLayer->addChild(m_pageScaleLayer.get()); m_pageScaleLayer->addChild(m_innerViewportScrollLayer.get()); m_innerViewportContainerLayer->addChild(m_overlayScrollbarHorizontal.get()); m_innerViewportContainerLayer->addChild(m_overlayScrollbarVertical.get()); // Setup the inner viewport overlay scrollbars. setupScrollbar(WebScrollbar::Horizontal); setupScrollbar(WebScrollbar::Vertical); }
PinchViewports::PinchViewports(WebViewImpl* owner) : m_owner(owner) , m_innerViewportClipLayer(GraphicsLayer::create(m_owner->graphicsLayerFactory(), this)) , m_pageScaleLayer(GraphicsLayer::create(m_owner->graphicsLayerFactory(), this)) , m_innerViewportScrollLayer(GraphicsLayer::create(m_owner->graphicsLayerFactory(), this)) , m_overlayScrollbarHorizontal(GraphicsLayer::create(m_owner->graphicsLayerFactory(), this)) , m_overlayScrollbarVertical(GraphicsLayer::create(m_owner->graphicsLayerFactory(), this)) { m_innerViewportClipLayer->setMasksToBounds(true); m_innerViewportClipLayer->platformLayer()->setIsContainerForFixedPositionLayers(true); m_innerViewportScrollLayer->platformLayer()->setScrollable(true); #ifndef NDEBUG m_innerViewportClipLayer->setName("inner viewport clip layer"); m_pageScaleLayer->setName("page scale layer"); m_innerViewportScrollLayer->setName("inner viewport scroll layer"); m_overlayScrollbarHorizontal->setName("overlay scrollbar horizontal"); m_overlayScrollbarVertical->setName("overlay scrollbar vertical"); #endif m_innerViewportClipLayer->addChild(m_pageScaleLayer.get()); m_pageScaleLayer->addChild(m_innerViewportScrollLayer.get()); m_innerViewportClipLayer->addChild(m_overlayScrollbarHorizontal.get()); m_innerViewportClipLayer->addChild(m_overlayScrollbarVertical.get()); // Setup the inner viewport overlay scrollbars. setupScrollbar(WebScrollbar::Horizontal); setupScrollbar(WebScrollbar::Vertical); }
void PinchViewports::setViewportSize(const WebCore::IntSize& newSize) { m_innerViewportContainerLayer->setSize(newSize); // Need to re-compute sizes for the overlay scrollbars. setupScrollbar(WebScrollbar::Horizontal); setupScrollbar(WebScrollbar::Vertical); }
void PinchViewports::setViewportSize(const WebCore::IntSize& newSize) { m_innerViewportContainerLayer->setSize(newSize); // The innerviewport scroll layer always has the same size as its clip layer, but // the page scale layer lives between them, allowing for non-zero max scroll // offset when page scale > 1. m_innerViewportScrollLayer->setSize(newSize); // Need to re-compute sizes for the overlay scrollbars. setupScrollbar(WebScrollbar::Horizontal); setupScrollbar(WebScrollbar::Vertical); }
void VisualViewport::initializeScrollbars() { if (visualViewportSuppliesScrollbars()) { if (!m_overlayScrollbarHorizontal->parent()) m_innerViewportContainerLayer->addChild(m_overlayScrollbarHorizontal.get()); if (!m_overlayScrollbarVertical->parent()) m_innerViewportContainerLayer->addChild(m_overlayScrollbarVertical.get()); } else { m_overlayScrollbarHorizontal->removeFromParent(); m_overlayScrollbarVertical->removeFromParent(); } setupScrollbar(WebScrollbar::Horizontal); setupScrollbar(WebScrollbar::Vertical); }
void PinchViewport::setSize(const IntSize& size) { if (m_size == size) return; TRACE_EVENT2("blink", "PinchViewport::setSize", "width", size.width(), "height", size.height()); m_size = size; // Make sure we clamp the offset to within the new bounds. setLocation(m_offset); if (m_innerViewportContainerLayer) { m_innerViewportContainerLayer->setSize(m_size); // Need to re-compute sizes for the overlay scrollbars. setupScrollbar(WebScrollbar::Horizontal); setupScrollbar(WebScrollbar::Vertical); } }
void PinchViewport::setSize(const IntSize& size) { ASSERT(mainFrame() && mainFrame()->view()); if (!m_innerViewportContainerLayer || !m_innerViewportScrollLayer) return; if (m_size == size) return; m_size = size; m_innerViewportContainerLayer->setSize(m_size); // Make sure we clamp the offset to within the new bounds. setLocation(m_offset); // Need to re-compute sizes for the overlay scrollbars. setupScrollbar(WebScrollbar::Horizontal); setupScrollbar(WebScrollbar::Vertical); }
void VisualViewport::initializeScrollbars() { // Do nothing if not attached to layer tree yet - will initialize upon attach. if (!m_innerViewportContainerLayer) return; if (visualViewportSuppliesScrollbars() && !frameHost().settings().hideScrollbars()) { if (!m_overlayScrollbarHorizontal->parent()) m_innerViewportContainerLayer->addChild( m_overlayScrollbarHorizontal.get()); if (!m_overlayScrollbarVertical->parent()) m_innerViewportContainerLayer->addChild(m_overlayScrollbarVertical.get()); } else { m_overlayScrollbarHorizontal->removeFromParent(); m_overlayScrollbarVertical->removeFromParent(); } setupScrollbar(WebScrollbar::Horizontal); setupScrollbar(WebScrollbar::Vertical); }
// 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): // // *rootTransformLayer // +- *innerViewportContainerLayer (fixed pos container) // +- *pageScaleLayer // | +- *innerViewportScrollLayer // | +-- overflowControlsHostLayer (root layer) // | +-- outerViewportContainerLayer (fixed pos container) [frame container layer in RenderLayerCompositor] // | | +-- outerViewportScrollLayer [frame scroll layer in RenderLayerCompositor] // | | +-- content layers ... // | +-- horizontal ScrollbarLayer (non-overlay) // | +-- verticalScrollbarLayer (non-overlay) // | +-- scroll corner (non-overlay) // +- *horizontalScrollbarLayer (overlay) // +- *verticalScrollbarLayer (overlay) // void PinchViewport::attachToLayerTree(GraphicsLayer* currentLayerTreeRoot, GraphicsLayerFactory* graphicsLayerFactory) { TRACE_EVENT1("blink", "PinchViewport::attachToLayerTree", "currentLayerTreeRoot", (bool)currentLayerTreeRoot); if (!currentLayerTreeRoot) { m_innerViewportScrollLayer->removeAllChildren(); return; } if (currentLayerTreeRoot->parent() && currentLayerTreeRoot->parent() == m_innerViewportScrollLayer) return; if (!m_innerViewportScrollLayer) { ASSERT(!m_overlayScrollbarHorizontal && !m_overlayScrollbarVertical && !m_pageScaleLayer && !m_innerViewportContainerLayer); // FIXME: The root transform layer should only be created on demand. m_rootTransformLayer = GraphicsLayer::create(graphicsLayerFactory, this); m_innerViewportContainerLayer = GraphicsLayer::create(graphicsLayerFactory, this); m_pageScaleLayer = GraphicsLayer::create(graphicsLayerFactory, this); m_innerViewportScrollLayer = GraphicsLayer::create(graphicsLayerFactory, this); m_overlayScrollbarHorizontal = GraphicsLayer::create(graphicsLayerFactory, this); m_overlayScrollbarVertical = GraphicsLayer::create(graphicsLayerFactory, this); WebCore::ScrollingCoordinator* coordinator = m_frameHost.page().scrollingCoordinator(); ASSERT(coordinator); coordinator->setLayerIsContainerForFixedPositionLayers(m_innerViewportScrollLayer.get(), true); // Set masks to bounds so the compositor doesn't clobber a manually // set inner viewport container layer size. m_innerViewportContainerLayer->setMasksToBounds(m_frameHost.settings().mainFrameClipsContent()); m_innerViewportContainerLayer->setSize(m_size); m_innerViewportScrollLayer->platformLayer()->setScrollClipLayer( m_innerViewportContainerLayer->platformLayer()); m_innerViewportScrollLayer->platformLayer()->setUserScrollable(true, true); m_rootTransformLayer->addChild(m_innerViewportContainerLayer.get()); m_innerViewportContainerLayer->addChild(m_pageScaleLayer.get()); m_pageScaleLayer->addChild(m_innerViewportScrollLayer.get()); 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); } m_innerViewportScrollLayer->removeAllChildren(); m_innerViewportScrollLayer->addChild(currentLayerTreeRoot); // We only need to disable the existing (outer viewport) scrollbars // if the existing ones are already overlay. // FIXME: If we knew in advance before the overflowControlsHostLayer goes // 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_frameHost->compositor()->layerForHorizontalScrollbar()) // scrollbar->setDrawsContent(!page->mainFrame()->view()->hasOverlayScrollbars()); // if (GraphicsLayer* scrollbar = m_frameHost->compositor()->layerForVerticalScrollbar()) // scrollbar->setDrawsContent(!page->mainFrame()->view()->hasOverlayScrollbars()); }