TEST_P(CompositorWorkerTest, disconnectedProxies) { // This case is identical to compositor-proxy-basic, but the proxies are // disconnected (the result should be the same as // compositor-proxy-plumbing-no-proxies). registerMockedHttpURLLoad("compositor-proxy-basic-disconnected.html"); navigateTo(m_baseURL + "compositor-proxy-basic-disconnected.html"); forceFullCompositingUpdate(); Document* document = frame()->document(); Element* tallElement = document->getElementById("tall"); WebLayer* tallLayer = webLayerFromElement(tallElement); EXPECT_TRUE(!tallLayer); Element* proxiedElement = document->getElementById("proxied"); WebLayer* proxiedLayer = webLayerFromElement(proxiedElement); EXPECT_TRUE(!proxiedLayer); Element* scrollElement = document->getElementById("proxied-scroller"); WebLayer* scrollLayer = scrollingWebLayerFromElement(scrollElement); EXPECT_FALSE(!!scrollLayer->compositorMutableProperties()); WebLayer* rootScrollLayer = getRootScrollLayer(); EXPECT_FALSE(!!rootScrollLayer->compositorMutableProperties()); }
TEST_P(CompositorWorkerTest, noProxies) { // This case is identical to compositor-proxy-basic, but no proxies have // actually been created. registerMockedHttpURLLoad("compositor-proxy-plumbing-no-proxies.html"); navigateTo(m_baseURL + "compositor-proxy-plumbing-no-proxies.html"); forceFullCompositingUpdate(); Document* document = frame()->document(); Element* tallElement = document->getElementById("tall"); WebLayer* tallLayer = webLayerFromElement(tallElement); EXPECT_TRUE(!tallLayer); Element* proxiedElement = document->getElementById("proxied"); WebLayer* proxiedLayer = webLayerFromElement(proxiedElement); EXPECT_TRUE(!proxiedLayer); // Note: we presume the existance of mutable properties implies that the the // element has a corresponding compositor proxy. Element ids (which are also // used by animations) do not have this implication, so we do not check for // them here. Element* scrollElement = document->getElementById("proxied-scroller"); WebLayer* scrollLayer = scrollingWebLayerFromElement(scrollElement); EXPECT_FALSE(!!scrollLayer->compositorMutableProperties()); WebLayer* rootScrollLayer = getRootScrollLayer(); EXPECT_FALSE(!!rootScrollLayer->compositorMutableProperties()); }
TEST_P(CompositorWorkerTest, applyingMutationsMultipleElements) { registerMockedHttpURLLoad("compositor-proxy-basic.html"); navigateTo(m_baseURL + "compositor-proxy-basic.html"); Document* document = frame()->document(); { forceFullCompositingUpdate(); Element* proxiedElement = document->getElementById("proxied-transform"); WebLayer* proxiedLayer = webLayerFromElement(proxiedElement); EXPECT_TRUE(proxiedLayer->compositorMutableProperties() & CompositorMutableProperty::kTransform); EXPECT_FALSE(proxiedLayer->compositorMutableProperties() & (CompositorMutableProperty::kScrollLeft | CompositorMutableProperty::kScrollTop | CompositorMutableProperty::kOpacity)); EXPECT_TRUE(proxiedLayer->elementId()); TransformationMatrix transformMatrix(11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44); CompositorMutation mutation; mutation.setTransform(TransformationMatrix::toSkMatrix44(transformMatrix)); proxiedElement->updateFromCompositorMutation(mutation); forceFullCompositingUpdate(); const String& cssValue = document->domWindow() ->getComputedStyle(proxiedElement, String()) ->getPropertyValueInternal(CSSPropertyTransform); EXPECT_EQ( "matrix3d(11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, " "44)", cssValue); } { Element* proxiedElement = document->getElementById("proxied-opacity"); WebLayer* proxiedLayer = webLayerFromElement(proxiedElement); EXPECT_TRUE(proxiedLayer->compositorMutableProperties() & CompositorMutableProperty::kOpacity); EXPECT_FALSE(proxiedLayer->compositorMutableProperties() & (CompositorMutableProperty::kScrollLeft | CompositorMutableProperty::kScrollTop | CompositorMutableProperty::kTransform)); EXPECT_TRUE(proxiedLayer->elementId()); CompositorMutation mutation; mutation.setOpacity(0.5); proxiedElement->updateFromCompositorMutation(mutation); forceFullCompositingUpdate(); const String& cssValue = document->domWindow() ->getComputedStyle(proxiedElement, String()) ->getPropertyValueInternal(CSSPropertyOpacity); EXPECT_EQ("0.5", cssValue); } }
TEST_P(CompositorWorkerTest, plumbingElementIdAndMutableProperties) { registerMockedHttpURLLoad("compositor-proxy-basic.html"); navigateTo(m_baseURL + "compositor-proxy-basic.html"); forceFullCompositingUpdate(); Document* document = frame()->document(); Element* tallElement = document->getElementById("tall"); WebLayer* tallLayer = webLayerFromElement(tallElement); EXPECT_TRUE(!tallLayer); Element* proxiedElement = document->getElementById("proxied-transform"); WebLayer* proxiedLayer = webLayerFromElement(proxiedElement); EXPECT_TRUE(proxiedLayer->compositorMutableProperties() & CompositorMutableProperty::kTransform); EXPECT_FALSE(proxiedLayer->compositorMutableProperties() & (CompositorMutableProperty::kScrollLeft | CompositorMutableProperty::kScrollTop | CompositorMutableProperty::kOpacity)); EXPECT_TRUE(proxiedLayer->elementId()); Element* scrollElement = document->getElementById("proxied-scroller"); WebLayer* scrollLayer = scrollingWebLayerFromElement(scrollElement); EXPECT_TRUE(scrollLayer->compositorMutableProperties() & (CompositorMutableProperty::kScrollLeft | CompositorMutableProperty::kScrollTop)); EXPECT_FALSE(scrollLayer->compositorMutableProperties() & (CompositorMutableProperty::kTransform | CompositorMutableProperty::kOpacity)); EXPECT_TRUE(scrollLayer->elementId()); WebLayer* rootScrollLayer = getRootScrollLayer(); EXPECT_TRUE(rootScrollLayer->compositorMutableProperties() & (CompositorMutableProperty::kScrollLeft | CompositorMutableProperty::kScrollTop)); EXPECT_FALSE(rootScrollLayer->compositorMutableProperties() & (CompositorMutableProperty::kTransform | CompositorMutableProperty::kOpacity)); EXPECT_TRUE(rootScrollLayer->elementId()); }
TEST_P(CompositorWorkerTest, applyingMutationsMultipleProperties) { registerMockedHttpURLLoad("compositor-proxy-basic.html"); navigateTo(m_baseURL + "compositor-proxy-basic.html"); Document* document = frame()->document(); forceFullCompositingUpdate(); Element* proxiedElement = document->getElementById("proxied-transform-and-opacity"); WebLayer* proxiedLayer = webLayerFromElement(proxiedElement); EXPECT_TRUE(proxiedLayer->compositorMutableProperties() & CompositorMutableProperty::kTransform); EXPECT_TRUE(proxiedLayer->compositorMutableProperties() & CompositorMutableProperty::kOpacity); EXPECT_FALSE(proxiedLayer->compositorMutableProperties() & (CompositorMutableProperty::kScrollLeft | CompositorMutableProperty::kScrollTop)); EXPECT_TRUE(proxiedLayer->elementId()); TransformationMatrix transformMatrix(11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, 44); std::unique_ptr<CompositorMutation> mutation = wrapUnique(new CompositorMutation); mutation->setTransform(TransformationMatrix::toSkMatrix44(transformMatrix)); mutation->setOpacity(0.5); proxiedElement->updateFromCompositorMutation(*mutation); { const String& transformValue = document->domWindow() ->getComputedStyle(proxiedElement, String()) ->getPropertyValueInternal(CSSPropertyTransform); EXPECT_EQ( "matrix3d(11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, " "44)", transformValue); const String& opacityValue = document->domWindow() ->getComputedStyle(proxiedElement, String()) ->getPropertyValueInternal(CSSPropertyOpacity); EXPECT_EQ("0.5", opacityValue); } // Verify that updating one property does not impact others mutation = wrapUnique(new CompositorMutation); mutation->setOpacity(0.8); proxiedElement->updateFromCompositorMutation(*mutation); { const String& transformValue = document->domWindow() ->getComputedStyle(proxiedElement, String()) ->getPropertyValueInternal(CSSPropertyTransform); EXPECT_EQ( "matrix3d(11, 12, 13, 14, 21, 22, 23, 24, 31, 32, 33, 34, 41, 42, 43, " "44)", transformValue); const String& opacityValue = document->domWindow() ->getComputedStyle(proxiedElement, String()) ->getPropertyValueInternal(CSSPropertyOpacity); EXPECT_EQ("0.8", opacityValue); } }
TEST_F(ScrollingCoordinatorTest, fastScrollingForFixedPosition) { registerMockedHttpURLLoad("fixed-position.html"); navigateTo(m_baseURL + "fixed-position.html"); forceFullCompositingUpdate(); // Fixed position should not fall back to main thread scrolling. WebLayer* rootScrollLayer = getRootScrollLayer(); ASSERT_FALSE(rootScrollLayer->shouldScrollOnMainThread()); Document* document = frame()->document(); { Element* element = document->getElementById("div-tl"); ASSERT_TRUE(element); WebLayer* layer = webLayerFromElement(element); ASSERT_TRUE(layer); WebLayerPositionConstraint constraint = layer->positionConstraint(); ASSERT_TRUE(constraint.isFixedPosition); ASSERT_TRUE(!constraint.isFixedToRightEdge && !constraint.isFixedToBottomEdge); } { Element* element = document->getElementById("div-tr"); ASSERT_TRUE(element); WebLayer* layer = webLayerFromElement(element); ASSERT_TRUE(layer); WebLayerPositionConstraint constraint = layer->positionConstraint(); ASSERT_TRUE(constraint.isFixedPosition); ASSERT_TRUE(constraint.isFixedToRightEdge && !constraint.isFixedToBottomEdge); } { Element* element = document->getElementById("div-bl"); ASSERT_TRUE(element); WebLayer* layer = webLayerFromElement(element); ASSERT_TRUE(layer); WebLayerPositionConstraint constraint = layer->positionConstraint(); ASSERT_TRUE(constraint.isFixedPosition); ASSERT_TRUE(!constraint.isFixedToRightEdge && constraint.isFixedToBottomEdge); } { Element* element = document->getElementById("div-br"); ASSERT_TRUE(element); WebLayer* layer = webLayerFromElement(element); ASSERT_TRUE(layer); WebLayerPositionConstraint constraint = layer->positionConstraint(); ASSERT_TRUE(constraint.isFixedPosition); ASSERT_TRUE(constraint.isFixedToRightEdge && constraint.isFixedToBottomEdge); } { Element* element = document->getElementById("span-tl"); ASSERT_TRUE(element); WebLayer* layer = webLayerFromElement(element); ASSERT_TRUE(layer); WebLayerPositionConstraint constraint = layer->positionConstraint(); ASSERT_TRUE(constraint.isFixedPosition); ASSERT_TRUE(!constraint.isFixedToRightEdge && !constraint.isFixedToBottomEdge); } { Element* element = document->getElementById("span-tr"); ASSERT_TRUE(element); WebLayer* layer = webLayerFromElement(element); ASSERT_TRUE(layer); WebLayerPositionConstraint constraint = layer->positionConstraint(); ASSERT_TRUE(constraint.isFixedPosition); ASSERT_TRUE(constraint.isFixedToRightEdge && !constraint.isFixedToBottomEdge); } { Element* element = document->getElementById("span-bl"); ASSERT_TRUE(element); WebLayer* layer = webLayerFromElement(element); ASSERT_TRUE(layer); WebLayerPositionConstraint constraint = layer->positionConstraint(); ASSERT_TRUE(constraint.isFixedPosition); ASSERT_TRUE(!constraint.isFixedToRightEdge && constraint.isFixedToBottomEdge); } { Element* element = document->getElementById("span-br"); ASSERT_TRUE(element); WebLayer* layer = webLayerFromElement(element); ASSERT_TRUE(layer); WebLayerPositionConstraint constraint = layer->positionConstraint(); ASSERT_TRUE(constraint.isFixedPosition); ASSERT_TRUE(constraint.isFixedToRightEdge && constraint.isFixedToBottomEdge); } }