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

Unified Diff: Source/core/dom/Document.cpp

Issue 18601002: Add infrastructure for partial layouts (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: define RenderObject::frameView in the header Created 7 years, 3 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
« no previous file with comments | « Source/core/dom/Document.h ('k') | Source/core/dom/Element.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/dom/Document.cpp
diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp
index 90a353c3f97e1b6f91a1c2547df6d3355fdbf59d..a52399ed5245a404e8a3d22312e7633f3530e7e0 100644
--- a/Source/core/dom/Document.cpp
+++ b/Source/core/dom/Document.cpp
@@ -156,6 +156,7 @@
#include "core/platform/DateComponents.h"
#include "core/platform/HistogramSupport.h"
#include "core/platform/Language.h"
+#include "core/platform/ScrollbarTheme.h"
#include "core/platform/Timer.h"
#include "core/platform/chromium/TraceEvent.h"
#include "core/platform/network/HTTPParsers.h"
@@ -1823,6 +1824,9 @@ void Document::updateLayout()
if (frameView && renderer() && (frameView->layoutPending() || renderer()->needsLayout()))
frameView->layout();
+ if (frameView)
+ frameView->partialLayout().reset();
+
setNeedsFocusedElementCheck();
}
@@ -1835,6 +1839,31 @@ void Document::setNeedsFocusedElementCheck()
m_didPostCheckFocusedElementTask = true;
}
+void Document::recalcStyleForLayoutIgnoringPendingStylesheets()
+{
+ TemporaryChange<bool> ignorePendingStylesheets(m_ignorePendingStylesheets, m_ignorePendingStylesheets);
+ if (!haveStylesheetsLoaded()) {
+ m_ignorePendingStylesheets = true;
+ // FIXME: We are willing to attempt to suppress painting with outdated style info only once.
+ // Our assumption is that it would be dangerous to try to stop it a second time, after page
+ // content has already been loaded and displayed with accurate style information. (Our
+ // suppression involves blanking the whole page at the moment. If it were more refined, we
+ // might be able to do something better.) It's worth noting though that this entire method
+ // is a hack, since what we really want to do is suspend JS instead of doing a layout with
+ // inaccurate information.
+ HTMLElement* bodyElement = body();
+ if (bodyElement && !bodyElement->renderer() && m_pendingSheetLayout == NoLayoutWithPendingSheets) {
+ m_pendingSheetLayout = DidLayoutWithPendingSheets;
+ styleResolverChanged(RecalcStyleImmediately);
+ } else if (m_hasNodesWithPlaceholderStyle) {
+ // If new nodes have been added or style recalc has been done with style sheets still
+ // pending, some nodes may not have had their real style calculated yet. Normally this
+ // gets cleaned when style sheets arrive but here we need up-to-date style immediately.
+ recalcStyle(Force);
+ }
+ }
+}
+
// FIXME: This is a bad idea and needs to be removed eventually.
// Other browsers load stylesheets before they continue parsing the web page.
// Since we don't, we can run JavaScript code that needs answers before the
@@ -1843,30 +1872,40 @@ void Document::setNeedsFocusedElementCheck()
// to instead suspend JavaScript execution.
void Document::updateLayoutIgnorePendingStylesheets()
{
- bool oldIgnore = m_ignorePendingStylesheets;
+ recalcStyleForLayoutIgnoringPendingStylesheets();
+ updateLayout();
+}
+
+void Document::partialUpdateLayoutIgnorePendingStylesheets(Node* stopLayoutAtNode)
+{
+ // Non-overlay scrollbars can cause a second layout that is dependent
+ // on a first layout. This is disabled for partial layout for now.
+ if (!RuntimeEnabledFeatures::partialLayoutEnabled() || !ScrollbarTheme::theme()->usesOverlayScrollbars()) {
+ updateLayoutIgnorePendingStylesheets();
+ return;
+ }
- if (!haveStylesheetsLoaded()) {
- m_ignorePendingStylesheets = true;
- // FIXME: We are willing to attempt to suppress painting with outdated style info only once. Our assumption is that it would be
- // dangerous to try to stop it a second time, after page content has already been loaded and displayed
- // with accurate style information. (Our suppression involves blanking the whole page at the
- // moment. If it were more refined, we might be able to do something better.)
- // It's worth noting though that this entire method is a hack, since what we really want to do is
- // suspend JS instead of doing a layout with inaccurate information.
- HTMLElement* bodyElement = body();
- if (bodyElement && !bodyElement->renderer() && m_pendingSheetLayout == NoLayoutWithPendingSheets) {
- m_pendingSheetLayout = DidLayoutWithPendingSheets;
- styleResolverChanged(RecalcStyleImmediately);
- } else if (m_hasNodesWithPlaceholderStyle)
- // If new nodes have been added or style recalc has been done with style sheets still pending, some nodes
- // may not have had their real style calculated yet. Normally this gets cleaned when style sheets arrive
- // but here we need up-to-date style immediately.
- recalcStyle(Force);
+ TemporaryChange<bool> ignorePendingStylesheets(m_ignorePendingStylesheets, m_ignorePendingStylesheets);
+ recalcStyleForLayoutIgnoringPendingStylesheets();
+
+ if (stopLayoutAtNode) {
+ RenderObject* renderer = stopLayoutAtNode->renderer();
+ bool canPartialLayout = renderer;
+ while (renderer) {
+ if (!renderer->supportsPartialLayout()) {
+ canPartialLayout = false;
+ break;
+ }
+ renderer = renderer->parent();
+ }
+ if (canPartialLayout && view())
+ view()->partialLayout().setStopAtRenderer(stopLayoutAtNode->renderer());
}
updateLayout();
- m_ignorePendingStylesheets = oldIgnore;
+ if (view())
+ view()->partialLayout().reset();
}
PassRefPtr<RenderStyle> Document::styleForElementIgnoringPendingStylesheets(Element* element)
« no previous file with comments | « Source/core/dom/Document.h ('k') | Source/core/dom/Element.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698