| 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 | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All |
| 7 * rights reserved. | 7 * rights reserved. |
| 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. |
| 9 * (http://www.torchmobile.com/) | 9 * (http://www.torchmobile.com/) |
| 10 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 10 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 87 inline Document* StyleEngine::Master() { | 87 inline Document* StyleEngine::Master() { |
| 88 if (IsMaster()) | 88 if (IsMaster()) |
| 89 return document_; | 89 return document_; |
| 90 HTMLImportsController* import = GetDocument().ImportsController(); | 90 HTMLImportsController* import = GetDocument().ImportsController(); |
| 91 // Document::import() can return null while executing its destructor. | 91 // Document::import() can return null while executing its destructor. |
| 92 if (!import) | 92 if (!import) |
| 93 return nullptr; | 93 return nullptr; |
| 94 return import->Master(); | 94 return import->Master(); |
| 95 } | 95 } |
| 96 | 96 |
| 97 TreeScopeStyleSheetCollection* StyleEngine::EnsureStyleSheetCollectionFor( | 97 TreeScopeStyleSheetCollection& StyleEngine::EnsureStyleSheetCollectionFor( |
| 98 TreeScope& tree_scope) { | 98 TreeScope& tree_scope) { |
| 99 if (tree_scope == document_) | 99 if (tree_scope == document_) |
| 100 return &GetDocumentStyleSheetCollection(); | 100 return GetDocumentStyleSheetCollection(); |
| 101 | 101 |
| 102 StyleSheetCollectionMap::AddResult result = | 102 StyleSheetCollectionMap::AddResult result = |
| 103 style_sheet_collection_map_.insert(&tree_scope, nullptr); | 103 style_sheet_collection_map_.insert(&tree_scope, nullptr); |
| 104 if (result.is_new_entry) | 104 if (result.is_new_entry) |
| 105 result.stored_value->value = | 105 result.stored_value->value = |
| 106 new ShadowTreeStyleSheetCollection(ToShadowRoot(tree_scope)); | 106 new ShadowTreeStyleSheetCollection(ToShadowRoot(tree_scope)); |
| 107 return result.stored_value->value.Get(); | 107 return *result.stored_value->value.Get(); |
| 108 } | 108 } |
| 109 | 109 |
| 110 TreeScopeStyleSheetCollection* StyleEngine::StyleSheetCollectionFor( | 110 TreeScopeStyleSheetCollection* StyleEngine::StyleSheetCollectionFor( |
| 111 TreeScope& tree_scope) { | 111 TreeScope& tree_scope) { |
| 112 if (tree_scope == document_) | 112 if (tree_scope == document_) |
| 113 return &GetDocumentStyleSheetCollection(); | 113 return &GetDocumentStyleSheetCollection(); |
| 114 | 114 |
| 115 StyleSheetCollectionMap::iterator it = | 115 StyleSheetCollectionMap::iterator it = |
| 116 style_sheet_collection_map_.find(&tree_scope); | 116 style_sheet_collection_map_.find(&tree_scope); |
| 117 if (it == style_sheet_collection_map_.end()) | 117 if (it == style_sheet_collection_map_.end()) |
| 118 return nullptr; | 118 return nullptr; |
| 119 return it->value.Get(); | 119 return it->value.Get(); |
| 120 } | 120 } |
| 121 | 121 |
| 122 const HeapVector<TraceWrapperMember<StyleSheet>>& | 122 const HeapVector<TraceWrapperMember<StyleSheet>>& |
| 123 StyleEngine::StyleSheetsForStyleSheetList(TreeScope& tree_scope) { | 123 StyleEngine::StyleSheetsForStyleSheetList(TreeScope& tree_scope) { |
| 124 DCHECK(Master()); | 124 DCHECK(Master()); |
| 125 TreeScopeStyleSheetCollection& collection = |
| 126 EnsureStyleSheetCollectionFor(tree_scope); |
| 125 if (Master()->IsActive()) { | 127 if (Master()->IsActive()) { |
| 126 if (IsMaster()) { | 128 if (all_tree_scopes_dirty_) { |
| 127 // TODO(rune@opera.com): Replace with UpdateStyleSheetList(). | 129 // If all tree scopes are dirty, update all of active style. Otherwise, we |
| 130 // would have to mark all tree scopes explicitly dirty for stylesheet list |
| 131 // or repeatedly update the stylesheet list on styleSheets access. Note |
| 132 // that this can only happen once if we kDidLayoutWithPendingSheets in |
| 133 // Document::UpdateStyleAndLayoutTreeIgnoringPendingStyleSheets. |
| 128 UpdateActiveStyle(); | 134 UpdateActiveStyle(); |
| 129 } else { | 135 } else { |
| 130 UpdateStyleSheetList(tree_scope); | 136 collection.UpdateStyleSheetList(); |
| 131 } | 137 } |
| 132 } | 138 } |
| 133 | 139 return collection.StyleSheetsForStyleSheetList(); |
| 134 if (tree_scope == document_) | |
| 135 return GetDocumentStyleSheetCollection().StyleSheetsForStyleSheetList(); | |
| 136 | |
| 137 DCHECK(IsMaster()); | |
| 138 return EnsureStyleSheetCollectionFor(tree_scope) | |
| 139 ->StyleSheetsForStyleSheetList(); | |
| 140 } | |
| 141 | |
| 142 void StyleEngine::UpdateStyleSheetList(TreeScope& tree_scope) { | |
| 143 // TODO(rune@opera.com): currently only for import documents. | |
| 144 DCHECK(!IsMaster()); | |
| 145 DCHECK(tree_scope.GetDocument() == GetDocument()); | |
| 146 | |
| 147 if (tree_scope != GetDocument()) | |
| 148 return; | |
| 149 if (!ShouldUpdateDocumentStyleSheetCollection()) | |
| 150 return; | |
| 151 | |
| 152 GetDocumentStyleSheetCollection().CollectStyleSheetsForList(); | |
| 153 // Avoid updating the styleSheets list repeatedly. Only safe for imports. | |
| 154 document_scope_dirty_ = false; | |
| 155 DCHECK(!all_tree_scopes_dirty_); | |
| 156 } | 140 } |
| 157 | 141 |
| 158 void StyleEngine::InjectAuthorSheet(StyleSheetContents* author_sheet) { | 142 void StyleEngine::InjectAuthorSheet(StyleSheetContents* author_sheet) { |
| 159 injected_author_style_sheets_.push_back(TraceWrapperMember<CSSStyleSheet>( | 143 injected_author_style_sheets_.push_back(TraceWrapperMember<CSSStyleSheet>( |
| 160 this, CSSStyleSheet::Create(author_sheet, *document_))); | 144 this, CSSStyleSheet::Create(author_sheet, *document_))); |
| 161 MarkDocumentDirty(); | 145 MarkDocumentDirty(); |
| 162 } | 146 } |
| 163 | 147 |
| 164 CSSStyleSheet& StyleEngine::EnsureInspectorStyleSheet() { | 148 CSSStyleSheet& StyleEngine::EnsureInspectorStyleSheet() { |
| 165 if (inspector_style_sheet_) | 149 if (inspector_style_sheet_) |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 if (GetDocument().IsActive() || !IsMaster()) | 203 if (GetDocument().IsActive() || !IsMaster()) |
| 220 MarkTreeScopeDirty(tree_scope); | 204 MarkTreeScopeDirty(tree_scope); |
| 221 } | 205 } |
| 222 | 206 |
| 223 void StyleEngine::AddStyleSheetCandidateNode(Node& node) { | 207 void StyleEngine::AddStyleSheetCandidateNode(Node& node) { |
| 224 if (!node.isConnected() || GetDocument().IsDetached()) | 208 if (!node.isConnected() || GetDocument().IsDetached()) |
| 225 return; | 209 return; |
| 226 | 210 |
| 227 DCHECK(!IsXSLStyleSheet(node)); | 211 DCHECK(!IsXSLStyleSheet(node)); |
| 228 TreeScope& tree_scope = node.GetTreeScope(); | 212 TreeScope& tree_scope = node.GetTreeScope(); |
| 229 TreeScopeStyleSheetCollection* collection = | 213 EnsureStyleSheetCollectionFor(tree_scope).AddStyleSheetCandidateNode(node); |
| 230 EnsureStyleSheetCollectionFor(tree_scope); | |
| 231 DCHECK(collection); | |
| 232 collection->AddStyleSheetCandidateNode(node); | |
| 233 | 214 |
| 234 SetNeedsActiveStyleUpdate(tree_scope); | 215 SetNeedsActiveStyleUpdate(tree_scope); |
| 235 if (tree_scope != document_) | 216 if (tree_scope != document_) |
| 236 active_tree_scopes_.insert(&tree_scope); | 217 active_tree_scopes_.insert(&tree_scope); |
| 237 } | 218 } |
| 238 | 219 |
| 239 void StyleEngine::RemoveStyleSheetCandidateNode( | 220 void StyleEngine::RemoveStyleSheetCandidateNode( |
| 240 Node& node, | 221 Node& node, |
| 241 ContainerNode& insertion_point) { | 222 ContainerNode& insertion_point) { |
| 242 DCHECK(!IsXSLStyleSheet(node)); | 223 DCHECK(!IsXSLStyleSheet(node)); |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 HeapVector<Member<StyleSheet>> sheets_for_list; | 296 HeapVector<Member<StyleSheet>> sheets_for_list; |
| 316 ImportedDocumentStyleSheetCollector subcollector(parent_collector, | 297 ImportedDocumentStyleSheetCollector subcollector(parent_collector, |
| 317 sheets_for_list); | 298 sheets_for_list); |
| 318 GetDocumentStyleSheetCollection().CollectStyleSheets(master_engine, | 299 GetDocumentStyleSheetCollection().CollectStyleSheets(master_engine, |
| 319 subcollector); | 300 subcollector); |
| 320 GetDocumentStyleSheetCollection().SwapSheetsForSheetList(sheets_for_list); | 301 GetDocumentStyleSheetCollection().SwapSheetsForSheetList(sheets_for_list); |
| 321 | 302 |
| 322 // all_tree_scopes_dirty_ should only be set on main documents, never html | 303 // all_tree_scopes_dirty_ should only be set on main documents, never html |
| 323 // imports. | 304 // imports. |
| 324 DCHECK(!all_tree_scopes_dirty_); | 305 DCHECK(!all_tree_scopes_dirty_); |
| 325 // Make sure we don't re-collect sheets for style sheet list. | 306 // Mark false for consistency. It is never checked for import documents. |
| 326 document_scope_dirty_ = false; | 307 document_scope_dirty_ = false; |
| 327 // Dirty tree scopes shadow trees do not affect the main document. Just leave | |
| 328 // them dirty here and re-collect when styleSheets is queried on shadow roots | |
| 329 // inside html import documents. | |
| 330 // tree_scopes_removed_ is irrelevant for html imports as the sheets do not | |
| 331 // affect style and removing a shadow tree is reflected directly in | |
| 332 // StyleSheetList accessing length or items. | |
| 333 } | 308 } |
| 334 | 309 |
| 335 void StyleEngine::UpdateActiveStyleSheetsInShadow( | 310 void StyleEngine::UpdateActiveStyleSheetsInShadow( |
| 336 TreeScope* tree_scope, | 311 TreeScope* tree_scope, |
| 337 UnorderedTreeScopeSet& tree_scopes_removed) { | 312 UnorderedTreeScopeSet& tree_scopes_removed) { |
| 338 DCHECK_NE(tree_scope, document_); | 313 DCHECK_NE(tree_scope, document_); |
| 339 ShadowTreeStyleSheetCollection* collection = | 314 ShadowTreeStyleSheetCollection* collection = |
| 340 ToShadowTreeStyleSheetCollection(StyleSheetCollectionFor(*tree_scope)); | 315 ToShadowTreeStyleSheetCollection(StyleSheetCollectionFor(*tree_scope)); |
| 341 DCHECK(collection); | 316 DCHECK(collection); |
| 342 collection->UpdateActiveStyleSheets(*this); | 317 collection->UpdateActiveStyleSheets(*this); |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 if (resolver_) | 513 if (resolver_) |
| 539 resolver_->InvalidateMatchedPropertiesCache(); | 514 resolver_->InvalidateMatchedPropertiesCache(); |
| 540 } | 515 } |
| 541 | 516 |
| 542 void StyleEngine::MarkTreeScopeDirty(TreeScope& scope) { | 517 void StyleEngine::MarkTreeScopeDirty(TreeScope& scope) { |
| 543 if (scope == document_) { | 518 if (scope == document_) { |
| 544 MarkDocumentDirty(); | 519 MarkDocumentDirty(); |
| 545 return; | 520 return; |
| 546 } | 521 } |
| 547 | 522 |
| 548 DCHECK(style_sheet_collection_map_.Contains(&scope)); | 523 TreeScopeStyleSheetCollection* collection = StyleSheetCollectionFor(scope); |
| 524 DCHECK(collection); |
| 525 collection->MarkSheetListDirty(); |
| 549 dirty_tree_scopes_.insert(&scope); | 526 dirty_tree_scopes_.insert(&scope); |
| 550 GetDocument().ScheduleLayoutTreeUpdateIfNeeded(); | 527 GetDocument().ScheduleLayoutTreeUpdateIfNeeded(); |
| 551 } | 528 } |
| 552 | 529 |
| 553 void StyleEngine::MarkDocumentDirty() { | 530 void StyleEngine::MarkDocumentDirty() { |
| 554 document_scope_dirty_ = true; | 531 document_scope_dirty_ = true; |
| 532 document_style_sheet_collection_->MarkSheetListDirty(); |
| 555 if (RuntimeEnabledFeatures::cssViewportEnabled()) | 533 if (RuntimeEnabledFeatures::cssViewportEnabled()) |
| 556 ViewportRulesChanged(); | 534 ViewportRulesChanged(); |
| 557 if (GetDocument().ImportLoader()) | 535 if (GetDocument().ImportLoader()) |
| 558 GetDocument() | 536 GetDocument() |
| 559 .ImportsController() | 537 .ImportsController() |
| 560 ->Master() | 538 ->Master() |
| 561 ->GetStyleEngine() | 539 ->GetStyleEngine() |
| 562 .MarkDocumentDirty(); | 540 .MarkDocumentDirty(); |
| 563 else | 541 else |
| 564 GetDocument().ScheduleLayoutTreeUpdateIfNeeded(); | 542 GetDocument().ScheduleLayoutTreeUpdateIfNeeded(); |
| (...skipping 665 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1230 } | 1208 } |
| 1231 | 1209 |
| 1232 DEFINE_TRACE_WRAPPERS(StyleEngine) { | 1210 DEFINE_TRACE_WRAPPERS(StyleEngine) { |
| 1233 for (auto sheet : injected_author_style_sheets_) { | 1211 for (auto sheet : injected_author_style_sheets_) { |
| 1234 visitor->TraceWrappers(sheet); | 1212 visitor->TraceWrappers(sheet); |
| 1235 } | 1213 } |
| 1236 visitor->TraceWrappers(document_style_sheet_collection_); | 1214 visitor->TraceWrappers(document_style_sheet_collection_); |
| 1237 } | 1215 } |
| 1238 | 1216 |
| 1239 } // namespace blink | 1217 } // namespace blink |
| OLD | NEW |