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

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

Issue 129633003: Add a first pass of a class descendant invalidator, and a containing RuleSetAnalyzer (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Implement tree walk for descendant class invalidation. Created 6 years, 11 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.h » ('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 c707ba453eb701be02c352b19da2ee3cce0ab4e6..48589478ae6f8c699b7540bf79696a6ccb1ee8cd 100644
--- a/Source/core/dom/Document.cpp
+++ b/Source/core/dom/Document.cpp
@@ -1538,6 +1538,20 @@ void Document::updateDistributionIfNeeded()
recalcDistribution();
}
+void Document::updateInvalidationIfNeeded()
+{
+ if (!childNeedsInvalidation())
+ return;
+ TRACE_EVENT0("webkit", "Document::recalcInvalidation");
+ if (!styleResolver()) {
+ clearChildNeedsInvalidation();
+ return;
+ }
+
+ if (RuleSetAnalyzer* analyzer = styleResolver()->ensureRuleFeatureSet().getRuleSetAnalyzer())
+ analyzer->recalcInvalidation(this);
+}
+
void Document::updateDistributionForNodeIfNeeded(Node* node)
{
if (node->inDocument()) {
@@ -1617,22 +1631,32 @@ void Document::inheritHtmlAndBodyElementStyles(StyleRecalcChange change)
documentElement()->setNeedsStyleRecalc();
}
}
+static bool debug = false;
void Document::recalcStyle(StyleRecalcChange change)
{
// we should not enter style recalc while painting
RELEASE_ASSERT(!view() || !view()->isPainting());
-
+ if (debug)
+ printf("----------------- Document::recalcStyle\n");
// FIXME: We should never enter here without a FrameView or with an inactive document.
- if (!isActive() || !view())
+ if (!isActive() || !view()) {
+ if (debug)
+ printf("document::recalcstyle...not active or view?\n");
return;
+ }
- if (m_inStyleRecalc)
+ if (m_inStyleRecalc) {
+ if (debug)
+ printf("document::recalcstyle...m_inStyleRecalc is true?\n");
return;
+ }
TRACE_EVENT0("webkit", "Document::recalcStyle");
TRACE_EVENT_SCOPED_SAMPLING_STATE("Blink", "RecalcStyle");
+ updateInvalidationIfNeeded();
+
updateDistributionIfNeeded();
InspectorInstrumentationCookie cookie = InspectorInstrumentation::willRecalculateStyle(this);
@@ -1721,14 +1745,18 @@ void Document::recalcStyle(StyleRecalcChange change)
// to check if any other elements ended up under the mouse pointer due to re-layout.
if (hoverNode() && !hoverNode()->renderer() && frame())
frame()->eventHandler().dispatchFakeMouseMoveEventSoon();
+ if (debug)
+ printf("********************** Document::recalcStyle DONE\n\n");
}
+
void Document::updateStyleIfNeeded()
{
ASSERT(isMainThread());
ASSERT(!view() || (!view()->isInLayout() && !view()->isPainting()));
- if (!needsStyleRecalc() && !childNeedsStyleRecalc() && !childNeedsDistributionRecalc())
+ // FIXME: unify this logic with shouldRecalcStyle()
+ if (!needsStyleRecalc() && !childNeedsStyleRecalc() && !childNeedsDistributionRecalc() && !childNeedsInvalidation())
return;
RefPtr<Frame> holder(m_frame);
@@ -1739,14 +1767,20 @@ void Document::updateStyleIfNeeded()
void Document::updateStyleForNodeIfNeeded(Node* node)
{
- if (!hasPendingForcedStyleRecalc() && !childNeedsStyleRecalc() && !needsStyleRecalc())
+ if (debug)
+ printf("Document::updateStyleForNodeIfNeeded\n");
+ // FIXME: Why is this different than updateStyleIfNeeded???
+ if (!hasPendingForcedStyleRecalc() && !childNeedsStyleRecalc() && !needsStyleRecalc() && !childNeedsInvalidation())
return;
bool needsStyleRecalc = hasPendingForcedStyleRecalc();
for (Node* ancestor = node; ancestor && !needsStyleRecalc; ancestor = ancestor->parentOrShadowHostNode())
- needsStyleRecalc = ancestor->needsStyleRecalc();
- if (needsStyleRecalc)
+ needsStyleRecalc = ancestor->needsStyleRecalc() || ancestor->needsInvalidation();
+ if (needsStyleRecalc) {
+ if (debug)
+ printf("updateStyleForNodeIfNeeded calls updateStyleIfNeeded\n");
updateStyleIfNeeded();
+ }
}
void Document::updateLayout()
« no previous file with comments | « Source/core/dom/Document.h ('k') | Source/core/dom/Element.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698