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

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

Issue 2405143003: Separate @viewport from other RuleSet construction. (Closed)
Patch Set: Missing resolve() Created 4 years, 2 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) 2012-2013 Intel Corporation. All rights reserved. 2 * Copyright (C) 2012-2013 Intel Corporation. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above 8 * 1. Redistributions of source code must retain the above
9 * copyright notice, this list of conditions and the following 9 * copyright notice, this list of conditions and the following
10 * disclaimer. 10 * disclaimer.
(...skipping 14 matching lines...) Expand all
25 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 25 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
26 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE. 27 * SUCH DAMAGE.
28 */ 28 */
29 29
30 #include "core/css/resolver/ViewportStyleResolver.h" 30 #include "core/css/resolver/ViewportStyleResolver.h"
31 31
32 #include "core/CSSValueKeywords.h" 32 #include "core/CSSValueKeywords.h"
33 #include "core/css/CSSDefaultStyleSheets.h" 33 #include "core/css/CSSDefaultStyleSheets.h"
34 #include "core/css/CSSPrimitiveValueMappings.h" 34 #include "core/css/CSSPrimitiveValueMappings.h"
35 #include "core/css/CSSStyleSheet.h"
35 #include "core/css/CSSToLengthConversionData.h" 36 #include "core/css/CSSToLengthConversionData.h"
37 #include "core/css/MediaValuesDynamic.h"
36 #include "core/css/StylePropertySet.h" 38 #include "core/css/StylePropertySet.h"
37 #include "core/css/StyleRule.h" 39 #include "core/css/StyleRule.h"
38 #include "core/css/resolver/ScopedStyleResolver.h" 40 #include "core/css/StyleSheetContents.h"
39 #include "core/dom/Document.h" 41 #include "core/dom/Document.h"
40 #include "core/dom/NodeComputedStyle.h" 42 #include "core/dom/NodeComputedStyle.h"
41 #include "core/dom/ViewportDescription.h" 43 #include "core/dom/ViewportDescription.h"
42 #include "core/frame/Settings.h" 44 #include "core/frame/Settings.h"
43 #include "core/layout/api/LayoutViewItem.h" 45 #include "core/layout/api/LayoutViewItem.h"
44 46
45 namespace blink { 47 namespace blink {
46 48
47 ViewportStyleResolver::ViewportStyleResolver(Document* document) 49 ViewportStyleResolver::ViewportStyleResolver(Document* document)
48 : m_document(document), m_hasAuthorStyle(false) { 50 : m_document(document) {
49 ASSERT(m_document); 51 DCHECK(m_document);
52 DCHECK(m_document->frame());
53 // TODO(rune@opera.com): The MediaValues object passed here should reflect the
54 // initial viewport, not the actual viewport. See https://crbug.com/332763
55 m_initialViewportMedium =
56 new MediaQueryEvaluator(MediaValuesDynamic::create(m_document->frame()));
50 } 57 }
51 58
52 void ViewportStyleResolver::collectViewportRules() { 59 void ViewportStyleResolver::reset() {
60 m_viewportDependentMediaQueryResults.clear();
61 m_deviceDependentMediaQueryResults.clear();
62 m_propertySet = nullptr;
63 m_hasAuthorStyle = false;
64 m_hasViewportUnits = false;
65 }
66
67 void ViewportStyleResolver::collectViewportRulesFromUASheets() {
53 CSSDefaultStyleSheets& defaultStyleSheets = CSSDefaultStyleSheets::instance(); 68 CSSDefaultStyleSheets& defaultStyleSheets = CSSDefaultStyleSheets::instance();
54 collectViewportRules(defaultStyleSheets.defaultStyle(), UserAgentOrigin);
55 69
56 WebViewportStyle viewportStyle = m_document->settings() 70 WebViewportStyle viewportStyle = m_document->settings()
57 ? m_document->settings()->viewportStyle() 71 ? m_document->settings()->viewportStyle()
58 : WebViewportStyle::Default; 72 : WebViewportStyle::Default;
59 RuleSet* viewportRules = nullptr; 73 StyleSheetContents* viewportContents = nullptr;
60 switch (viewportStyle) { 74 switch (viewportStyle) {
61 case WebViewportStyle::Default: 75 case WebViewportStyle::Default:
62 break; 76 break;
63 case WebViewportStyle::Mobile: 77 case WebViewportStyle::Mobile:
64 viewportRules = defaultStyleSheets.defaultMobileViewportStyle(); 78 viewportContents = defaultStyleSheets.ensureMobileViewportStyleSheet();
65 break; 79 break;
66 case WebViewportStyle::Television: 80 case WebViewportStyle::Television:
67 viewportRules = defaultStyleSheets.defaultTelevisionViewportStyle(); 81 viewportContents =
82 defaultStyleSheets.ensureTelevisionViewportStyleSheet();
68 break; 83 break;
69 } 84 }
70 if (viewportRules) 85 if (viewportContents)
71 collectViewportRules(viewportRules, UserAgentOrigin); 86 collectViewportChildRules(viewportContents->childRules(), UserAgentOrigin);
72 87 if (m_document->isMobileDocument()) {
73 if (m_document->isMobileDocument()) 88 collectViewportChildRules(
74 collectViewportRules(defaultStyleSheets.defaultXHTMLMobileProfileStyle(), 89 defaultStyleSheets.ensureXHTMLMobileProfileStyleSheet()->childRules(),
75 UserAgentOrigin); 90 UserAgentOrigin);
76 91 }
77 if (ScopedStyleResolver* scopedResolver = m_document->scopedStyleResolver())
78 scopedResolver->collectViewportRulesTo(this);
79
80 resolve();
81 } 92 }
82 93
83 void ViewportStyleResolver::collectViewportRules(RuleSet* rules, 94 void ViewportStyleResolver::collectViewportRulesFromAuthorSheet(
84 Origin origin) { 95 const CSSStyleSheet& sheet) {
85 rules->compactRulesIfNeeded(); 96 if (!sheet.contents()->hasViewportRule())
86 97 return;
87 const HeapVector<Member<StyleRuleViewport>>& viewportRules = 98 if (sheet.mediaQueries() &&
88 rules->viewportRules(); 99 !m_initialViewportMedium->eval(sheet.mediaQueries(),
89 for (size_t i = 0; i < viewportRules.size(); ++i) 100 &m_viewportDependentMediaQueryResults))
90 addViewportRule(viewportRules[i], origin); 101 return;
102 collectViewportChildRules(sheet.contents()->childRules(), AuthorOrigin);
91 } 103 }
92 104
93 void ViewportStyleResolver::addViewportRule(StyleRuleViewport* viewportRule, 105 void ViewportStyleResolver::collectViewportChildRules(
106 const HeapVector<Member<StyleRuleBase>>& rules,
107 Origin origin) {
108 for (auto& rule : rules) {
109 if (rule->isViewportRule())
110 addViewportRule(*toStyleRuleViewport(rule), origin);
111 if (!rule->isMediaRule())
112 continue;
113 StyleRuleMedia* mediaRule = toStyleRuleMedia(rule);
114 if (!mediaRule->mediaQueries() ||
115 m_initialViewportMedium->eval(mediaRule->mediaQueries(),
116 &m_viewportDependentMediaQueryResults))
117 collectViewportChildRules(mediaRule->childRules(), origin);
118 }
119 }
120
121 void ViewportStyleResolver::addViewportRule(StyleRuleViewport& viewportRule,
94 Origin origin) { 122 Origin origin) {
95 StylePropertySet& propertySet = viewportRule->mutableProperties(); 123 StylePropertySet& propertySet = viewportRule.mutableProperties();
96 124
97 unsigned propertyCount = propertySet.propertyCount(); 125 unsigned propertyCount = propertySet.propertyCount();
98 if (!propertyCount) 126 if (!propertyCount)
99 return; 127 return;
100 128
101 if (origin == AuthorOrigin) 129 if (origin == AuthorOrigin)
102 m_hasAuthorStyle = true; 130 m_hasAuthorStyle = true;
103 131
104 if (!m_propertySet) { 132 if (!m_propertySet) {
105 m_propertySet = propertySet.mutableCopy(); 133 m_propertySet = propertySet.mutableCopy();
(...skipping 22 matching lines...) Expand all
128 description.zoom = viewportArgumentValue(CSSPropertyZoom); 156 description.zoom = viewportArgumentValue(CSSPropertyZoom);
129 description.minZoom = viewportArgumentValue(CSSPropertyMinZoom); 157 description.minZoom = viewportArgumentValue(CSSPropertyMinZoom);
130 description.maxZoom = viewportArgumentValue(CSSPropertyMaxZoom); 158 description.maxZoom = viewportArgumentValue(CSSPropertyMaxZoom);
131 description.minWidth = viewportLengthValue(CSSPropertyMinWidth); 159 description.minWidth = viewportLengthValue(CSSPropertyMinWidth);
132 description.maxWidth = viewportLengthValue(CSSPropertyMaxWidth); 160 description.maxWidth = viewportLengthValue(CSSPropertyMaxWidth);
133 description.minHeight = viewportLengthValue(CSSPropertyMinHeight); 161 description.minHeight = viewportLengthValue(CSSPropertyMinHeight);
134 description.maxHeight = viewportLengthValue(CSSPropertyMaxHeight); 162 description.maxHeight = viewportLengthValue(CSSPropertyMaxHeight);
135 description.orientation = viewportArgumentValue(CSSPropertyOrientation); 163 description.orientation = viewportArgumentValue(CSSPropertyOrientation);
136 164
137 m_document->setViewportDescription(description); 165 m_document->setViewportDescription(description);
138
139 m_propertySet = nullptr;
140 m_hasAuthorStyle = false;
141 } 166 }
142 167
143 float ViewportStyleResolver::viewportArgumentValue(CSSPropertyID id) const { 168 float ViewportStyleResolver::viewportArgumentValue(CSSPropertyID id) const {
144 float defaultValue = ViewportDescription::ValueAuto; 169 float defaultValue = ViewportDescription::ValueAuto;
145 170
146 // UserZoom default value is CSSValueZoom, which maps to true, meaning that 171 // UserZoom default value is CSSValueZoom, which maps to true, meaning that
147 // yes, it is user scalable. When the value is set to CSSValueFixed, we 172 // yes, it is user scalable. When the value is set to CSSValueFixed, we
148 // return false. 173 // return false.
149 if (id == CSSPropertyUserZoom) 174 if (id == CSSPropertyUserZoom)
150 defaultValue = 1; 175 defaultValue = 1;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
191 default: 216 default:
192 NOTREACHED(); 217 NOTREACHED();
193 break; 218 break;
194 } 219 }
195 } 220 }
196 221
197 NOTREACHED(); 222 NOTREACHED();
198 return defaultValue; 223 return defaultValue;
199 } 224 }
200 225
201 Length ViewportStyleResolver::viewportLengthValue(CSSPropertyID id) const { 226 Length ViewportStyleResolver::viewportLengthValue(CSSPropertyID id) {
202 ASSERT(id == CSSPropertyMaxHeight || id == CSSPropertyMinHeight || 227 ASSERT(id == CSSPropertyMaxHeight || id == CSSPropertyMinHeight ||
203 id == CSSPropertyMaxWidth || id == CSSPropertyMinWidth); 228 id == CSSPropertyMaxWidth || id == CSSPropertyMinWidth);
204 229
205 const CSSValue* value = m_propertySet->getPropertyCSSValue(id); 230 const CSSValue* value = m_propertySet->getPropertyCSSValue(id);
206 if (!value || !(value->isPrimitiveValue() || value->isIdentifierValue())) 231 if (!value || !(value->isPrimitiveValue() || value->isIdentifierValue()))
207 return Length(); // auto 232 return Length(); // auto
208 233
209 if (value->isIdentifierValue()) { 234 if (value->isIdentifierValue()) {
210 CSSValueID valueID = toCSSIdentifierValue(value)->getValueID(); 235 CSSValueID valueID = toCSSIdentifierValue(value)->getValueID();
211 if (valueID == CSSValueInternalExtendToZoom) 236 if (valueID == CSSValueInternalExtendToZoom)
(...skipping 10 matching lines...) Expand all
222 bool documentStyleHasViewportUnits = documentStyle->hasViewportUnits(); 247 bool documentStyleHasViewportUnits = documentStyle->hasViewportUnits();
223 documentStyle->setHasViewportUnits(false); 248 documentStyle->setHasViewportUnits(false);
224 249
225 CSSToLengthConversionData::FontSizes fontSizes(documentStyle, documentStyle); 250 CSSToLengthConversionData::FontSizes fontSizes(documentStyle, documentStyle);
226 CSSToLengthConversionData::ViewportSize viewportSize( 251 CSSToLengthConversionData::ViewportSize viewportSize(
227 m_document->layoutViewItem()); 252 m_document->layoutViewItem());
228 253
229 Length result = primitiveValue->convertToLength( 254 Length result = primitiveValue->convertToLength(
230 CSSToLengthConversionData(documentStyle, fontSizes, viewportSize, 1.0f)); 255 CSSToLengthConversionData(documentStyle, fontSizes, viewportSize, 1.0f));
231 if (documentStyle->hasViewportUnits()) 256 if (documentStyle->hasViewportUnits())
232 m_document->setHasViewportUnits(); 257 m_hasViewportUnits = true;
233 documentStyle->setHasViewportUnits(documentStyleHasViewportUnits); 258 documentStyle->setHasViewportUnits(documentStyleHasViewportUnits);
234 259
235 return result; 260 return result;
236 } 261 }
237 262
263 bool ViewportStyleResolver::isAffectedByInitialViewportChange() {
264 if (m_hasViewportUnits)
265 return true;
266 auto& results = m_viewportDependentMediaQueryResults;
267 for (unsigned i = 0; i < results.size(); i++) {
268 if (m_initialViewportMedium->eval(results[i]->expression()) !=
269 results[i]->result())
270 return true;
271 }
272 return false;
273 }
274
238 DEFINE_TRACE(ViewportStyleResolver) { 275 DEFINE_TRACE(ViewportStyleResolver) {
276 visitor->trace(m_document);
239 visitor->trace(m_propertySet); 277 visitor->trace(m_propertySet);
240 visitor->trace(m_document); 278 visitor->trace(m_initialViewportMedium);
279 visitor->trace(m_viewportDependentMediaQueryResults);
280 visitor->trace(m_deviceDependentMediaQueryResults);
241 } 281 }
242 282
243 } // namespace blink 283 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698