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

Side by Side Diff: third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp

Issue 1913833002: Current work-in-progress crbug.com/567021 (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: More assert fixes Created 4 years, 6 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com) 3 * (C) 2004-2005 Allan Sandfeld Jensen (kde@carewolf.com)
4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com) 4 * Copyright (C) 2006, 2007 Nicholas Shanks (webkit@nickshanks.com)
5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved. 5 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 Apple Inc. All rights reserved.
6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org> 6 * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org> 7 * Copyright (C) 2007, 2008 Eric Seidel <eric@webkit.org>
8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved. 9 * Copyright (c) 2011, Code Aurora Forum. All rights reserved.
10 * Copyright (C) Research In Motion Limited 2011. All rights reserved. 10 * Copyright (C) Research In Motion Limited 2011. All rights reserved.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 #include "core/css/resolver/AnimatedStyleBuilder.h" 62 #include "core/css/resolver/AnimatedStyleBuilder.h"
63 #include "core/css/resolver/CSSVariableResolver.h" 63 #include "core/css/resolver/CSSVariableResolver.h"
64 #include "core/css/resolver/MatchResult.h" 64 #include "core/css/resolver/MatchResult.h"
65 #include "core/css/resolver/MediaQueryResult.h" 65 #include "core/css/resolver/MediaQueryResult.h"
66 #include "core/css/resolver/ScopedStyleResolver.h" 66 #include "core/css/resolver/ScopedStyleResolver.h"
67 #include "core/css/resolver/SelectorFilterParentScope.h" 67 #include "core/css/resolver/SelectorFilterParentScope.h"
68 #include "core/css/resolver/SharedStyleFinder.h" 68 #include "core/css/resolver/SharedStyleFinder.h"
69 #include "core/css/resolver/StyleAdjuster.h" 69 #include "core/css/resolver/StyleAdjuster.h"
70 #include "core/css/resolver/StyleResolverState.h" 70 #include "core/css/resolver/StyleResolverState.h"
71 #include "core/css/resolver/StyleResolverStats.h" 71 #include "core/css/resolver/StyleResolverStats.h"
72 #include "core/css/resolver/ViewportStyleResolver.h"
73 #include "core/dom/CSSSelectorWatch.h" 72 #include "core/dom/CSSSelectorWatch.h"
74 #include "core/dom/FirstLetterPseudoElement.h" 73 #include "core/dom/FirstLetterPseudoElement.h"
75 #include "core/dom/NodeComputedStyle.h" 74 #include "core/dom/NodeComputedStyle.h"
76 #include "core/dom/StyleEngine.h" 75 #include "core/dom/StyleEngine.h"
77 #include "core/dom/Text.h" 76 #include "core/dom/Text.h"
78 #include "core/dom/shadow/ElementShadow.h" 77 #include "core/dom/shadow/ElementShadow.h"
79 #include "core/dom/shadow/ShadowRoot.h" 78 #include "core/dom/shadow/ShadowRoot.h"
80 #include "core/frame/FrameView.h" 79 #include "core/frame/FrameView.h"
81 #include "core/frame/LocalFrame.h" 80 #include "core/frame/LocalFrame.h"
82 #include "core/frame/Settings.h" 81 #include "core/frame/Settings.h"
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 for (ShadowRoot* shadowRoot = &shadow->youngestShadowRoot(); shadowRoot; sha dowRoot = shadowRoot->olderShadowRoot()) { 164 for (ShadowRoot* shadowRoot = &shadow->youngestShadowRoot(); shadowRoot; sha dowRoot = shadowRoot->olderShadowRoot()) {
166 if (shadowRoot->numberOfStyles() > 0) { 165 if (shadowRoot->numberOfStyles() > 0) {
167 if (ScopedStyleResolver* resolver = shadowRoot->scopedStyleResolver( )) 166 if (ScopedStyleResolver* resolver = shadowRoot->scopedStyleResolver( ))
168 resolvers.append(resolver); 167 resolvers.append(resolver);
169 } 168 }
170 } 169 }
171 } 170 }
172 171
173 StyleResolver::StyleResolver(Document& document) 172 StyleResolver::StyleResolver(Document& document)
174 : m_document(document) 173 : m_document(document)
175 , m_viewportStyleResolver(ViewportStyleResolver::create(&document))
176 , m_needCollectFeatures(false)
177 , m_printMediaType(false)
178 , m_styleSharingDepth(0)
179 { 174 {
180 FrameView* view = document.view(); 175 if (FrameView* view = document.view())
181 if (view) {
182 m_medium = new MediaQueryEvaluator(&view->frame());
183 m_printMediaType = equalIgnoringCase(view->mediaType(), MediaTypeNames:: print); 176 m_printMediaType = equalIgnoringCase(view->mediaType(), MediaTypeNames:: print);
184 } else {
185 m_medium = new MediaQueryEvaluator("all");
186 }
187
188 initWatchedSelectorRules();
189 } 177 }
190 178
191 StyleResolver::~StyleResolver() 179 StyleResolver::~StyleResolver()
192 { 180 {
193 } 181 }
194 182
195 void StyleResolver::dispose() 183 void StyleResolver::dispose()
196 { 184 {
197 m_matchedPropertiesCache.clear(); 185 m_matchedPropertiesCache.clear();
198 } 186 }
199 187
200 void StyleResolver::initWatchedSelectorRules()
201 {
202 m_watchedSelectorsRules = nullptr;
203 CSSSelectorWatch* watch = CSSSelectorWatch::fromIfExists(*m_document);
204 if (!watch)
205 return;
206 const HeapVector<Member<StyleRule>>& watchedSelectors = watch->watchedCallba ckSelectors();
207 if (!watchedSelectors.size())
208 return;
209 m_watchedSelectorsRules = RuleSet::create();
210 for (unsigned i = 0; i < watchedSelectors.size(); ++i)
211 m_watchedSelectorsRules->addStyleRule(watchedSelectors[i].get(), RuleHas NoSpecialState);
212 }
213
214 void StyleResolver::lazyAppendAuthorStyleSheets(unsigned firstNew, const HeapVec tor<Member<CSSStyleSheet>>& styleSheets)
215 {
216 unsigned size = styleSheets.size();
217 for (unsigned i = firstNew; i < size; ++i)
218 m_pendingStyleSheets.add(styleSheets[i].get());
219 }
220
221 void StyleResolver::removePendingAuthorStyleSheets(const HeapVector<Member<CSSSt yleSheet>>& styleSheets)
222 {
223 for (unsigned i = 0; i < styleSheets.size(); ++i)
224 m_pendingStyleSheets.remove(styleSheets[i].get());
225 }
226
227 void StyleResolver::appendCSSStyleSheet(CSSStyleSheet& cssSheet)
228 {
229 ASSERT(!cssSheet.disabled());
230 ASSERT(cssSheet.ownerDocument());
231 ASSERT(cssSheet.ownerNode());
232 ASSERT(isHTMLStyleElement(cssSheet.ownerNode()) || isSVGStyleElement(cssShee t.ownerNode()) || cssSheet.ownerNode()->treeScope() == cssSheet.ownerDocument()) ;
233
234 if (cssSheet.mediaQueries() && !m_medium->eval(cssSheet.mediaQueries(), &m_v iewportDependentMediaQueryResults, &m_deviceDependentMediaQueryResults))
235 return;
236
237 TreeScope* treeScope = &cssSheet.ownerNode()->treeScope();
238 // TODO(rune@opera.com): This is a workaround for crbug.com/559292
239 // when we're in the middle of removing a subtree with a style element
240 // and the treescope has been changed but inDocument and isInShadowTree
241 // are not.
242 //
243 // This check can be removed when crbug.com/567021 is fixed.
244 if (cssSheet.ownerNode()->isInShadowTree() && treeScope->rootNode().isDocume ntNode())
245 return;
246
247 // Sheets in the document scope of HTML imports apply to the main document
248 // (m_document), so we override it for all document scoped sheets.
249 if (treeScope->rootNode().isDocumentNode())
250 treeScope = m_document;
251 treeScope->ensureScopedStyleResolver().appendCSSStyleSheet(cssSheet, *m_medi um);
252 }
253
254 void StyleResolver::appendPendingAuthorStyleSheets()
255 {
256 for (const auto& styleSheet : m_pendingStyleSheets)
257 appendCSSStyleSheet(*styleSheet);
258
259 m_pendingStyleSheets.clear();
260 finishAppendAuthorStyleSheets();
261 }
262
263 void StyleResolver::appendAuthorStyleSheets(const HeapVector<Member<CSSStyleShee t>>& styleSheets)
264 {
265 // This handles sheets added to the end of the stylesheet list only. In othe r cases the style resolver
266 // needs to be reconstructed. To handle insertions too the rule order number s would need to be updated.
267 for (const auto& styleSheet : styleSheets)
268 appendCSSStyleSheet(*styleSheet);
269 }
270
271 void StyleResolver::finishAppendAuthorStyleSheets()
272 {
273 collectFeatures();
274
275 if (document().layoutView() && document().layoutView()->style())
276 document().layoutView()->style()->font().update(document().styleEngine() .fontSelector());
277
278 m_viewportStyleResolver->collectViewportRules();
279
280 document().styleEngine().resetCSSFeatureFlags(m_features);
281 }
282
283 void StyleResolver::resetRuleFeatures()
284 {
285 // Need to recreate RuleFeatureSet.
286 m_features.clear();
287 m_siblingRuleSet.clear();
288 m_uncommonAttributeRuleSet.clear();
289 m_needCollectFeatures = true;
290 }
291
292 void StyleResolver::addTreeBoundaryCrossingScope(ContainerNode& scope)
293 {
294 m_treeBoundaryCrossingScopes.add(&scope);
295 }
296
297 void StyleResolver::resetAuthorStyle(TreeScope& treeScope)
298 {
299 m_treeBoundaryCrossingScopes.remove(&treeScope.rootNode());
300
301 ScopedStyleResolver* resolver = treeScope.scopedStyleResolver();
302 if (!resolver)
303 return;
304
305 resetRuleFeatures();
306
307 if (treeScope.rootNode().isDocumentNode()) {
308 resolver->resetAuthorStyle();
309 return;
310 }
311
312 // resolver is going to be freed below.
313 treeScope.clearScopedStyleResolver();
314 }
315
316 static RuleSet* makeRuleSet(const HeapVector<RuleFeature>& rules)
317 {
318 size_t size = rules.size();
319 if (!size)
320 return nullptr;
321 RuleSet* ruleSet = RuleSet::create();
322 for (size_t i = 0; i < size; ++i)
323 ruleSet->addRule(rules[i].rule, rules[i].selectorIndex, rules[i].hasDocu mentSecurityOrigin ? RuleHasDocumentSecurityOrigin : RuleHasNoSpecialState);
324 return ruleSet;
325 }
326
327 void StyleResolver::collectFeatures()
328 {
329 m_features.clear();
330 // Collect all ids and rules using sibling selectors (:first-child and simil ar)
331 // in the current set of stylesheets. Style sharing code uses this informati on to reject
332 // sharing candidates.
333 CSSDefaultStyleSheets& defaultStyleSheets = CSSDefaultStyleSheets::instance( );
334 if (defaultStyleSheets.defaultStyle()) {
335 m_features.add(defaultStyleSheets.defaultStyle()->features());
336 m_hasFullscreenUAStyle = defaultStyleSheets.fullscreenStyleSheet();
337 }
338
339 if (document().isViewSource())
340 m_features.add(defaultStyleSheets.defaultViewSourceStyle()->features());
341
342 if (m_watchedSelectorsRules)
343 m_features.add(m_watchedSelectorsRules->features());
344
345 document().styleEngine().collectScopedStyleFeaturesTo(m_features);
346
347 m_siblingRuleSet = makeRuleSet(m_features.siblingRules);
348 m_uncommonAttributeRuleSet = makeRuleSet(m_features.uncommonAttributeRules);
349 m_needCollectFeatures = false;
350 }
351
352 bool StyleResolver::hasRulesForId(const AtomicString& id) const
353 {
354 return m_features.hasSelectorForId(id);
355 }
356
357 void StyleResolver::addToStyleSharingList(Element& element) 188 void StyleResolver::addToStyleSharingList(Element& element)
358 { 189 {
359 ASSERT(RuntimeEnabledFeatures::styleSharingEnabled()); 190 ASSERT(RuntimeEnabledFeatures::styleSharingEnabled());
360 // Never add elements to the style sharing list if we're not in a recalcStyl e, 191 // Never add elements to the style sharing list if we're not in a recalcStyl e,
361 // otherwise we could leave stale pointers in there. 192 // otherwise we could leave stale pointers in there.
362 if (!document().inStyleRecalc()) 193 if (!document().inStyleRecalc())
363 return; 194 return;
364 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), sharedStyleCandidate s, 1); 195 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), sharedStyleCandidate s, 1);
365 StyleSharingList& list = styleSharingList(); 196 StyleSharingList& list = styleSharingList();
366 if (list.size() >= styleSharingListSize) 197 if (list.size() >= styleSharingListSize)
(...skipping 16 matching lines...) Expand all
383 214
384 void StyleResolver::clearStyleSharingList() 215 void StyleResolver::clearStyleSharingList()
385 { 216 {
386 m_styleSharingLists.resize(0); 217 m_styleSharingLists.resize(0);
387 } 218 }
388 219
389 static inline ScopedStyleResolver* scopedResolverFor(const Element& element) 220 static inline ScopedStyleResolver* scopedResolverFor(const Element& element)
390 { 221 {
391 // Ideally, returning element->treeScope().scopedStyleResolver() should be 222 // Ideally, returning element->treeScope().scopedStyleResolver() should be
392 // enough, but ::cue and custom pseudo elements like ::-webkit-meter-bar pie rce 223 // enough, but ::cue and custom pseudo elements like ::-webkit-meter-bar pie rce
393 // through a shadow dom boundary, yet they are not part of m_treeBoundaryCro ssingScopes. 224 // through a shadow dom boundary, yet they are not part of treeBoundaryCross ingScopes.
394 // The assumption here is that these rules only pierce through one boundary and 225 // The assumption here is that these rules only pierce through one boundary and
395 // that the scope of these elements do not have a style resolver due to the fact 226 // that the scope of these elements do not have a style resolver due to the fact
396 // that VTT scopes and UA shadow trees don't have <style> elements. This is 227 // that VTT scopes and UA shadow trees don't have <style> elements. This is
397 // backed up by the ASSERTs below. 228 // backed up by the ASSERTs below.
398 // 229 //
399 // FIXME: Make ::cue and custom pseudo elements part of boundary crossing ru les 230 // FIXME: Make ::cue and custom pseudo elements part of boundary crossing ru les
400 // when moving those rules to ScopedStyleResolver as part of issue 401359. 231 // when moving those rules to ScopedStyleResolver as part of issue 401359.
401 232
402 TreeScope* treeScope = &element.treeScope(); 233 TreeScope* treeScope = &element.treeScope();
403 if (ScopedStyleResolver* resolver = treeScope->scopedStyleResolver()) { 234 if (ScopedStyleResolver* resolver = treeScope->scopedStyleResolver()) {
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
504 ScopedStyleResolver* elementScopeResolver = scopedResolverFor(element); 335 ScopedStyleResolver* elementScopeResolver = scopedResolverFor(element);
505 336
506 if (!document().mayContainV0Shadow()) { 337 if (!document().mayContainV0Shadow()) {
507 matchSlottedRules(element, collector); 338 matchSlottedRules(element, collector);
508 matchElementScopeRules(element, elementScopeResolver, collector); 339 matchElementScopeRules(element, elementScopeResolver, collector);
509 return; 340 return;
510 } 341 }
511 342
512 bool matchElementScopeDone = !elementScopeResolver && !element.inlineStyle() ; 343 bool matchElementScopeDone = !elementScopeResolver && !element.inlineStyle() ;
513 344
514 for (auto it = m_treeBoundaryCrossingScopes.rbegin(); it != m_treeBoundaryCr ossingScopes.rend(); ++it) { 345 const auto& treeBoundaryCrossingScopes = document().styleEngine().treeBounda ryCrossingScopes();
346 for (auto it = treeBoundaryCrossingScopes.rbegin(); it != treeBoundaryCrossi ngScopes.rend(); ++it) {
515 const TreeScope& scope = (*it)->treeScope(); 347 const TreeScope& scope = (*it)->treeScope();
516 ScopedStyleResolver* resolver = scope.scopedStyleResolver(); 348 ScopedStyleResolver* resolver = scope.scopedStyleResolver();
517 ASSERT(resolver); 349 ASSERT(resolver);
518 350
519 bool isInnerTreeScope = element.treeScope().isInclusiveAncestorOf(scope) ; 351 bool isInnerTreeScope = element.treeScope().isInclusiveAncestorOf(scope) ;
520 if (!shouldCheckScope(element, **it, isInnerTreeScope)) 352 if (!shouldCheckScope(element, **it, isInnerTreeScope))
521 continue; 353 continue;
522 354
523 if (!matchElementScopeDone && scope.isInclusiveAncestorOf(element.treeSc ope())) { 355 if (!matchElementScopeDone && scope.isInclusiveAncestorOf(element.treeSc ope())) {
524 356
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 // Now check SMIL animation override style. 474 // Now check SMIL animation override style.
643 if (includeSMILProperties && state.element()->isSVGElement()) 475 if (includeSMILProperties && state.element()->isSVGElement())
644 collector.addElementStyleProperties(toSVGElement(state.element())->a nimatedSMILStyleProperties(), false /* isCacheable */); 476 collector.addElementStyleProperties(toSVGElement(state.element())->a nimatedSMILStyleProperties(), false /* isCacheable */);
645 } 477 }
646 478
647 collector.finishAddingAuthorRulesForTreeScope(); 479 collector.finishAddingAuthorRulesForTreeScope();
648 } 480 }
649 481
650 void StyleResolver::collectTreeBoundaryCrossingRules(const Element& element, Ele mentRuleCollector& collector) 482 void StyleResolver::collectTreeBoundaryCrossingRules(const Element& element, Ele mentRuleCollector& collector)
651 { 483 {
652 if (m_treeBoundaryCrossingScopes.isEmpty()) 484 const auto& treeBoundaryCrossingScopes = document().styleEngine().treeBounda ryCrossingScopes();
485 if (treeBoundaryCrossingScopes.isEmpty())
653 return; 486 return;
654 487
655 // When comparing rules declared in outer treescopes, outer's rules win. 488 // When comparing rules declared in outer treescopes, outer's rules win.
656 CascadeOrder outerCascadeOrder = m_treeBoundaryCrossingScopes.size() * 2; 489 CascadeOrder outerCascadeOrder = treeBoundaryCrossingScopes.size() * 2;
657 // When comparing rules declared in inner treescopes, inner's rules win. 490 // When comparing rules declared in inner treescopes, inner's rules win.
658 CascadeOrder innerCascadeOrder = m_treeBoundaryCrossingScopes.size(); 491 CascadeOrder innerCascadeOrder = treeBoundaryCrossingScopes.size();
659 492
660 for (const auto& scopingNode : m_treeBoundaryCrossingScopes) { 493 for (const auto& scopingNode : treeBoundaryCrossingScopes) {
661 // Skip rule collection for element when tree boundary crossing rules of scopingNode's 494 // Skip rule collection for element when tree boundary crossing rules of scopingNode's
662 // scope can never apply to it. 495 // scope can never apply to it.
663 bool isInnerTreeScope = element.treeScope().isInclusiveAncestorOf(scopin gNode->treeScope()); 496 bool isInnerTreeScope = element.treeScope().isInclusiveAncestorOf(scopin gNode->treeScope());
664 if (!shouldCheckScope(element, *scopingNode, isInnerTreeScope)) 497 if (!shouldCheckScope(element, *scopingNode, isInnerTreeScope))
665 continue; 498 continue;
666 499
667 CascadeOrder cascadeOrder = isInnerTreeScope ? innerCascadeOrder : outer CascadeOrder; 500 CascadeOrder cascadeOrder = isInnerTreeScope ? innerCascadeOrder : outer CascadeOrder;
668 scopingNode->treeScope().scopedStyleResolver()->collectMatchingTreeBound aryCrossingRules(collector, cascadeOrder); 501 scopingNode->treeScope().scopedStyleResolver()->collectMatchingTreeBound aryCrossingRules(collector, cascadeOrder);
669 502
670 ++innerCascadeOrder; 503 ++innerCascadeOrder;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
705 void StyleResolver::loadPendingResources(StyleResolverState& state) 538 void StyleResolver::loadPendingResources(StyleResolverState& state)
706 { 539 {
707 state.elementStyleResources().loadPendingResources(state.style()); 540 state.elementStyleResources().loadPendingResources(state.style());
708 } 541 }
709 542
710 PassRefPtr<ComputedStyle> StyleResolver::styleForElement(Element* element, const ComputedStyle* defaultParent, StyleSharingBehavior sharingBehavior, 543 PassRefPtr<ComputedStyle> StyleResolver::styleForElement(Element* element, const ComputedStyle* defaultParent, StyleSharingBehavior sharingBehavior,
711 RuleMatchingBehavior matchingBehavior) 544 RuleMatchingBehavior matchingBehavior)
712 { 545 {
713 ASSERT(document().frame()); 546 ASSERT(document().frame());
714 ASSERT(document().settings()); 547 ASSERT(document().settings());
715 ASSERT(!hasPendingAuthorStyleSheets());
716 ASSERT(!m_needCollectFeatures);
717 548
718 // Once an element has a layoutObject, we don't try to destroy it, since oth erwise the layoutObject 549 // Once an element has a layoutObject, we don't try to destroy it, since oth erwise the layoutObject
719 // will vanish if a style recalc happens during loading. 550 // will vanish if a style recalc happens during loading.
720 if (sharingBehavior == AllowStyleSharing && !document().isRenderingReady() & & !element->layoutObject()) { 551 if (sharingBehavior == AllowStyleSharing && !document().isRenderingReady() & & !element->layoutObject()) {
721 if (!s_styleNotYetAvailable) { 552 if (!s_styleNotYetAvailable) {
722 s_styleNotYetAvailable = ComputedStyle::create().leakRef(); 553 s_styleNotYetAvailable = ComputedStyle::create().leakRef();
723 s_styleNotYetAvailable->setDisplay(NONE); 554 s_styleNotYetAvailable->setDisplay(NONE);
724 s_styleNotYetAvailable->font().update(document().styleEngine().fontS elector()); 555 s_styleNotYetAvailable->font().update(document().styleEngine().fontS elector());
725 } 556 }
726 557
727 document().setHasNodesWithPlaceholderStyle(); 558 document().setHasNodesWithPlaceholderStyle();
728 return s_styleNotYetAvailable; 559 return s_styleNotYetAvailable;
729 } 560 }
730 561
731 document().styleEngine().incStyleForElementCount(); 562 document().styleEngine().incStyleForElementCount();
732 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), elementsStyled, 1); 563 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), elementsStyled, 1);
733 564
734 SelectorFilterParentScope::ensureParentStackIsPushed(); 565 SelectorFilterParentScope::ensureParentStackIsPushed();
735 566
736 ElementResolveContext elementContext(*element); 567 ElementResolveContext elementContext(*element);
737 568
738 if (RuntimeEnabledFeatures::styleSharingEnabled() && sharingBehavior == Allo wStyleSharing && (defaultParent || elementContext.parentStyle())) { 569 if (RuntimeEnabledFeatures::styleSharingEnabled() && sharingBehavior == Allo wStyleSharing && (defaultParent || elementContext.parentStyle())) {
739 SharedStyleFinder styleFinder(elementContext, m_features, m_siblingRuleS et.get(), m_uncommonAttributeRuleSet.get(), *this); 570 if (RefPtr<ComputedStyle> sharedStyle = document().styleEngine().findSha redStyle(elementContext))
740 if (RefPtr<ComputedStyle> sharedStyle = styleFinder.findSharedStyle())
741 return sharedStyle.release(); 571 return sharedStyle.release();
742 } 572 }
743 573
744 StyleResolverState state(document(), elementContext, defaultParent); 574 StyleResolverState state(document(), elementContext, defaultParent);
745 575
746 ElementAnimations* elementAnimations = element->elementAnimations(); 576 ElementAnimations* elementAnimations = element->elementAnimations();
747 const ComputedStyle* baseComputedStyle = elementAnimations ? elementAnimatio ns->baseComputedStyle() : nullptr; 577 const ComputedStyle* baseComputedStyle = elementAnimations ? elementAnimatio ns->baseComputedStyle() : nullptr;
748 578
749 if (baseComputedStyle) { 579 if (baseComputedStyle) {
750 state.setStyle(ComputedStyle::clone(*baseComputedStyle)); 580 state.setStyle(ComputedStyle::clone(*baseComputedStyle));
(...skipping 25 matching lines...) Expand all
776 if (linkState != NotInsideLink) { 606 if (linkState != NotInsideLink) {
777 bool forceVisited = InspectorInstrumentation::forcePseudoState(eleme nt, CSSSelector::PseudoVisited); 607 bool forceVisited = InspectorInstrumentation::forcePseudoState(eleme nt, CSSSelector::PseudoVisited);
778 if (forceVisited) 608 if (forceVisited)
779 linkState = InsideVisitedLink; 609 linkState = InsideVisitedLink;
780 } 610 }
781 state.style()->setInsideLink(linkState); 611 state.style()->setInsideLink(linkState);
782 } 612 }
783 613
784 if (!baseComputedStyle) { 614 if (!baseComputedStyle) {
785 615
786 bool needsCollection = false; 616 document().styleEngine().ensureUAStyleForElement(*element);
787 CSSDefaultStyleSheets::instance().ensureDefaultStyleSheetsForElement(*el ement, needsCollection);
788 if (needsCollection)
789 collectFeatures();
790 617
791 ElementRuleCollector collector(state.elementContext(), m_selectorFilter, state.style()); 618 ElementRuleCollector collector(state.elementContext(), m_selectorFilter, state.style());
792 619
793 matchAllRules(state, collector, matchingBehavior != MatchAllRulesExcludi ngSMIL); 620 matchAllRules(state, collector, matchingBehavior != MatchAllRulesExcludi ngSMIL);
794 621
795 if (element->computedStyle() && element->computedStyle()->textAutosizing Multiplier() != state.style()->textAutosizingMultiplier()) { 622 if (element->computedStyle() && element->computedStyle()->textAutosizing Multiplier() != state.style()->textAutosizingMultiplier()) {
796 // Preserve the text autosizing multiplier on style recalc. Autosize r will update it during layout if needed. 623 // Preserve the text autosizing multiplier on style recalc. Autosize r will update it during layout if needed.
797 // NOTE: this must occur before applyMatchedProperties for correct c omputation of font-relative lengths. 624 // NOTE: this must occur before applyMatchedProperties for correct c omputation of font-relative lengths.
798 state.style()->setTextAutosizingMultiplier(element->computedStyle()- >textAutosizingMultiplier()); 625 state.style()->setTextAutosizingMultiplier(element->computedStyle()- >textAutosizingMultiplier());
799 state.style()->setUnique(); 626 state.style()->setUnique();
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
995 822
996 if (PseudoElement* pseudoElement = element->pseudoElement(pseudoStyleRequest .pseudoId)) 823 if (PseudoElement* pseudoElement = element->pseudoElement(pseudoStyleRequest .pseudoId))
997 setAnimationUpdateIfNeeded(state, *pseudoElement); 824 setAnimationUpdateIfNeeded(state, *pseudoElement);
998 825
999 // Now return the style. 826 // Now return the style.
1000 return state.takeStyle(); 827 return state.takeStyle();
1001 } 828 }
1002 829
1003 PassRefPtr<ComputedStyle> StyleResolver::styleForPage(int pageIndex) 830 PassRefPtr<ComputedStyle> StyleResolver::styleForPage(int pageIndex)
1004 { 831 {
1005 ASSERT(!hasPendingAuthorStyleSheets());
1006 StyleResolverState state(document(), document().documentElement()); // m_roo tElementStyle will be set to the document style. 832 StyleResolverState state(document(), document().documentElement()); // m_roo tElementStyle will be set to the document style.
1007 833
1008 RefPtr<ComputedStyle> style = ComputedStyle::create(); 834 RefPtr<ComputedStyle> style = ComputedStyle::create();
1009 const ComputedStyle* rootElementStyle = state.rootElementStyle() ? state.roo tElementStyle() : document().computedStyle(); 835 const ComputedStyle* rootElementStyle = state.rootElementStyle() ? state.roo tElementStyle() : document().computedStyle();
1010 ASSERT(rootElementStyle); 836 ASSERT(rootElementStyle);
1011 style->inheritFrom(*rootElementStyle); 837 style->inheritFrom(*rootElementStyle);
1012 state.setStyle(style.release()); 838 state.setStyle(style.release());
1013 839
1014 PageRuleCollector collector(rootElementStyle, pageIndex); 840 PageRuleCollector collector(rootElementStyle, pageIndex);
1015 841
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after
1500 return StringHasher::hashMemory(properties, sizeof(MatchedProperties) * size ); 1326 return StringHasher::hashMemory(properties, sizeof(MatchedProperties) * size );
1501 } 1327 }
1502 1328
1503 void StyleResolver::invalidateMatchedPropertiesCache() 1329 void StyleResolver::invalidateMatchedPropertiesCache()
1504 { 1330 {
1505 m_matchedPropertiesCache.clear(); 1331 m_matchedPropertiesCache.clear();
1506 } 1332 }
1507 1333
1508 void StyleResolver::notifyResizeForViewportUnits() 1334 void StyleResolver::notifyResizeForViewportUnits()
1509 { 1335 {
1510 m_viewportStyleResolver->collectViewportRules(); 1336 document().styleEngine().updateActiveStyle();
1511 m_matchedPropertiesCache.clearViewportDependent(); 1337 m_matchedPropertiesCache.clearViewportDependent();
1512 } 1338 }
1513 1339
1514 void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc hResult& matchResult) 1340 void StyleResolver::applyMatchedProperties(StyleResolverState& state, const Matc hResult& matchResult)
1515 { 1341 {
1516 const Element* element = state.element(); 1342 const Element* element = state.element();
1517 ASSERT(element); 1343 ASSERT(element);
1518 1344
1519 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), matchedPropertyApply , 1); 1345 INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), matchedPropertyApply , 1);
1520 1346
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1645 } 1471 }
1646 1472
1647 bool StyleResolver::hasAuthorBorder(const StyleResolverState& state) 1473 bool StyleResolver::hasAuthorBorder(const StyleResolverState& state)
1648 { 1474 {
1649 const CachedUAStyle* cachedUAStyle = state.cachedUAStyle(); 1475 const CachedUAStyle* cachedUAStyle = state.cachedUAStyle();
1650 return cachedUAStyle && (cachedUAStyle->border != state.style()->border()); 1476 return cachedUAStyle && (cachedUAStyle->border != state.style()->border());
1651 } 1477 }
1652 1478
1653 void StyleResolver::applyCallbackSelectors(StyleResolverState& state) 1479 void StyleResolver::applyCallbackSelectors(StyleResolverState& state)
1654 { 1480 {
1655 if (!m_watchedSelectorsRules) 1481 RuleSet* watchedSelectorsRuleSet = document().styleEngine().watchedSelectors RuleSet();
1482 if (!watchedSelectorsRuleSet)
1656 return; 1483 return;
1657 1484
1658 ElementRuleCollector collector(state.elementContext(), m_selectorFilter, sta te.style()); 1485 ElementRuleCollector collector(state.elementContext(), m_selectorFilter, sta te.style());
1659 collector.setMode(SelectorChecker::CollectingStyleRules); 1486 collector.setMode(SelectorChecker::CollectingStyleRules);
1660 collector.setIncludeEmptyRules(true); 1487 collector.setIncludeEmptyRules(true);
1661 1488
1662 MatchRequest matchRequest(m_watchedSelectorsRules.get()); 1489 MatchRequest matchRequest(watchedSelectorsRuleSet);
1663 collector.collectMatchingRules(matchRequest); 1490 collector.collectMatchingRules(matchRequest);
1664 collector.sortAndTransferMatchedRules(); 1491 collector.sortAndTransferMatchedRules();
1665 1492
1666 StyleRuleList* rules = collector.matchedStyleRuleList(); 1493 StyleRuleList* rules = collector.matchedStyleRuleList();
1667 if (!rules) 1494 if (!rules)
1668 return; 1495 return;
1669 for (size_t i = 0; i < rules->size(); i++) 1496 for (size_t i = 0; i < rules->size(); i++)
1670 state.style()->addCallbackSelector(rules->at(i)->selectorList().selector sText()); 1497 state.style()->addCallbackSelector(rules->at(i)->selectorList().selector sText());
1671 } 1498 }
1672 1499
(...skipping 13 matching lines...) Expand all
1686 StyleResolverState state(document(), nullptr, style); 1513 StyleResolverState state(document(), nullptr, style);
1687 state.setStyle(style); 1514 state.setStyle(style);
1688 1515
1689 for (CSSPropertyID property : properties) { 1516 for (CSSPropertyID property : properties) {
1690 if (property == CSSPropertyLineHeight) 1517 if (property == CSSPropertyLineHeight)
1691 updateFont(state); 1518 updateFont(state);
1692 StyleBuilder::applyProperty(property, state, propertySet.getPropertyCSSV alue(property)); 1519 StyleBuilder::applyProperty(property, state, propertySet.getPropertyCSSV alue(property));
1693 } 1520 }
1694 } 1521 }
1695 1522
1696 void StyleResolver::addViewportDependentMediaQueries(const MediaQueryResultList& list)
1697 {
1698 for (size_t i = 0; i < list.size(); ++i)
1699 m_viewportDependentMediaQueryResults.append(list[i]);
1700 }
1701
1702 void StyleResolver::addDeviceDependentMediaQueries(const MediaQueryResultList& l ist)
1703 {
1704 for (size_t i = 0; i < list.size(); ++i)
1705 m_deviceDependentMediaQueryResults.append(list[i]);
1706 }
1707
1708 bool StyleResolver::mediaQueryAffectedByViewportChange() const
1709 {
1710 for (unsigned i = 0; i < m_viewportDependentMediaQueryResults.size(); ++i) {
1711 if (m_medium->eval(m_viewportDependentMediaQueryResults[i]->expression() ) != m_viewportDependentMediaQueryResults[i]->result())
1712 return true;
1713 }
1714 return false;
1715 }
1716
1717 bool StyleResolver::mediaQueryAffectedByDeviceChange() const
1718 {
1719 for (unsigned i = 0; i < m_deviceDependentMediaQueryResults.size(); ++i) {
1720 if (m_medium->eval(m_deviceDependentMediaQueryResults[i]->expression()) != m_deviceDependentMediaQueryResults[i]->result())
1721 return true;
1722 }
1723 return false;
1724 }
1725
1726 DEFINE_TRACE(StyleResolver) 1523 DEFINE_TRACE(StyleResolver)
1727 { 1524 {
1728 visitor->trace(m_matchedPropertiesCache); 1525 visitor->trace(m_matchedPropertiesCache);
1729 visitor->trace(m_medium);
1730 visitor->trace(m_viewportDependentMediaQueryResults);
1731 visitor->trace(m_deviceDependentMediaQueryResults);
1732 visitor->trace(m_selectorFilter); 1526 visitor->trace(m_selectorFilter);
1733 visitor->trace(m_viewportStyleResolver);
1734 visitor->trace(m_features);
1735 visitor->trace(m_siblingRuleSet);
1736 visitor->trace(m_uncommonAttributeRuleSet);
1737 visitor->trace(m_watchedSelectorsRules);
1738 visitor->trace(m_treeBoundaryCrossingScopes);
1739 visitor->trace(m_styleSharingLists); 1527 visitor->trace(m_styleSharingLists);
1740 visitor->trace(m_pendingStyleSheets);
1741 visitor->trace(m_document); 1528 visitor->trace(m_document);
1742 } 1529 }
1743 1530
1744 } // namespace blink 1531 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698