Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1224)

Unified Diff: third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp

Issue 2736523002: Defer ChromeClient::attachRootGraphicsLayer until after compositing update. (Closed)
Patch Set: rebase Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
diff --git a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
index 960e797a567a0e278c8e0bfb066efd0e17373b59..bbec9cc709b2b97c012475e59f22f59da8e7afd0 100644
--- a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
+++ b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
@@ -461,6 +461,14 @@ void PaintLayerCompositor::updateIfNeeded() {
layersNeedingPaintInvalidation[i]->layoutObject());
}
+ if (m_rootLayerAttachment == RootLayerPendingAttachViaChromeClient) {
+ if (Page* page = m_layoutView.frame()->page()) {
+ page->chromeClient().attachRootGraphicsLayer(rootGraphicsLayer(),
+ m_layoutView.frame());
+ m_rootLayerAttachment = RootLayerAttachedViaChromeClient;
+ }
+ }
+
// Inform the inspector that the layer tree has changed.
if (isMainFrame())
probe::layerTreeDidChange(m_layoutView.frame());
@@ -566,7 +574,7 @@ bool PaintLayerCompositor::allocateOrClearCompositedLayerMapping(
PaintLayerCompositor* innerCompositor =
frameContentsCompositor(toLayoutPart(layer->layoutObject()));
if (innerCompositor && innerCompositor->staleInCompositingMode())
- innerCompositor->updateRootLayerAttachment();
+ innerCompositor->ensureRootLayer();
}
if (compositedLayerMappingChanged) {
@@ -751,7 +759,7 @@ bool PaintLayerCompositor::attachFrameContentLayersToIframeLayer(
LayoutPart& layoutObject) {
PaintLayerCompositor* innerCompositor = frameContentsCompositor(layoutObject);
if (!innerCompositor || !innerCompositor->staleInCompositingMode() ||
- innerCompositor->getRootLayerAttachment() !=
+ innerCompositor->m_rootLayerAttachment !=
RootLayerAttachedViaEnclosingFrame)
return false;
@@ -817,11 +825,8 @@ void PaintLayerCompositor::setIsInWindow(bool isInWindow) {
if (m_rootLayerAttachment != RootLayerUnattached)
return;
- RootLayerAttachment attachment = m_layoutView.frame()->isLocalRoot()
- ? RootLayerAttachedViaChromeClient
- : RootLayerAttachedViaEnclosingFrame;
attachCompositorTimeline();
- attachRootLayer(attachment);
+ attachRootLayer();
} else {
if (m_rootLayerAttachment == RootLayerUnattached)
return;
@@ -1110,10 +1115,7 @@ void PaintLayerCompositor::updateOverflowControlsLayers() {
}
void PaintLayerCompositor::ensureRootLayer() {
- RootLayerAttachment expectedAttachment =
- m_layoutView.frame()->isLocalRoot() ? RootLayerAttachedViaChromeClient
- : RootLayerAttachedViaEnclosingFrame;
- if (expectedAttachment == m_rootLayerAttachment)
+ if (m_rootLayerAttachment != RootLayerUnattached)
return;
if (isMainFrame())
@@ -1163,14 +1165,8 @@ void PaintLayerCompositor::ensureRootLayer() {
frameViewDidChangeSize();
}
- // Check to see if we have to change the attachment
- if (m_rootLayerAttachment != RootLayerUnattached) {
- detachRootLayer();
- detachCompositorTimeline();
- }
-
attachCompositorTimeline();
- attachRootLayer(expectedAttachment);
+ attachRootLayer();
}
void PaintLayerCompositor::destroyRootLayer() {
@@ -1215,7 +1211,7 @@ void PaintLayerCompositor::destroyRootLayer() {
m_rootContentLayer = nullptr;
}
-void PaintLayerCompositor::attachRootLayer(RootLayerAttachment attachment) {
+void PaintLayerCompositor::attachRootLayer() {
if (!m_rootContentLayer)
return;
@@ -1224,31 +1220,17 @@ void PaintLayerCompositor::attachRootLayer(RootLayerAttachment attachment) {
if (RuntimeEnabledFeatures::slimmingPaintV2Enabled())
return;
- switch (attachment) {
- case RootLayerUnattached:
- ASSERT_NOT_REACHED();
- break;
- case RootLayerAttachedViaChromeClient: {
- LocalFrame& frame = m_layoutView.frameView()->frame();
- Page* page = frame.page();
- if (!page)
- return;
- page->chromeClient().attachRootGraphicsLayer(rootGraphicsLayer(), &frame);
- break;
- }
- case RootLayerAttachedViaEnclosingFrame: {
- HTMLFrameOwnerElement* ownerElement =
- m_layoutView.document().localOwner();
- ASSERT(ownerElement);
- // The layer will get hooked up via
- // CompositedLayerMapping::updateGraphicsLayerConfiguration() for the
- // frame's layoutObject in the parent document.
- ownerElement->setNeedsCompositingUpdate();
- break;
- }
+ if (m_layoutView.frame()->isLocalRoot()) {
+ m_rootLayerAttachment = RootLayerPendingAttachViaChromeClient;
+ } else {
+ HTMLFrameOwnerElement* ownerElement = m_layoutView.document().localOwner();
+ DCHECK(ownerElement);
+ // The layer will get hooked up via
+ // CompositedLayerMapping::updateGraphicsLayerConfiguration() for the
+ // frame's layoutObject in the parent document.
+ ownerElement->setNeedsCompositingUpdate();
+ m_rootLayerAttachment = RootLayerAttachedViaEnclosingFrame;
}
-
- m_rootLayerAttachment = attachment;
}
void PaintLayerCompositor::detachRootLayer() {
@@ -1278,6 +1260,7 @@ void PaintLayerCompositor::detachRootLayer() {
page->chromeClient().attachRootGraphicsLayer(0, &frame);
break;
}
+ case RootLayerPendingAttachViaChromeClient:
case RootLayerUnattached:
break;
}
@@ -1285,10 +1268,6 @@ void PaintLayerCompositor::detachRootLayer() {
m_rootLayerAttachment = RootLayerUnattached;
}
-void PaintLayerCompositor::updateRootLayerAttachment() {
- ensureRootLayer();
-}
-
void PaintLayerCompositor::attachCompositorTimeline() {
LocalFrame& frame = m_layoutView.frameView()->frame();
Page* page = frame.page();

Powered by Google App Engine
This is Rietveld 408576698