void LinkHighlight::startHighlightAnimationIfNeeded() { if (m_isAnimating) return; m_isAnimating = true; const float startOpacity = 1; // FIXME: Should duration be configurable? const float fadeDuration = 0.1f; const float minPreFadeDuration = 0.1f; m_contentLayer->layer()->setOpacity(startOpacity); WebCompositorSupport* compositorSupport = Platform::current()->compositorSupport(); OwnPtr<WebFloatAnimationCurve> curve = adoptPtr(compositorSupport->createFloatAnimationCurve()); curve->add(WebFloatKeyframe(0, startOpacity)); // Make sure we have displayed for at least minPreFadeDuration before starting to fade out. float extraDurationRequired = std::max(0.f, minPreFadeDuration - static_cast<float>(monotonicallyIncreasingTime() - m_startTime)); if (extraDurationRequired) curve->add(WebFloatKeyframe(extraDurationRequired, startOpacity)); // For layout tests we don't fade out. curve->add(WebFloatKeyframe(fadeDuration + extraDurationRequired, blink::layoutTestMode() ? startOpacity : 0)); OwnPtr<WebAnimation> animation = adoptPtr(compositorSupport->createAnimation(*curve, WebAnimation::TargetPropertyOpacity)); m_contentLayer->layer()->setDrawsContent(true); m_contentLayer->layer()->addAnimation(animation.leakPtr()); invalidate(); m_owningWebViewImpl->scheduleAnimation(); }
void LinkHighlight::startHighlightAnimation() { const float startOpacity = 1; // FIXME: Should duration be configurable? const float duration = 0.1f; m_contentLayer->layer()->setOpacity(startOpacity); WebCompositorSupport* compositorSupport = Platform::current()->compositorSupport(); OwnPtr<WebFloatAnimationCurve> curve = adoptPtr(compositorSupport->createFloatAnimationCurve()); curve->add(WebFloatKeyframe(0, startOpacity)); curve->add(WebFloatKeyframe(duration / 2, startOpacity)); // For layout tests we don't fade out. curve->add(WebFloatKeyframe(duration, WebKit::layoutTestMode() ? startOpacity : 0)); m_animation = adoptPtr(compositorSupport->createAnimation(*curve, WebAnimation::TargetPropertyOpacity)); m_contentLayer->layer()->setDrawsContent(true); m_contentLayer->layer()->addAnimation(m_animation.get()); invalidate(); m_owningWebViewImpl->scheduleAnimation(); }
LinkHighlightImpl::LinkHighlightImpl(Node* node, WebViewImpl* owningWebViewImpl) : m_node(node) , m_owningWebViewImpl(owningWebViewImpl) , m_currentGraphicsLayer(0) , m_geometryNeedsUpdate(false) , m_isAnimating(false) , m_startTime(monotonicallyIncreasingTime()) { ASSERT(m_node); ASSERT(owningWebViewImpl); WebCompositorSupport* compositorSupport = Platform::current()->compositorSupport(); ASSERT(compositorSupport); m_contentLayer = adoptPtr(compositorSupport->createContentLayer(this)); m_clipLayer = adoptPtr(compositorSupport->createLayer()); m_clipLayer->setTransformOrigin(WebFloatPoint3D()); m_clipLayer->addChild(m_contentLayer->layer()); if (RuntimeEnabledFeatures::compositorAnimationTimelinesEnabled()) { m_compositorPlayer = adoptPtr(compositorSupport->createAnimationPlayer()); ASSERT(m_compositorPlayer); m_compositorPlayer->setAnimationDelegate(this); if (m_owningWebViewImpl->linkHighlightsTimeline()) m_owningWebViewImpl->linkHighlightsTimeline()->playerAttached(*this); m_compositorPlayer->attachLayer(m_contentLayer->layer()); } else { owningWebViewImpl->registerForAnimations(m_contentLayer->layer()); m_contentLayer->layer()->setAnimationDelegate(this); } m_contentLayer->layer()->setDrawsContent(true); m_contentLayer->layer()->setOpacity(1); m_geometryNeedsUpdate = true; updateGeometry(); }
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; }
LinkHighlight::LinkHighlight(Node* node, WebViewImpl* owningWebViewImpl) : m_node(node) , m_owningWebViewImpl(owningWebViewImpl) , m_currentGraphicsLayer(0) , m_geometryNeedsUpdate(false) { ASSERT(m_node); ASSERT(owningWebViewImpl); WebCompositorSupport* compositorSupport = Platform::current()->compositorSupport(); m_contentLayer = adoptPtr(compositorSupport->createContentLayer(this)); m_clipLayer = adoptPtr(compositorSupport->createLayer()); m_clipLayer->setAnchorPoint(WebFloatPoint()); m_clipLayer->addChild(m_contentLayer->layer()); m_contentLayer->layer()->setDrawsContent(false); // We don't want to show the highlight until startAnimation is called, even though the highlight // layer may be added to the tree immediately. m_contentLayer->layer()->setOpacity(0); m_contentLayer->layer()->setAnimationDelegate(this); }
LinkHighlight::LinkHighlight(Node* node, WebViewImpl* owningWebViewImpl) : m_node(node) , m_owningWebViewImpl(owningWebViewImpl) , m_currentGraphicsLayer(0) , m_geometryNeedsUpdate(false) , m_isAnimating(false) , m_startTime(monotonicallyIncreasingTime()) { ASSERT(m_node); ASSERT(owningWebViewImpl); WebCompositorSupport* compositorSupport = Platform::current()->compositorSupport(); m_contentLayer = adoptPtr(compositorSupport->createContentLayer(this)); m_clipLayer = adoptPtr(compositorSupport->createLayer()); m_clipLayer->setAnchorPoint(WebFloatPoint()); m_clipLayer->addChild(m_contentLayer->layer()); m_contentLayer->layer()->setAnimationDelegate(this); m_contentLayer->layer()->setDrawsContent(true); m_contentLayer->layer()->setOpacity(1); m_geometryNeedsUpdate = true; updateGeometry(); }