void LinkHighlight::updateGeometry() { // To avoid unnecessary updates (e.g. other entities have requested animations from our WebViewImpl), // only proceed if we actually requested an update. if (!m_geometryNeedsUpdate) return; m_geometryNeedsUpdate = false; bool hasRenderer = m_node && m_node->layoutObject(); const LayoutBoxModelObject* paintInvalidationContainer = hasRenderer ? m_node->layoutObject()->containerForPaintInvalidation() : 0; if (paintInvalidationContainer) attachLinkHighlightToCompositingLayer(paintInvalidationContainer); if (paintInvalidationContainer && computeHighlightLayerPathAndPosition(paintInvalidationContainer)) { // We only need to invalidate the layer if the highlight size has changed, otherwise // we can just re-position the layer without needing to repaint. m_contentLayer->layer()->invalidate(); if (m_currentGraphicsLayer && m_currentGraphicsLayer->isTrackingPaintInvalidations()) m_currentGraphicsLayer->trackPaintInvalidationRect(FloatRect(layer()->position().x, layer()->position().y, layer()->bounds().width, layer()->bounds().height)); } else if (!hasRenderer) { clearGraphicsLayerLinkHighlightPointer(); releaseResources(); } }
void LinkHighlight::notifyAnimationFinished(double, blink::WebAnimation::TargetProperty) { // Since WebViewImpl may hang on to us for a while, make sure we // release resources as soon as possible. clearGraphicsLayerLinkHighlightPointer(); releaseResources(); }
LinkHighlightImpl::~LinkHighlightImpl() { if (m_compositorPlayer->isElementAttached()) m_compositorPlayer->detachElement(); if (m_owningWebViewImpl->linkHighlightsTimeline()) m_owningWebViewImpl->linkHighlightsTimeline()->playerDestroyed(*this); m_compositorPlayer->setAnimationDelegate(nullptr); m_compositorPlayer.reset(); clearGraphicsLayerLinkHighlightPointer(); releaseResources(); }
RenderLayer* LinkHighlight::computeEnclosingCompositingLayer() { if (!m_node || !m_node->renderer()) return 0; // Find the nearest enclosing composited layer and attach to it. We may need to cross frame boundaries // to find a suitable layer. RenderLayerModelObject* renderer = toRenderLayerModelObject(m_node->renderer()); RenderLayerModelObject* repaintContainer; do { repaintContainer = renderer->containerForRepaint(); if (!repaintContainer) { renderer = renderer->frame()->ownerRenderer(); if (!renderer) return 0; } } while (!repaintContainer); RenderLayer* renderLayer = repaintContainer->layer(); if (!renderLayer || !renderLayer->isComposited()) return 0; GraphicsLayer* newGraphicsLayer = renderLayer->backing()->graphicsLayer(); m_clipLayer->setSublayerTransform(SkMatrix44()); if (!newGraphicsLayer->drawsContent()) { if (renderLayer->usesCompositedScrolling()) { ASSERT(renderLayer->backing() && renderLayer->backing()->scrollingContentsLayer()); newGraphicsLayer = renderLayer->backing()->scrollingContentsLayer(); } else ASSERT_NOT_REACHED(); } if (m_currentGraphicsLayer != newGraphicsLayer) { if (m_currentGraphicsLayer) clearGraphicsLayerLinkHighlightPointer(); m_currentGraphicsLayer = newGraphicsLayer; m_currentGraphicsLayer->setLinkHighlight(this); } return renderLayer; }
void LinkHighlight::attachLinkHighlightToCompositingLayer(const LayoutBoxModelObject* paintInvalidationContainer) { GraphicsLayer* newGraphicsLayer = paintInvalidationContainer->layer()->graphicsLayerBacking(); // FIXME: There should always be a GraphicsLayer. See crbug.com/431961. if (newGraphicsLayer && !newGraphicsLayer->drawsContent()) newGraphicsLayer = paintInvalidationContainer->layer()->graphicsLayerBackingForScrolling(); if (!newGraphicsLayer) return; m_clipLayer->setTransform(SkMatrix44(SkMatrix44::kIdentity_Constructor)); if (m_currentGraphicsLayer != newGraphicsLayer) { if (m_currentGraphicsLayer) clearGraphicsLayerLinkHighlightPointer(); m_currentGraphicsLayer = newGraphicsLayer; m_currentGraphicsLayer->addLinkHighlight(this); } }
void LinkHighlight::attachLinkHighlightToCompositingLayer(const RenderLayerModelObject* paintInvalidationContainer) { // FIXME: there should always be a GraphicsLayer. See https://code.google.com/p/chromium/issues/detail?id=359877. GraphicsLayer* newGraphicsLayer = paintInvalidationContainer->layer()->graphicsLayerBacking(); if (newGraphicsLayer && !newGraphicsLayer->drawsContent()) newGraphicsLayer = paintInvalidationContainer->layer()->graphicsLayerBackingForScrolling(); if (!newGraphicsLayer) return; m_clipLayer->setTransform(SkMatrix44(SkMatrix44::kIdentity_Constructor)); if (m_currentGraphicsLayer != newGraphicsLayer) { if (m_currentGraphicsLayer) clearGraphicsLayerLinkHighlightPointer(); m_currentGraphicsLayer = newGraphicsLayer; m_currentGraphicsLayer->addLinkHighlight(this); } }
RenderLayer* LinkHighlight::computeEnclosingCompositingLayer() { if (!m_node || !m_node->renderer()) return 0; // Find the nearest enclosing composited layer and attach to it. We may need to cross frame boundaries // to find a suitable layer. RenderObject* renderer = m_node->renderer(); RenderLayerModelObject* repaintContainer; do { repaintContainer = renderer->containerForRepaint(); if (!repaintContainer) { renderer = renderer->frame()->ownerRenderer(); if (!renderer) return 0; } } while (!repaintContainer); RenderLayer* renderLayer = repaintContainer->layer(); if (!renderLayer || renderLayer->compositingState() == NotComposited) return 0; GraphicsLayer* newGraphicsLayer = renderLayer->compositedLayerMapping()->mainGraphicsLayer(); m_clipLayer->setTransform(SkMatrix44()); if (!newGraphicsLayer->drawsContent()) { if (renderLayer->scrollableArea() && renderLayer->scrollableArea()->usesCompositedScrolling()) { ASSERT(renderLayer->hasCompositedLayerMapping() && renderLayer->compositedLayerMapping()->scrollingContentsLayer()); newGraphicsLayer = renderLayer->compositedLayerMapping()->scrollingContentsLayer(); } } if (m_currentGraphicsLayer != newGraphicsLayer) { if (m_currentGraphicsLayer) clearGraphicsLayerLinkHighlightPointer(); m_currentGraphicsLayer = newGraphicsLayer; m_currentGraphicsLayer->addLinkHighlight(this); } return renderLayer; }
RenderLayer* LinkHighlight::computeEnclosingCompositingLayer() { if (!m_node || !m_node->renderer()) return 0; RenderLayer* renderLayer = m_node->renderer()->enclosingLayer(); // Find the nearest enclosing composited layer and attach to it. We may need to cross frame boundaries // to find a suitable layer. while (renderLayer && !renderLayer->isComposited()) { if (!renderLayer->parent()) { // See if we've reached the root in an enclosed frame. if (renderLayer->renderer()->frame()->ownerRenderer()) renderLayer = renderLayer->renderer()->frame()->ownerRenderer()->enclosingLayer(); else renderLayer = 0; } else renderLayer = renderLayer->parent(); } if (!renderLayer || !renderLayer->isComposited()) return 0; GraphicsLayerChromium* newGraphicsLayer = static_cast<GraphicsLayerChromium*>(renderLayer->backing()->graphicsLayer()); m_clipLayer->setSublayerTransform(SkMatrix44()); if (!newGraphicsLayer->drawsContent()) { m_clipLayer->setSublayerTransform(newGraphicsLayer->platformLayer()->transform()); newGraphicsLayer = static_cast<GraphicsLayerChromium*>(m_owningWebViewImpl->nonCompositedContentHost()->topLevelRootLayer()); } if (m_currentGraphicsLayer != newGraphicsLayer) { if (m_currentGraphicsLayer) clearGraphicsLayerLinkHighlightPointer(); m_currentGraphicsLayer = newGraphicsLayer; m_currentGraphicsLayer->setLinkHighlight(this); } return renderLayer; }
RenderLayer* LinkHighlight::computeEnclosingCompositingLayer() { if (!m_node || !m_node->renderer()) return 0; // Find the nearest enclosing composited layer and attach to it. We may need to cross frame boundaries // to find a suitable layer. RenderObject* renderer = m_node->renderer(); RenderLayer* renderLayer; do { renderLayer = renderer->enclosingLayer()->enclosingCompositingLayerForRepaint(); if (!renderLayer) { renderer = renderer->frame()->ownerRenderer(); if (!renderer) return 0; } } while (!renderLayer); CompositedLayerMappingPtr compositedLayerMapping = renderLayer->compositingState() == PaintsIntoGroupedBacking ? renderLayer->groupedMapping() : renderLayer->compositedLayerMapping(); GraphicsLayer* newGraphicsLayer = renderLayer->compositingState() == PaintsIntoGroupedBacking ? compositedLayerMapping->squashingLayer() : compositedLayerMapping->mainGraphicsLayer(); m_clipLayer->setTransform(SkMatrix44(SkMatrix44::kIdentity_Constructor)); if (!newGraphicsLayer->drawsContent()) { if (renderLayer->scrollableArea() && renderLayer->scrollableArea()->usesCompositedScrolling()) { ASSERT(renderLayer->hasCompositedLayerMapping() && renderLayer->compositedLayerMapping()->scrollingContentsLayer()); newGraphicsLayer = compositedLayerMapping->scrollingContentsLayer(); } } if (m_currentGraphicsLayer != newGraphicsLayer) { if (m_currentGraphicsLayer) clearGraphicsLayerLinkHighlightPointer(); m_currentGraphicsLayer = newGraphicsLayer; m_currentGraphicsLayer->addLinkHighlight(this); } return renderLayer; }
RenderLayer* LinkHighlight::computeEnclosingCompositingLayer() { if (!m_node || !m_node->renderer()) return 0; // Find the nearest enclosing composited layer and attach to it. We may need to cross frame boundaries // to find a suitable layer. RenderLayerModelObject* renderer = toRenderLayerModelObject(m_node->renderer()); RenderLayerModelObject* repaintContainer; do { repaintContainer = renderer->containerForRepaint(); if (!repaintContainer) { renderer = renderer->frame()->ownerRenderer(); if (!renderer) return 0; } } while (!repaintContainer); RenderLayer* renderLayer = repaintContainer->layer(); if (!renderLayer || !renderLayer->isComposited()) return 0; GraphicsLayerChromium* newGraphicsLayer = static_cast<GraphicsLayerChromium*>(renderLayer->backing()->graphicsLayer()); m_clipLayer->setSublayerTransform(SkMatrix44()); m_usingNonCompositedContentHost = !newGraphicsLayer->drawsContent(); if (m_usingNonCompositedContentHost ) { m_clipLayer->setSublayerTransform(newGraphicsLayer->platformLayer()->transform()); newGraphicsLayer = static_cast<GraphicsLayerChromium*>(m_owningWebViewImpl->nonCompositedContentHost()->topLevelRootLayer()); } if (m_currentGraphicsLayer != newGraphicsLayer) { if (m_currentGraphicsLayer) clearGraphicsLayerLinkHighlightPointer(); m_currentGraphicsLayer = newGraphicsLayer; m_currentGraphicsLayer->setLinkHighlight(this); } return renderLayer; }
void LinkHighlight::updateGeometry() { // To avoid unnecessary updates (e.g. other entities have requested animations from our WebViewImpl), // only proceed if we actually requested an update. if (!m_geometryNeedsUpdate) return; m_geometryNeedsUpdate = false; RenderLayer* compositingLayer = computeEnclosingCompositingLayer(); if (compositingLayer && computeHighlightLayerPathAndPosition(compositingLayer)) { // We only need to invalidate the layer if the highlight size has changed, otherwise // we can just re-position the layer without needing to repaint. m_contentLayer->layer()->invalidate(); if (m_currentGraphicsLayer) m_currentGraphicsLayer->addRepaintRect(FloatRect(layer()->position().x, layer()->position().y, layer()->bounds().width, layer()->bounds().height)); } else if (!m_node || !m_node->renderer()) { clearGraphicsLayerLinkHighlightPointer(); releaseResources(); } }
void LinkHighlightImpl::attachLinkHighlightToCompositingLayer(const LayoutBoxModelObject& paintInvalidationContainer) { GraphicsLayer* newGraphicsLayer = paintInvalidationContainer.layer()->graphicsLayerBacking(); m_isScrollingGraphicsLayer = false; // FIXME: There should always be a GraphicsLayer. See crbug.com/431961. if (paintInvalidationContainer.layer()->needsCompositedScrolling() && m_node->layoutObject() != &paintInvalidationContainer) { newGraphicsLayer = paintInvalidationContainer.layer()->graphicsLayerBackingForScrolling(); m_isScrollingGraphicsLayer = true; } if (!newGraphicsLayer) return; m_clipLayer->setTransform(SkMatrix44(SkMatrix44::kIdentity_Constructor)); if (m_currentGraphicsLayer != newGraphicsLayer) { if (m_currentGraphicsLayer) clearGraphicsLayerLinkHighlightPointer(); m_currentGraphicsLayer = newGraphicsLayer; m_currentGraphicsLayer->addLinkHighlight(this); } }
LinkHighlight::~LinkHighlight() { clearGraphicsLayerLinkHighlightPointer(); releaseResources(); }