void VisualViewport::setSize(const IntSize& size) { // When the main frame is remote, we won't have an associated frame. if (!mainFrame()) return; if (m_size == size) return; bool autosizerNeedsUpdating = (size.width() != m_size.width()) && mainFrame()->settings() && mainFrame()->settings()->textAutosizingEnabled(); TRACE_EVENT2("blink", "VisualViewport::setSize", "width", size.width(), "height", size.height()); m_size = size; if (m_innerViewportContainerLayer) { m_innerViewportContainerLayer->setSize(m_size); // Need to re-compute sizes for the overlay scrollbars. initializeScrollbars(); } if (autosizerNeedsUpdating) { // This needs to happen after setting the m_size member since it'll be read in the update call. if (TextAutosizer* textAutosizer = mainFrame()->document()->textAutosizer()) textAutosizer->updatePageInfoInAllFrames(); } }
void VisualViewport::setSize(const IntSize& size) { if (m_size == size) return; TRACE_EVENT2("blink", "VisualViewport::setSize", "width", size.width(), "height", size.height()); bool widthDidChange = size.width() != m_size.width(); m_size = size; if (m_innerViewportContainerLayer) { m_innerViewportContainerLayer->setSize(FloatSize(m_size)); // Need to re-compute sizes for the overlay scrollbars. initializeScrollbars(); } if (!mainFrame()) return; enqueueResizeEvent(); bool autosizerNeedsUpdating = widthDidChange && mainFrame()->settings() && mainFrame()->settings()->textAutosizingEnabled(); if (autosizerNeedsUpdating) { // This needs to happen after setting the m_size member since it'll be read // in the update call. if (TextAutosizer* textAutosizer = mainFrame()->document()->textAutosizer()) textAutosizer->updatePageInfoInAllFrames(); } }
// 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) // | +- *overscrollElasticityLayer // | +- *pageScaleLayer // | +- *innerViewportScrollLayer // | +-- overflowControlsHostLayer (root layer) // | +-- outerViewportContainerLayer (fixed pos container) [frame container layer in PaintLayerCompositor] // | | +-- outerViewportScrollLayer [frame scroll layer in PaintLayerCompositor] // | | +-- content layers ... // +- horizontalScrollbarLayer // +- verticalScrollbarLayer // +- scroll corner (non-overlay only) // void VisualViewport::attachToLayerTree(GraphicsLayer* currentLayerTreeRoot, GraphicsLayerFactory* graphicsLayerFactory) { TRACE_EVENT1("blink", "VisualViewport::attachToLayerTree", "currentLayerTreeRoot", (bool)currentLayerTreeRoot); if (!currentLayerTreeRoot) { if (m_innerViewportScrollLayer) m_innerViewportScrollLayer->removeAllChildren(); return; } if (currentLayerTreeRoot->parent() && currentLayerTreeRoot->parent() == m_innerViewportScrollLayer) return; if (!m_innerViewportScrollLayer) { ASSERT(!m_overlayScrollbarHorizontal && !m_overlayScrollbarVertical && !m_overscrollElasticityLayer && !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_overscrollElasticityLayer = 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); ScrollingCoordinator* coordinator = 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(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_overscrollElasticityLayer.get()); m_overscrollElasticityLayer->addChild(m_pageScaleLayer.get()); m_pageScaleLayer->addChild(m_innerViewportScrollLayer.get()); // Ensure this class is set as the scroll layer's ScrollableArea. coordinator->scrollableAreaScrollLayerDidChange(this); initializeScrollbars(); } m_innerViewportScrollLayer->removeAllChildren(); m_innerViewportScrollLayer->addChild(currentLayerTreeRoot); }