LinkHighlightImpl::LinkHighlightImpl(Node* node, WebViewImpl* owningWebViewImpl) : m_node(node) , m_owningWebViewImpl(owningWebViewImpl) , m_currentGraphicsLayer(0) , m_isScrollingGraphicsLayer(false) , m_geometryNeedsUpdate(false) , m_isAnimating(false) , m_startTime(monotonicallyIncreasingTime()) { DCHECK(m_node); DCHECK(owningWebViewImpl); WebCompositorSupport* compositorSupport = Platform::current()->compositorSupport(); DCHECK(compositorSupport); m_contentLayer = wrapUnique(compositorSupport->createContentLayer(this)); m_clipLayer = wrapUnique(compositorSupport->createLayer()); m_clipLayer->setTransformOrigin(WebFloatPoint3D()); m_clipLayer->addChild(m_contentLayer->layer()); m_compositorPlayer = CompositorAnimationPlayer::create(); DCHECK(m_compositorPlayer); m_compositorPlayer->setAnimationDelegate(this); if (m_owningWebViewImpl->linkHighlightsTimeline()) m_owningWebViewImpl->linkHighlightsTimeline()->playerAttached(*this); CompositorElementId elementId = createCompositorElementId(DOMNodeIds::idForNode(node), CompositorSubElementId::LinkHighlight); m_compositorPlayer->attachElement(elementId); m_contentLayer->layer()->setDrawsContent(true); m_contentLayer->layer()->setOpacity(1); m_contentLayer->layer()->setElementId(elementId); m_geometryNeedsUpdate = true; }
std::unique_ptr<CompositorMutableState> CompositorMutableStateProvider::getMutableStateFor(uint64_t elementId) { cc::LayerImpl* mainLayer = m_tree->LayerByElementId(createCompositorElementId(elementId, CompositorSubElementId::Primary)); cc::LayerImpl* scrollLayer = m_tree->LayerByElementId(createCompositorElementId(elementId, CompositorSubElementId::Scroll)); if (!mainLayer && !scrollLayer) return nullptr; // Ensure that we have an entry in the map for |elementId| but do as few // allocations and queries as possible. This will update the map only if we // have not added a value for |elementId|. auto result = m_mutations->map.add(elementId, nullptr); // Only if this is a new entry do we want to allocate a new mutation. if (result.isNewEntry) result.storedValue->value = wrapUnique(new CompositorMutation); return wrapUnique(new CompositorMutableState(result.storedValue->value.get(), mainLayer, scrollLayer)); }
// 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) // | | [ owned by PaintLayerCompositor ] // | +-- outerViewportContainerLayer (fixed pos container) // | | [frame container layer in PaintLayerCompositor] // | | +-- outerViewportScrollLayer // | | | [frame scroll layer in PaintLayerCompositor] // | | +-- content layers ... // +- *PageOverlay for InspectorOverlay // +- *PageOverlay for ColorOverlay // +- horizontalScrollbarLayer [ owned by PaintLayerCompositor ] // +- verticalScrollbarLayer [ owned by PaintLayerCompositor ] // +- scroll corner (non-overlay only) [ owned by PaintLayerCompositor ] // void VisualViewport::attachToLayerTree(GraphicsLayer* currentLayerTreeRoot) { TRACE_EVENT1("blink", "VisualViewport::attachToLayerTree", "currentLayerTreeRoot", (bool)currentLayerTreeRoot); if (!currentLayerTreeRoot) { if (m_innerViewportScrollLayer) m_innerViewportScrollLayer->removeAllChildren(); return; } if (currentLayerTreeRoot->parent() && currentLayerTreeRoot->parent() == m_innerViewportScrollLayer.get()) 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(this); m_innerViewportContainerLayer = GraphicsLayer::create(this); m_overscrollElasticityLayer = GraphicsLayer::create(this); m_pageScaleLayer = GraphicsLayer::create(this); m_innerViewportScrollLayer = GraphicsLayer::create(this); m_overlayScrollbarHorizontal = GraphicsLayer::create(this); m_overlayScrollbarVertical = GraphicsLayer::create(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(FloatSize(m_size)); m_innerViewportScrollLayer->platformLayer()->setScrollClipLayer( m_innerViewportContainerLayer->platformLayer()); m_innerViewportScrollLayer->platformLayer()->setUserScrollable(true, true); if (mainFrame()) { if (Document* document = mainFrame()->document()) { m_innerViewportScrollLayer->setElementId(createCompositorElementId( DOMNodeIds::idForNode(document), CompositorSubElementId::Viewport)); } } 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); }