Index: third_party/WebKit/Source/core/dom/StyleEngine.cpp |
diff --git a/third_party/WebKit/Source/core/dom/StyleEngine.cpp b/third_party/WebKit/Source/core/dom/StyleEngine.cpp |
index 0634c6ef6687e915f7a688860400b3aca78550f3..9a6c0f7ba95c94b94caad9d410460037562642b3 100644 |
--- a/third_party/WebKit/Source/core/dom/StyleEngine.cpp |
+++ b/third_party/WebKit/Source/core/dom/StyleEngine.cpp |
@@ -78,6 +78,8 @@ StyleEngine::StyleEngine(Document& document) |
} |
if (document.IsInMainFrame()) |
viewport_resolver_ = ViewportStyleResolver::Create(document); |
+ if (IsMaster()) |
+ global_rule_set_ = CSSGlobalRuleSet::Create(); |
} |
StyleEngine::~StyleEngine() {} |
@@ -252,7 +254,9 @@ void StyleEngine::MediaQueriesChangedInScope(TreeScope& tree_scope) { |
} |
void StyleEngine::WatchedSelectorsChanged() { |
- global_rule_set_.InitWatchedSelectorsRuleSet(GetDocument()); |
+ DCHECK(IsMaster()); |
+ DCHECK(global_rule_set_); |
+ global_rule_set_->InitWatchedSelectorsRuleSet(GetDocument()); |
// TODO(rune@opera.com): Should be able to use RuleSetInvalidation here. |
GetDocument().SetNeedsStyleRecalc( |
kSubtreeStyleChange, StyleChangeReasonForTracing::Create( |
@@ -357,7 +361,8 @@ void StyleEngine::UpdateViewport() { |
bool StyleEngine::NeedsActiveStyleUpdate() const { |
return (viewport_resolver_ && viewport_resolver_->NeedsUpdate()) || |
- NeedsActiveStyleSheetUpdate() || global_rule_set_.IsDirty(); |
+ NeedsActiveStyleSheetUpdate() || |
+ (global_rule_set_ && global_rule_set_->IsDirty()); |
} |
void StyleEngine::UpdateActiveStyle() { |
@@ -409,7 +414,7 @@ void StyleEngine::ResetAuthorStyle(TreeScope& tree_scope) { |
if (!scoped_resolver) |
return; |
- global_rule_set_.MarkDirty(); |
+ global_rule_set_->MarkDirty(); |
if (tree_scope.RootNode().IsDocumentNode()) { |
scoped_resolver->ResetAuthorStyle(); |
return; |
@@ -459,7 +464,9 @@ void StyleEngine::ClearResolvers() { |
void StyleEngine::DidDetach() { |
ClearResolvers(); |
- global_rule_set_.Dispose(); |
+ if (global_rule_set_) |
+ global_rule_set_->Dispose(); |
+ global_rule_set_ = nullptr; |
tree_boundary_crossing_scopes_.Clear(); |
dirty_tree_scopes_.clear(); |
active_tree_scopes_.clear(); |
@@ -950,23 +957,29 @@ void StyleEngine::SetHttpDefaultStyle(const String& content) { |
} |
void StyleEngine::EnsureUAStyleForFullscreen() { |
- if (global_rule_set_.HasFullscreenUAStyle()) |
+ DCHECK(IsMaster()); |
+ DCHECK(global_rule_set_); |
+ if (global_rule_set_->HasFullscreenUAStyle()) |
return; |
CSSDefaultStyleSheets::Instance().EnsureDefaultStyleSheetForFullscreen(); |
- global_rule_set_.MarkDirty(); |
+ global_rule_set_->MarkDirty(); |
UpdateActiveStyle(); |
} |
void StyleEngine::EnsureUAStyleForElement(const Element& element) { |
+ DCHECK(IsMaster()); |
+ DCHECK(global_rule_set_); |
if (CSSDefaultStyleSheets::Instance().EnsureDefaultStyleSheetsForElement( |
element)) { |
- global_rule_set_.MarkDirty(); |
+ global_rule_set_->MarkDirty(); |
UpdateActiveStyle(); |
} |
} |
bool StyleEngine::HasRulesForId(const AtomicString& id) const { |
- return global_rule_set_.GetRuleFeatureSet().HasSelectorForId(id); |
+ DCHECK(IsMaster()); |
+ DCHECK(global_rule_set_); |
+ return global_rule_set_->GetRuleFeatureSet().HasSelectorForId(id); |
} |
void StyleEngine::InitialViewportChanged() { |
@@ -1011,11 +1024,13 @@ void StyleEngine::HtmlImportAddedOrRemoved() { |
PassRefPtr<ComputedStyle> StyleEngine::FindSharedStyle( |
const ElementResolveContext& element_resolve_context) { |
+ DCHECK(IsMaster()); |
DCHECK(resolver_); |
+ DCHECK(global_rule_set_); |
return SharedStyleFinder( |
- element_resolve_context, global_rule_set_.GetRuleFeatureSet(), |
- global_rule_set_.SiblingRuleSet(), |
- global_rule_set_.UncommonAttributeRuleSet(), *resolver_) |
+ element_resolve_context, global_rule_set_->GetRuleFeatureSet(), |
+ global_rule_set_->SiblingRuleSet(), |
+ global_rule_set_->UncommonAttributeRuleSet(), *resolver_) |
.FindSharedStyle(); |
} |
namespace { |
@@ -1046,6 +1061,8 @@ void StyleEngine::ApplyRuleSetChanges( |
TreeScope& tree_scope, |
const ActiveStyleSheetVector& old_style_sheets, |
const ActiveStyleSheetVector& new_style_sheets) { |
+ DCHECK(IsMaster()); |
+ DCHECK(global_rule_set_); |
HeapHashSet<Member<RuleSet>> changed_rule_sets; |
ScopedStyleResolver* scoped_resolver = tree_scope.GetScopedStyleResolver(); |
@@ -1058,7 +1075,7 @@ void StyleEngine::ApplyRuleSetChanges( |
return; |
// With rules added or removed, we need to re-aggregate rule meta data. |
- global_rule_set_.MarkDirty(); |
+ global_rule_set_->MarkDirty(); |
unsigned changed_rule_flags = GetRuleSetFlags(changed_rule_sets); |
bool fonts_changed = tree_scope.RootNode().IsDocumentNode() && |
@@ -1132,9 +1149,11 @@ const MediaQueryEvaluator& StyleEngine::EnsureMediaQueryEvaluator() { |
} |
bool StyleEngine::MediaQueryAffectedByViewportChange() { |
+ DCHECK(IsMaster()); |
+ DCHECK(global_rule_set_); |
const MediaQueryEvaluator& evaluator = EnsureMediaQueryEvaluator(); |
- const auto& results = |
- global_rule_set_.GetRuleFeatureSet().ViewportDependentMediaQueryResults(); |
+ const auto& results = global_rule_set_->GetRuleFeatureSet() |
+ .ViewportDependentMediaQueryResults(); |
for (unsigned i = 0; i < results.size(); ++i) { |
if (evaluator.Eval(results[i].Expression()) != results[i].Result()) |
return true; |
@@ -1143,9 +1162,11 @@ bool StyleEngine::MediaQueryAffectedByViewportChange() { |
} |
bool StyleEngine::MediaQueryAffectedByDeviceChange() { |
+ DCHECK(IsMaster()); |
+ DCHECK(global_rule_set_); |
const MediaQueryEvaluator& evaluator = EnsureMediaQueryEvaluator(); |
const auto& results = |
- global_rule_set_.GetRuleFeatureSet().DeviceDependentMediaQueryResults(); |
+ global_rule_set_->GetRuleFeatureSet().DeviceDependentMediaQueryResults(); |
for (unsigned i = 0; i < results.size(); ++i) { |
if (evaluator.Eval(results[i].Expression()) != results[i].Result()) |
return true; |
@@ -1162,10 +1183,10 @@ DEFINE_TRACE(StyleEngine) { |
visitor->Trace(dirty_tree_scopes_); |
visitor->Trace(active_tree_scopes_); |
visitor->Trace(tree_boundary_crossing_scopes_); |
- visitor->Trace(global_rule_set_); |
visitor->Trace(resolver_); |
visitor->Trace(viewport_resolver_); |
visitor->Trace(media_query_evaluator_); |
+ visitor->Trace(global_rule_set_); |
visitor->Trace(style_invalidator_); |
visitor->Trace(font_selector_); |
visitor->Trace(text_to_sheet_cache_); |