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));
}
Esempio n. 3
0
// 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);
}