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

Side by Side Diff: third_party/WebKit/Source/core/dom/DocumentStyleSheetCollection.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) 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, 2010, 2012 Apple Inc. All r ights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 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) 2010 Nokia Corporation and/or its subsidiary(-ies) 8 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
9 * Copyright (C) 2013 Google Inc. All rights reserved. 9 * Copyright (C) 2013 Google Inc. All rights reserved.
10 * 10 *
11 * This library is free software; you can redistribute it and/or 11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Library General Public 12 * modify it under the terms of the GNU Library General Public
13 * License as published by the Free Software Foundation; either 13 * License as published by the Free Software Foundation; either
14 * version 2 of the License, or (at your option) any later version. 14 * version 2 of the License, or (at your option) any later version.
15 * 15 *
16 * This library is distributed in the hope that it will be useful, 16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Library General Public License for more details. 19 * Library General Public License for more details.
20 * 20 *
21 * You should have received a copy of the GNU Library General Public License 21 * You should have received a copy of the GNU Library General Public License
22 * along with this library; see the file COPYING.LIB. If not, write to 22 * along with this library; see the file COPYING.LIB. If not, write to
23 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 23 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 * Boston, MA 02110-1301, USA. 24 * Boston, MA 02110-1301, USA.
25 */ 25 */
26 26
27 #include "core/dom/DocumentStyleSheetCollection.h" 27 #include "core/dom/DocumentStyleSheetCollection.h"
28 28
29 #include "core/css/StyleSheetContents.h"
29 #include "core/css/resolver/StyleResolver.h" 30 #include "core/css/resolver/StyleResolver.h"
31 #include "core/css/resolver/ViewportStyleResolver.h"
30 #include "core/dom/Document.h" 32 #include "core/dom/Document.h"
31 #include "core/dom/DocumentStyleSheetCollector.h" 33 #include "core/dom/DocumentStyleSheetCollector.h"
32 #include "core/dom/ProcessingInstruction.h" 34 #include "core/dom/ProcessingInstruction.h"
33 #include "core/dom/StyleChangeReason.h" 35 #include "core/dom/StyleChangeReason.h"
34 #include "core/dom/StyleEngine.h" 36 #include "core/dom/StyleEngine.h"
35 #include "core/dom/StyleSheetCandidate.h" 37 #include "core/dom/StyleSheetCandidate.h"
36 #include "platform/RuntimeEnabledFeatures.h" 38 #include "platform/RuntimeEnabledFeatures.h"
37 39
38 namespace blink { 40 namespace blink {
39 41
40 DocumentStyleSheetCollection::DocumentStyleSheetCollection(TreeScope& treeScope) 42 DocumentStyleSheetCollection::DocumentStyleSheetCollection(TreeScope& treeScope)
41 : TreeScopeStyleSheetCollection(treeScope) 43 : TreeScopeStyleSheetCollection(treeScope)
42 { 44 {
43 DCHECK_EQ(treeScope.rootNode(), treeScope.rootNode().document()); 45 DCHECK_EQ(treeScope.rootNode(), treeScope.rootNode().document());
44 } 46 }
45 47
46 void DocumentStyleSheetCollection::collectStyleSheetsFromCandidates(StyleEngine& engine, DocumentStyleSheetCollector& collector) 48 void DocumentStyleSheetCollection::updateViewport()
49 {
50 ViewportStyleResolver& resolver = document().styleEngine().ensureViewportSty leResolver();
51
52 resolver.reset();
53 resolver.collectViewportRulesFromUASheets();
54
55 for (Node* node : m_styleSheetCandidateNodes) {
56 StyleSheetCandidate candidate(*node);
57
58 if (candidate.isImport())
59 continue;
60 StyleSheet* sheet = candidate.sheet();
61 if (!sheet)
62 continue;
63 if (!candidate.canBeActivated(document().styleEngine().preferredStyleshe etSetName()))
64 continue;
65 resolver.collectViewportRulesFromAuthorSheet(*toCSSStyleSheet(sheet));
66 }
67
68 resolver.resolve();
69 }
70
71 void DocumentStyleSheetCollection::collectStyleSheetsFromCandidates(DocumentStyl eSheetCollector& collector)
47 { 72 {
48 for (Node* n : m_styleSheetCandidateNodes) { 73 for (Node* n : m_styleSheetCandidateNodes) {
49 StyleSheetCandidate candidate(*n); 74 StyleSheetCandidate candidate(*n);
50 75
51 DCHECK(!candidate.isXSL()); 76 DCHECK(!candidate.isXSL());
52 if (candidate.isImport()) { 77 if (candidate.isImport()) {
53 Document* document = candidate.importedDocument(); 78 Document* document = candidate.importedDocument();
54 if (!document) 79 if (!document)
55 continue; 80 continue;
56 if (collector.hasVisited(document)) 81 if (collector.hasVisited(document))
57 continue; 82 continue;
58 collector.willVisit(document); 83 collector.willVisit(document);
59 document->styleEngine().updateStyleSheetsInImport(collector); 84 document->styleEngine().updateStyleSheetsInImport(collector);
60 continue; 85 continue;
61 } 86 }
62 87
63 if (candidate.isEnabledAndLoading()) { 88 if (candidate.isEnabledAndLoading())
64 // it is loading but we should still decide which style sheet set to use
65 if (candidate.hasPreferrableName())
66 engine.setPreferredStylesheetSetNameIfNotSet(candidate.title());
67 continue; 89 continue;
68 }
69 90
70 StyleSheet* sheet = candidate.sheet(); 91 StyleSheet* sheet = candidate.sheet();
71 if (!sheet) 92 if (!sheet)
72 continue; 93 continue;
73 94
74 if (candidate.hasPreferrableName())
75 engine.setPreferredStylesheetSetNameIfNotSet(candidate.title());
76 collector.appendSheetForList(sheet); 95 collector.appendSheetForList(sheet);
77 if (candidate.canBeActivated(engine.preferredStylesheetSetName())) 96
78 collector.appendActiveStyleSheet(toCSSStyleSheet(sheet)); 97 if (!candidate.canBeActivated(document().styleEngine().preferredStyleshe etSetName()))
98 continue;
99
100 CSSStyleSheet* cssSheet = toCSSStyleSheet(sheet);
101 collector.appendActiveStyleSheet(std::make_pair(cssSheet, &document().st yleEngine().ensureRuleSetForSheet(*cssSheet)));
79 } 102 }
80 } 103 }
81 104
82 void DocumentStyleSheetCollection::collectStyleSheets(StyleEngine& engine, Docum entStyleSheetCollector& collector) 105 void DocumentStyleSheetCollection::collectStyleSheets(DocumentStyleSheetCollecto r& collector)
83 { 106 {
84 DCHECK_EQ(&document().styleEngine(), &engine); 107 for (auto& sheet : document().styleEngine().injectedAuthorStyleSheets())
85 collector.appendActiveStyleSheets(engine.injectedAuthorStyleSheets()); 108 collector.appendActiveStyleSheet(std::make_pair(sheet, &document().style Engine().ensureRuleSetForSheet(*sheet)));
86 collectStyleSheetsFromCandidates(engine, collector); 109
110 collectStyleSheetsFromCandidates(collector);
87 } 111 }
88 112
89 void DocumentStyleSheetCollection::updateActiveStyleSheets(StyleEngine& engine, StyleResolverUpdateMode updateMode) 113 void DocumentStyleSheetCollection::updateActiveStyleSheets()
90 { 114 {
91 StyleSheetCollection collection; 115 StyleSheetCollection collection;
92 ActiveDocumentStyleSheetCollector collector(collection); 116 ActiveDocumentStyleSheetCollector collector(collection);
93 collectStyleSheets(engine, collector); 117 collectStyleSheets(collector);
94 118 applyActiveStyleSheetChanges(collection);
95 StyleSheetChange change;
96 analyzeStyleSheetChange(updateMode, collection, change);
97
98 if (change.styleResolverUpdateType == Reconstruct) {
99 engine.clearMasterResolver();
100 // TODO(rune@opera.com): The following depends on whether StyleRuleFontF ace was modified or not.
101 // We should only remove modified/removed @font-face rules, or @font-fac e rules from removed
102 // stylesheets. We currently avoid clearing the font cache when we have had an analyzed update
103 // and no @font-face rules were removed, in which case requiresFullStyle Recalc will be false.
104 if (change.requiresFullStyleRecalc)
105 engine.clearFontCache();
106 } else if (StyleResolver* styleResolver = engine.resolver()) {
107 if (change.styleResolverUpdateType != Additive) {
108 DCHECK_EQ(change.styleResolverUpdateType, Reset);
109 styleResolver->resetAuthorStyle(treeScope());
110 engine.removeFontFaceRules(change.fontFaceRulesToRemove);
111 styleResolver->removePendingAuthorStyleSheets(m_activeAuthorStyleShe ets);
112 styleResolver->lazyAppendAuthorStyleSheets(0, collection.activeAutho rStyleSheets());
113 } else {
114 styleResolver->lazyAppendAuthorStyleSheets(m_activeAuthorStyleSheets .size(), collection.activeAuthorStyleSheets());
115 }
116 }
117 if (change.requiresFullStyleRecalc)
118 document().setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForT racing::create(StyleChangeReason::ActiveStylesheetsUpdate));
119
120 collection.swap(*this);
121 } 119 }
122 120
123 DEFINE_TRACE_WRAPPERS(DocumentStyleSheetCollection) 121 DEFINE_TRACE_WRAPPERS(DocumentStyleSheetCollection)
124 { 122 {
125 for (auto sheet : m_styleSheetsForStyleSheetList) { 123 for (auto sheet : m_styleSheetsForStyleSheetList) {
126 visitor->traceWrappers(sheet); 124 visitor->traceWrappers(sheet);
127 } 125 }
128 } 126 }
129 } // namespace blink 127 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698