| Index: third_party/WebKit/Source/web/tests/FrameThrottlingTest.cpp
|
| diff --git a/third_party/WebKit/Source/web/tests/FrameThrottlingTest.cpp b/third_party/WebKit/Source/web/tests/FrameThrottlingTest.cpp
|
| index 7007af24ffcac6419e1891fee01c68de6e51b79f..83b60d8d5da1fd161c99657427254c535d23e18b 100644
|
| --- a/third_party/WebKit/Source/web/tests/FrameThrottlingTest.cpp
|
| +++ b/third_party/WebKit/Source/web/tests/FrameThrottlingTest.cpp
|
| @@ -833,6 +833,11 @@ TEST_P(FrameThrottlingTest, PaintingViaContentLayerDelegateIsThrottled) {
|
| frame_resource.Complete("throttled");
|
| CompositeFrame();
|
|
|
| + // Before the iframe is throttled, we should create all drawing items.
|
| + MockWebDisplayItemList display_items_not_throttled;
|
| + EXPECT_CALL(display_items_not_throttled, AppendDrawingItem(_, _, _)).Times(3);
|
| + PaintRecursively(WebView().RootGraphicsLayer(), &display_items_not_throttled);
|
| +
|
| // Move the frame offscreen to throttle it and make sure it is backed by a
|
| // graphics layer.
|
| auto* frame_element =
|
| @@ -846,11 +851,93 @@ TEST_P(FrameThrottlingTest, PaintingViaContentLayerDelegateIsThrottled) {
|
|
|
| // If painting of the iframe is throttled, we should only receive two
|
| // drawing items.
|
| - MockWebDisplayItemList display_items;
|
| - EXPECT_CALL(display_items, AppendDrawingItem(_, _, _)).Times(2);
|
| + MockWebDisplayItemList display_items_throttled;
|
| + EXPECT_CALL(display_items_throttled, AppendDrawingItem(_, _, _)).Times(2);
|
| + PaintRecursively(WebView().RootGraphicsLayer(), &display_items_throttled);
|
| +}
|
| +
|
| +TEST_P(FrameThrottlingTest, ThrottleInnerCompositedLayer) {
|
| + WebView().GetSettings()->SetAcceleratedCompositingEnabled(true);
|
| + WebView().GetSettings()->SetPreferCompositingToLCDTextEnabled(true);
|
|
|
| - GraphicsLayer* layer = WebView().RootGraphicsLayer();
|
| - PaintRecursively(layer, &display_items);
|
| + // Create a hidden frame which is throttled.
|
| + SimRequest main_resource("https://example.com/", "text/html");
|
| + SimRequest frame_resource("https://example.com/iframe.html", "text/html");
|
| +
|
| + LoadURL("https://example.com/");
|
| + main_resource.Complete("<iframe id=frame sandbox src=iframe.html></iframe>");
|
| + frame_resource.Complete(
|
| + "<div id=div style='will-change: transform; background: blue'>DIV</div>");
|
| + CompositeFrame();
|
| +
|
| + auto* frame_element =
|
| + toHTMLIFrameElement(GetDocument().getElementById("frame"));
|
| + // The inner div is composited.
|
| + auto* inner_div = frame_element->contentDocument()->getElementById("div");
|
| + EXPECT_NE(nullptr,
|
| + inner_div->GetLayoutBox()->Layer()->GraphicsLayerBacking());
|
| +
|
| + // Before the iframe is throttled, we should create all drawing items.
|
| + MockWebDisplayItemList display_items_not_throttled;
|
| + EXPECT_CALL(display_items_not_throttled, AppendDrawingItem(_, _, _)).Times(4);
|
| + PaintRecursively(WebView().RootGraphicsLayer(), &display_items_not_throttled);
|
| +
|
| + // Move the frame offscreen to throttle it.
|
| + frame_element->setAttribute(styleAttr, "transform: translateY(480px)");
|
| + EXPECT_FALSE(
|
| + frame_element->contentDocument()->View()->CanThrottleRendering());
|
| + CompositeFrame();
|
| + EXPECT_TRUE(frame_element->contentDocument()->View()->CanThrottleRendering());
|
| + // The inner div should still be composited.
|
| + EXPECT_NE(nullptr,
|
| + inner_div->GetLayoutBox()->Layer()->GraphicsLayerBacking());
|
| +
|
| + // If painting of the iframe is throttled, we should only receive two
|
| + // drawing items.
|
| + MockWebDisplayItemList display_items_throttled;
|
| + EXPECT_CALL(display_items_throttled, AppendDrawingItem(_, _, _)).Times(2);
|
| + PaintRecursively(WebView().RootGraphicsLayer(), &display_items_throttled);
|
| +
|
| + // Remove compositing trigger of inner_div.
|
| + inner_div->setAttribute(styleAttr, "background: yellow; overflow: hidden");
|
| + // Do an unthrottled style and layout update, simulating the situation
|
| + // triggered by script style/layout access.
|
| + GetDocument().View()->UpdateLifecycleToLayoutClean();
|
| + {
|
| + // And a throttled full lifecycle update.
|
| + DocumentLifecycle::AllowThrottlingScope throttling_scope(
|
| + GetDocument().Lifecycle());
|
| + GetDocument().View()->UpdateAllLifecyclePhases();
|
| + }
|
| + // The inner div should still be composited because compositing update is
|
| + // throttled, though the inner_div's self-painting status has been updated.
|
| + EXPECT_FALSE(inner_div->GetLayoutBox()->Layer()->IsSelfPaintingLayer());
|
| + {
|
| + DisableCompositingQueryAsserts disabler;
|
| + EXPECT_NE(nullptr,
|
| + inner_div->GetLayoutBox()->Layer()->GraphicsLayerBacking());
|
| + }
|
| +
|
| + MockWebDisplayItemList display_items_throttled1;
|
| + EXPECT_CALL(display_items_throttled1, AppendDrawingItem(_, _, _)).Times(2);
|
| + PaintRecursively(WebView().RootGraphicsLayer(), &display_items_throttled1);
|
| +
|
| + // Move the frame back on screen.
|
| + frame_element->setAttribute(styleAttr, "");
|
| + CompositeFrame();
|
| + EXPECT_FALSE(
|
| + frame_element->contentDocument()->View()->CanThrottleRendering());
|
| + CompositeFrame();
|
| + // The inner div is no longer composited.
|
| + EXPECT_EQ(nullptr,
|
| + inner_div->GetLayoutBox()->Layer()->GraphicsLayerBacking());
|
| +
|
| + // After the iframe is unthrottled, we should create all drawing items.
|
| + MockWebDisplayItemList display_items_not_throttled1;
|
| + EXPECT_CALL(display_items_not_throttled1, AppendDrawingItem(_, _, _))
|
| + .Times(4);
|
| + PaintRecursively(WebView().RootGraphicsLayer(),
|
| + &display_items_not_throttled1);
|
| }
|
|
|
| TEST_P(FrameThrottlingTest, ThrottleSubtreeAtomically) {
|
|
|