| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
| 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
| 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. |
| 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
| 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. |
| 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) | 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
| 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 118 void StyleEngine::resetCSSFeatureFlags(const RuleFeatureSet& features) | 118 void StyleEngine::resetCSSFeatureFlags(const RuleFeatureSet& features) |
| 119 { | 119 { |
| 120 m_usesSiblingRules = features.usesSiblingRules(); | 120 m_usesSiblingRules = features.usesSiblingRules(); |
| 121 m_usesFirstLineRules = features.usesFirstLineRules(); | 121 m_usesFirstLineRules = features.usesFirstLineRules(); |
| 122 m_usesWindowInactiveSelector = features.usesWindowInactiveSelector(); | 122 m_usesWindowInactiveSelector = features.usesWindowInactiveSelector(); |
| 123 m_maxDirectAdjacentSelectors = features.maxDirectAdjacentSelectors(); | 123 m_maxDirectAdjacentSelectors = features.maxDirectAdjacentSelectors(); |
| 124 } | 124 } |
| 125 | 125 |
| 126 void StyleEngine::injectAuthorSheet(StyleSheetContents* authorSheet) | 126 void StyleEngine::injectAuthorSheet(StyleSheetContents* authorSheet) |
| 127 { | 127 { |
| 128 m_injectedAuthorStyleSheets.append(CSSStyleSheet::create(authorSheet, m_docu
ment)); | 128 m_injectedAuthorStyleSheets.append(CSSStyleSheet::create(authorSheet, *m_doc
ument)); |
| 129 markDocumentDirty(); | 129 markDocumentDirty(); |
| 130 resolverChanged(AnalyzedStyleUpdate); | 130 resolverChanged(AnalyzedStyleUpdate); |
| 131 } | 131 } |
| 132 | 132 |
| 133 CSSStyleSheet& StyleEngine::ensureInspectorStyleSheet() | 133 CSSStyleSheet& StyleEngine::ensureInspectorStyleSheet() |
| 134 { | 134 { |
| 135 if (m_inspectorStyleSheet) | 135 if (m_inspectorStyleSheet) |
| 136 return *m_inspectorStyleSheet; | 136 return *m_inspectorStyleSheet; |
| 137 | 137 |
| 138 StyleSheetContents* contents = StyleSheetContents::create(CSSParserContext(*
m_document, nullptr)); | 138 StyleSheetContents* contents = StyleSheetContents::create(CSSParserContext(*
m_document, nullptr)); |
| 139 m_inspectorStyleSheet = CSSStyleSheet::create(contents, m_document); | 139 m_inspectorStyleSheet = CSSStyleSheet::create(contents, *m_document); |
| 140 markDocumentDirty(); | 140 markDocumentDirty(); |
| 141 resolverChanged(AnalyzedStyleUpdate); | 141 resolverChanged(AnalyzedStyleUpdate); |
| 142 return *m_inspectorStyleSheet; | 142 return *m_inspectorStyleSheet; |
| 143 } | 143 } |
| 144 | 144 |
| 145 void StyleEngine::addPendingSheet(StyleEngineContext &context) | 145 void StyleEngine::addPendingSheet(StyleEngineContext &context) |
| 146 { | 146 { |
| 147 m_pendingScriptBlockingStylesheets++; | 147 m_pendingScriptBlockingStylesheets++; |
| 148 | 148 |
| 149 context.addingPendingSheet(document()); | 149 context.addingPendingSheet(document()); |
| 150 if (context.addedPendingSheetBeforeBody()) | 150 if (context.addedPendingSheetBeforeBody()) |
| 151 m_pendingRenderBlockingStylesheets++; | 151 m_pendingRenderBlockingStylesheets++; |
| 152 } | 152 } |
| 153 | 153 |
| 154 // This method is called whenever a top-level stylesheet has finished loading. | 154 // This method is called whenever a top-level stylesheet has finished loading. |
| 155 void StyleEngine::removePendingSheet(Node* styleSheetCandidateNode, const StyleE
ngineContext &context) | 155 void StyleEngine::removePendingSheet(Node& styleSheetCandidateNode, const StyleE
ngineContext &context) |
| 156 { | 156 { |
| 157 DCHECK(styleSheetCandidateNode); | 157 TreeScope* treeScope = isStyleElement(styleSheetCandidateNode) ? &styleSheet
CandidateNode.treeScope() : m_document.get(); |
| 158 TreeScope* treeScope = isStyleElement(*styleSheetCandidateNode) ? &styleShee
tCandidateNode->treeScope() : m_document.get(); | 158 if (styleSheetCandidateNode.isConnected()) |
| 159 if (styleSheetCandidateNode->isConnected()) | |
| 160 markTreeScopeDirty(*treeScope); | 159 markTreeScopeDirty(*treeScope); |
| 161 | 160 |
| 162 if (context.addedPendingSheetBeforeBody()) { | 161 if (context.addedPendingSheetBeforeBody()) { |
| 163 DCHECK_GT(m_pendingRenderBlockingStylesheets, 0); | 162 DCHECK_GT(m_pendingRenderBlockingStylesheets, 0); |
| 164 m_pendingRenderBlockingStylesheets--; | 163 m_pendingRenderBlockingStylesheets--; |
| 165 } | 164 } |
| 166 | 165 |
| 167 // Make sure we knew this sheet was pending, and that our count isn't out of
sync. | 166 // Make sure we knew this sheet was pending, and that our count isn't out of
sync. |
| 168 DCHECK_GT(m_pendingScriptBlockingStylesheets, 0); | 167 DCHECK_GT(m_pendingScriptBlockingStylesheets, 0); |
| 169 | 168 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 188 if (node && node->isConnected()) { | 187 if (node && node->isConnected()) { |
| 189 TreeScope& treeScope = isStyleElement(*node) ? node->treeScope() : *
m_document; | 188 TreeScope& treeScope = isStyleElement(*node) ? node->treeScope() : *
m_document; |
| 190 DCHECK(isStyleElement(*node) || node->treeScope() == m_document); | 189 DCHECK(isStyleElement(*node) || node->treeScope() == m_document); |
| 191 markTreeScopeDirty(treeScope); | 190 markTreeScopeDirty(treeScope); |
| 192 } | 191 } |
| 193 } | 192 } |
| 194 | 193 |
| 195 resolverChanged(updateMode); | 194 resolverChanged(updateMode); |
| 196 } | 195 } |
| 197 | 196 |
| 198 void StyleEngine::addStyleSheetCandidateNode(Node* node) | 197 void StyleEngine::addStyleSheetCandidateNode(Node& node) |
| 199 { | 198 { |
| 200 if (!node->isConnected() || document().isDetached()) | 199 if (!node.isConnected() || document().isDetached()) |
| 201 return; | 200 return; |
| 202 | 201 |
| 203 DCHECK(!isXSLStyleSheet(*node)); | 202 DCHECK(!isXSLStyleSheet(node)); |
| 204 TreeScope& treeScope = node->treeScope(); | 203 TreeScope& treeScope = node.treeScope(); |
| 205 TreeScopeStyleSheetCollection* collection = ensureStyleSheetCollectionFor(tr
eeScope); | 204 TreeScopeStyleSheetCollection* collection = ensureStyleSheetCollectionFor(tr
eeScope); |
| 206 DCHECK(collection); | 205 DCHECK(collection); |
| 207 collection->addStyleSheetCandidateNode(node); | 206 collection->addStyleSheetCandidateNode(node); |
| 208 | 207 |
| 209 markTreeScopeDirty(treeScope); | 208 markTreeScopeDirty(treeScope); |
| 210 if (treeScope != m_document) | 209 if (treeScope != m_document) |
| 211 m_activeTreeScopes.add(&treeScope); | 210 m_activeTreeScopes.add(&treeScope); |
| 212 } | 211 } |
| 213 | 212 |
| 214 void StyleEngine::removeStyleSheetCandidateNode(Node* node) | 213 void StyleEngine::removeStyleSheetCandidateNode(Node& node) |
| 215 { | 214 { |
| 216 removeStyleSheetCandidateNode(node, *m_document); | 215 removeStyleSheetCandidateNode(node, *m_document); |
| 217 } | 216 } |
| 218 | 217 |
| 219 void StyleEngine::removeStyleSheetCandidateNode(Node* node, TreeScope& treeScope
) | 218 void StyleEngine::removeStyleSheetCandidateNode(Node& node, TreeScope& treeScope
) |
| 220 { | 219 { |
| 221 DCHECK(isStyleElement(*node) || treeScope == m_document); | 220 DCHECK(isStyleElement(node) || treeScope == m_document); |
| 222 DCHECK(!isXSLStyleSheet(*node)); | 221 DCHECK(!isXSLStyleSheet(node)); |
| 223 | 222 |
| 224 TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(treeScop
e); | 223 TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(treeScop
e); |
| 225 // After detaching document, collection could be null. In the case, | 224 // After detaching document, collection could be null. In the case, |
| 226 // we should not update anything. Instead, just return. | 225 // we should not update anything. Instead, just return. |
| 227 if (!collection) | 226 if (!collection) |
| 228 return; | 227 return; |
| 229 collection->removeStyleSheetCandidateNode(node); | 228 collection->removeStyleSheetCandidateNode(node); |
| 230 | 229 |
| 231 markTreeScopeDirty(treeScope); | 230 markTreeScopeDirty(treeScope); |
| 232 } | 231 } |
| 233 | 232 |
| 234 void StyleEngine::modifiedStyleSheetCandidateNode(Node* node) | 233 void StyleEngine::modifiedStyleSheetCandidateNode(Node& node) |
| 235 { | 234 { |
| 236 if (!node->isConnected()) | 235 if (!node.isConnected()) |
| 237 return; | 236 return; |
| 238 | 237 |
| 239 TreeScope& treeScope = isStyleElement(*node) ? node->treeScope() : *m_docume
nt; | 238 TreeScope& treeScope = isStyleElement(node) ? node.treeScope() : *m_document
; |
| 240 DCHECK(isStyleElement(*node) || treeScope == m_document); | 239 DCHECK(isStyleElement(node) || treeScope == m_document); |
| 241 markTreeScopeDirty(treeScope); | 240 markTreeScopeDirty(treeScope); |
| 242 resolverChanged(AnalyzedStyleUpdate); | 241 resolverChanged(AnalyzedStyleUpdate); |
| 243 } | 242 } |
| 244 | 243 |
| 245 void StyleEngine::watchedSelectorsChanged() | 244 void StyleEngine::watchedSelectorsChanged() |
| 246 { | 245 { |
| 247 if (m_resolver) { | 246 if (m_resolver) { |
| 248 m_resolver->initWatchedSelectorRules(); | 247 m_resolver->initWatchedSelectorRules(); |
| 249 m_resolver->resetRuleFeatures(); | 248 m_resolver->resetRuleFeatures(); |
| 250 } | 249 } |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 498 m_dirtyTreeScopes.add(&scope); | 497 m_dirtyTreeScopes.add(&scope); |
| 499 } | 498 } |
| 500 | 499 |
| 501 void StyleEngine::markDocumentDirty() | 500 void StyleEngine::markDocumentDirty() |
| 502 { | 501 { |
| 503 m_documentScopeDirty = true; | 502 m_documentScopeDirty = true; |
| 504 if (document().importLoader()) | 503 if (document().importLoader()) |
| 505 document().importsController()->master()->styleEngine().markDocumentDirt
y(); | 504 document().importsController()->master()->styleEngine().markDocumentDirt
y(); |
| 506 } | 505 } |
| 507 | 506 |
| 508 CSSStyleSheet* StyleEngine::createSheet(Element* e, const String& text, TextPosi
tion startPosition, StyleEngineContext &context) | 507 CSSStyleSheet* StyleEngine::createSheet(Element& element, const String& text, Te
xtPosition startPosition, StyleEngineContext &context) |
| 509 { | 508 { |
| 509 DCHECK(element.document() == document()); |
| 510 CSSStyleSheet* styleSheet = nullptr; | 510 CSSStyleSheet* styleSheet = nullptr; |
| 511 | 511 |
| 512 e->document().styleEngine().addPendingSheet(context); | 512 addPendingSheet(context); |
| 513 | 513 |
| 514 AtomicString textContent(text); | 514 AtomicString textContent(text); |
| 515 | 515 |
| 516 auto result = m_textToSheetCache.add(textContent, nullptr); | 516 auto result = m_textToSheetCache.add(textContent, nullptr); |
| 517 StyleSheetContents* contents = result.storedValue->value; | 517 StyleSheetContents* contents = result.storedValue->value; |
| 518 if (result.isNewEntry || !contents || !contents->isCacheableForStyleElement(
)) { | 518 if (result.isNewEntry || !contents || !contents->isCacheableForStyleElement(
)) { |
| 519 result.storedValue->value = nullptr; | 519 result.storedValue->value = nullptr; |
| 520 styleSheet = StyleEngine::parseSheet(e, text, startPosition); | 520 styleSheet = parseSheet(element, text, startPosition); |
| 521 if (styleSheet->contents()->isCacheableForStyleElement()) { | 521 if (styleSheet->contents()->isCacheableForStyleElement()) { |
| 522 result.storedValue->value = styleSheet->contents(); | 522 result.storedValue->value = styleSheet->contents(); |
| 523 m_sheetToTextCache.add(styleSheet->contents(), textContent); | 523 m_sheetToTextCache.add(styleSheet->contents(), textContent); |
| 524 } | 524 } |
| 525 } else { | 525 } else { |
| 526 DCHECK(contents); | 526 DCHECK(contents); |
| 527 DCHECK(contents->isCacheableForStyleElement()); | 527 DCHECK(contents->isCacheableForStyleElement()); |
| 528 DCHECK(contents->hasSingleOwnerDocument()); | 528 DCHECK(contents->hasSingleOwnerDocument()); |
| 529 contents->setIsUsedFromTextCache(); | 529 contents->setIsUsedFromTextCache(); |
| 530 styleSheet = CSSStyleSheet::createInline(contents, e, startPosition); | 530 styleSheet = CSSStyleSheet::createInline(contents, element, startPositio
n); |
| 531 } | 531 } |
| 532 | 532 |
| 533 DCHECK(styleSheet); | 533 DCHECK(styleSheet); |
| 534 if (!e->isInShadowTree()) { | 534 if (!element.isInShadowTree()) { |
| 535 styleSheet->setTitle(e->title()); | 535 styleSheet->setTitle(element.title()); |
| 536 setPreferredStylesheetSetNameIfNotSet(e->title(), DontUpdateActiveSheets
); | 536 setPreferredStylesheetSetNameIfNotSet(element.title(), DontUpdateActiveS
heets); |
| 537 } | 537 } |
| 538 return styleSheet; | 538 return styleSheet; |
| 539 } | 539 } |
| 540 | 540 |
| 541 CSSStyleSheet* StyleEngine::parseSheet(Element* e, const String& text, TextPosit
ion startPosition) | 541 CSSStyleSheet* StyleEngine::parseSheet(Element& element, const String& text, Tex
tPosition startPosition) |
| 542 { | 542 { |
| 543 CSSStyleSheet* styleSheet = nullptr; | 543 CSSStyleSheet* styleSheet = nullptr; |
| 544 styleSheet = CSSStyleSheet::createInline(e, KURL(), startPosition, e->docume
nt().characterSet()); | 544 styleSheet = CSSStyleSheet::createInline(element, KURL(), startPosition, doc
ument().characterSet()); |
| 545 styleSheet->contents()->parseStringAtPosition(text, startPosition); | 545 styleSheet->contents()->parseStringAtPosition(text, startPosition); |
| 546 return styleSheet; | 546 return styleSheet; |
| 547 } | 547 } |
| 548 | 548 |
| 549 void StyleEngine::collectScopedStyleFeaturesTo(RuleFeatureSet& features) const | 549 void StyleEngine::collectScopedStyleFeaturesTo(RuleFeatureSet& features) const |
| 550 { | 550 { |
| 551 HeapHashSet<Member<const StyleSheetContents>> visitedSharedStyleSheetContent
s; | 551 HeapHashSet<Member<const StyleSheetContents>> visitedSharedStyleSheetContent
s; |
| 552 if (document().scopedStyleResolver()) | 552 if (document().scopedStyleResolver()) |
| 553 document().scopedStyleResolver()->collectFeaturesTo(features, visitedSha
redStyleSheetContents); | 553 document().scopedStyleResolver()->collectFeaturesTo(features, visitedSha
redStyleSheetContents); |
| 554 for (TreeScope* treeScope : m_activeTreeScopes) { | 554 for (TreeScope* treeScope : m_activeTreeScopes) { |
| (...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 836 | 836 |
| 837 DEFINE_TRACE_WRAPPERS(StyleEngine) | 837 DEFINE_TRACE_WRAPPERS(StyleEngine) |
| 838 { | 838 { |
| 839 for (auto sheet : m_injectedAuthorStyleSheets) { | 839 for (auto sheet : m_injectedAuthorStyleSheets) { |
| 840 visitor->traceWrappers(sheet); | 840 visitor->traceWrappers(sheet); |
| 841 } | 841 } |
| 842 visitor->traceWrappers(m_documentStyleSheetCollection); | 842 visitor->traceWrappers(m_documentStyleSheetCollection); |
| 843 } | 843 } |
| 844 | 844 |
| 845 } // namespace blink | 845 } // namespace blink |
| OLD | NEW |