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

Side by Side Diff: Source/core/css/MediaQueryEvaluator.cpp

Issue 18328028: Enable MQ evaluation off the main thread (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@threaded_mqe_rebase
Patch Set: Created 7 years, 5 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 * CSS Media Query Evaluator 2 * CSS Media Query Evaluator
3 * 3 *
4 * Copyright (C) 2006 Kimmo Kinnunen <kimmo.t.kinnunen@nokia.com>. 4 * Copyright (C) 2006 Kimmo Kinnunen <kimmo.t.kinnunen@nokia.com>.
5 * Copyright (C) 2013 Apple Inc. All rights reserved. 5 * Copyright (C) 2013 Apple Inc. All rights reserved.
6 * Copyright (C) 2013 Intel Corporation. All rights reserved. 6 * Copyright (C) 2013 Intel Corporation. All rights reserved.
7 * 7 *
8 * Redistribution and use in source and binary forms, with or without 8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions 9 * modification, are permitted provided that the following conditions
10 * are met: 10 * are met:
(...skipping 21 matching lines...) Expand all
32 32
33 #include "CSSValueKeywords.h" 33 #include "CSSValueKeywords.h"
34 #include "core/css/CSSAspectRatioValue.h" 34 #include "core/css/CSSAspectRatioValue.h"
35 #include "core/css/CSSHelper.h" 35 #include "core/css/CSSHelper.h"
36 #include "core/css/CSSPrimitiveValue.h" 36 #include "core/css/CSSPrimitiveValue.h"
37 #include "core/css/MediaFeatureNames.h" 37 #include "core/css/MediaFeatureNames.h"
38 #include "core/css/MediaList.h" 38 #include "core/css/MediaList.h"
39 #include "core/css/MediaQuery.h" 39 #include "core/css/MediaQuery.h"
40 #include "core/css/MediaQueryExp.h" 40 #include "core/css/MediaQueryExp.h"
41 #include "core/css/resolver/StyleResolver.h" 41 #include "core/css/resolver/StyleResolver.h"
42 #include "core/dom/Document.h"
42 #include "core/dom/NodeRenderStyle.h" 43 #include "core/dom/NodeRenderStyle.h"
43 #include "core/page/Frame.h" 44 #include "core/page/Frame.h"
44 #include "core/page/FrameView.h" 45 #include "core/page/FrameView.h"
45 #include "core/page/Page.h" 46 #include "core/page/Page.h"
46 #include "core/page/Settings.h" 47 #include "core/page/Settings.h"
47 #include "core/platform/PlatformScreen.h" 48 #include "core/platform/PlatformScreen.h"
48 #include "core/platform/graphics/FloatRect.h" 49 #include "core/platform/graphics/FloatRect.h"
49 #include "core/rendering/RenderLayerCompositor.h" 50 #include "core/rendering/RenderLayerCompositor.h"
50 #include "core/rendering/RenderView.h" 51 #include "core/rendering/RenderView.h"
51 #include "core/rendering/style/RenderStyle.h" 52 #include "core/rendering/style/RenderStyle.h"
52 #include "wtf/HashMap.h" 53 #include "wtf/HashMap.h"
53 54
54 namespace WebCore { 55 namespace WebCore {
55 56
56 using namespace MediaFeatureNames; 57 using namespace MediaFeatureNames;
57 58
58 enum MediaFeaturePrefix { MinPrefix, MaxPrefix, NoPrefix }; 59 enum MediaFeaturePrefix { MinPrefix, MaxPrefix, NoPrefix };
59 60
60 typedef bool (*EvalFunc)(CSSValue*, RenderStyle*, Frame*, MediaFeaturePrefix); 61 typedef bool (*EvalFunc)(CSSValue*, RenderStyle*, Frame*, MediaFeaturePrefix, Me diaValues*, bool);
61 typedef HashMap<AtomicStringImpl*, EvalFunc> FunctionMap; 62 typedef HashMap<StringImpl*, EvalFunc> FunctionMap;
62 static FunctionMap* gFunctionMap; 63 static FunctionMap* gFunctionMap;
63 64
64 MediaQueryEvaluator::MediaQueryEvaluator(bool mediaFeatureResult) 65 MediaQueryEvaluator::MediaQueryEvaluator(bool mediaFeatureResult)
65 : m_frame(0) 66 : m_frame(0)
66 , m_style(0) 67 , m_style(0)
67 , m_expResult(mediaFeatureResult) 68 , m_expResult(mediaFeatureResult)
69 , m_mediaValues(0)
68 { 70 {
69 } 71 }
70 72
71 MediaQueryEvaluator::MediaQueryEvaluator(const AtomicString& acceptedMediaType, bool mediaFeatureResult) 73 MediaQueryEvaluator::MediaQueryEvaluator(const AtomicString& acceptedMediaType, bool mediaFeatureResult)
72 : m_mediaType(acceptedMediaType) 74 : m_mediaType(acceptedMediaType)
73 , m_frame(0) 75 , m_frame(0)
74 , m_style(0) 76 , m_style(0)
75 , m_expResult(mediaFeatureResult) 77 , m_expResult(mediaFeatureResult)
78 , m_mediaValues(0)
76 { 79 {
77 } 80 }
78 81
79 MediaQueryEvaluator::MediaQueryEvaluator(const char* acceptedMediaType, bool med iaFeatureResult) 82 MediaQueryEvaluator::MediaQueryEvaluator(const char* acceptedMediaType, bool med iaFeatureResult)
80 : m_mediaType(acceptedMediaType) 83 : m_mediaType(acceptedMediaType)
81 , m_frame(0) 84 , m_frame(0)
82 , m_style(0) 85 , m_style(0)
83 , m_expResult(mediaFeatureResult) 86 , m_expResult(mediaFeatureResult)
87 , m_mediaValues(0)
84 { 88 {
85 } 89 }
86 90
87 MediaQueryEvaluator::MediaQueryEvaluator(const AtomicString& acceptedMediaType, Frame* frame, RenderStyle* style) 91 MediaQueryEvaluator::MediaQueryEvaluator(const AtomicString& acceptedMediaType, Frame* frame, RenderStyle* style)
88 : m_mediaType(acceptedMediaType) 92 : m_mediaType(acceptedMediaType)
89 , m_frame(frame) 93 , m_frame(frame)
90 , m_style(style) 94 , m_style(style)
91 , m_expResult(false) // doesn't matter when we have m_frame and m_style 95 , m_expResult(false) // doesn't matter when we have m_frame and m_style
96 , m_mediaValues(0)
92 { 97 {
93 } 98 }
94 99
100 MediaQueryEvaluator::MediaQueryEvaluator(const String& acceptedMediaType, const MediaValues* mediaValues, bool mediaFeatureResult)
101 : m_mediaType(acceptedMediaType)
102 , m_frame(0)
103 , m_style(0)
104 , m_expResult(mediaFeatureResult)
105 , m_mediaValues(MediaValues::copy(mediaValues))
106 {
107 }
108
95 MediaQueryEvaluator::~MediaQueryEvaluator() 109 MediaQueryEvaluator::~MediaQueryEvaluator()
96 { 110 {
97 } 111 }
98 112
99 bool MediaQueryEvaluator::mediaTypeMatch(const AtomicString& mediaTypeToMatch) c onst 113 bool MediaQueryEvaluator::mediaTypeMatch(const AtomicString& mediaTypeToMatch) c onst
100 { 114 {
101 return mediaTypeToMatch.isEmpty() 115 return mediaTypeToMatch.isEmpty()
102 || equalIgnoringCase(mediaTypeToMatch, "all") 116 || equalIgnoringCase(mediaTypeToMatch, "all")
103 || equalIgnoringCase(mediaTypeToMatch, m_mediaType); 117 || equalIgnoringCase(mediaTypeToMatch, m_mediaType);
104 } 118 }
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 bool exprResult = eval(exps->at(j).get()); 154 bool exprResult = eval(exps->at(j).get());
141 if (styleResolver && exps->at(j)->isViewportDependent()) 155 if (styleResolver && exps->at(j)->isViewportDependent())
142 styleResolver->addViewportDependentMediaQueryResult(exps->at (j).get(), exprResult); 156 styleResolver->addViewportDependentMediaQueryResult(exps->at (j).get(), exprResult);
143 if (!exprResult) 157 if (!exprResult)
144 break; 158 break;
145 } 159 }
146 160
147 // assume true if we are at the end of the list, 161 // assume true if we are at the end of the list,
148 // otherwise assume false 162 // otherwise assume false
149 result = applyRestrictor(query->restrictor(), exps->size() == j); 163 result = applyRestrictor(query->restrictor(), exps->size() == j);
150 } else 164 } else {
151 result = applyRestrictor(query->restrictor(), false); 165 result = applyRestrictor(query->restrictor(), false);
166 }
152 } 167 }
153 168
154 return result; 169 return result;
155 } 170 }
156 171
157 template<typename T> 172 template<typename T>
158 bool compareValue(T a, T b, MediaFeaturePrefix op) 173 bool compareValue(T a, T b, MediaFeaturePrefix op)
159 { 174 {
160 switch (op) { 175 switch (op) {
161 case MinPrefix: 176 case MinPrefix:
(...skipping 19 matching lines...) Expand all
181 static bool numberValue(CSSValue* value, float& result) 196 static bool numberValue(CSSValue* value, float& result)
182 { 197 {
183 if (value->isPrimitiveValue() 198 if (value->isPrimitiveValue()
184 && toCSSPrimitiveValue(value)->isNumber()) { 199 && toCSSPrimitiveValue(value)->isNumber()) {
185 result = toCSSPrimitiveValue(value)->getFloatValue(CSSPrimitiveValue::CS S_NUMBER); 200 result = toCSSPrimitiveValue(value)->getFloatValue(CSSPrimitiveValue::CS S_NUMBER);
186 return true; 201 return true;
187 } 202 }
188 return false; 203 return false;
189 } 204 }
190 205
191 static bool colorMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* frame, M ediaFeaturePrefix op) 206 static bool colorMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* frame, M ediaFeaturePrefix op, MediaValues* mediaValues, bool expectedValue)
192 { 207 {
193 int bitsPerComponent = screenDepthPerComponent(frame->page()->mainFrame()->v iew()); 208 if (!frame && !mediaValues)
209 return expectedValue;
210
211 int bitsPerComponent;
212 if (frame)
213 bitsPerComponent = screenDepthPerComponent(frame->page()->mainFrame()->v iew());
214 else
215 bitsPerComponent = mediaValues->getColorBitsPerComponent();
216
194 float number; 217 float number;
195 if (value) 218 if (value)
196 return numberValue(value, number) && compareValue(bitsPerComponent, stat ic_cast<int>(number), op); 219 return numberValue(value, number) && compareValue(bitsPerComponent, stat ic_cast<int>(number), op);
197 220
198 return bitsPerComponent != 0; 221 return bitsPerComponent != 0;
199 } 222 }
200 223
201 static bool colorIndexMediaFeatureEval(CSSValue* value, RenderStyle*, Frame*, Me diaFeaturePrefix op) 224 static bool colorIndexMediaFeatureEval(CSSValue* value, RenderStyle*, Frame*, Me diaFeaturePrefix op, MediaValues*, bool)
202 { 225 {
203 // FIXME: We currently assume that we do not support indexed displays, as it is unknown 226 // FIXME: We currently assume that we do not support indexed displays, as it is unknown
204 // how to retrieve the information if the display mode is indexed. This matc hes Firefox. 227 // how to retrieve the information if the display mode is indexed. This matc hes Firefox.
205 if (!value) 228 if (!value)
206 return false; 229 return false;
207 230
208 float number; 231 float number;
209 return numberValue(value, number) && compareValue(0, static_cast<int>(number ), op); 232 return numberValue(value, number) && compareValue(0, static_cast<int>(number ), op);
210 } 233 }
211 234
212 static bool monochromeMediaFeatureEval(CSSValue* value, RenderStyle* style, Fram e* frame, MediaFeaturePrefix op) 235 static bool monochromeMediaFeatureEval(CSSValue* value, RenderStyle* style, Fram e* frame, MediaFeaturePrefix op, MediaValues* mediaValues, bool expectedValue)
213 { 236 {
214 if (!screenIsMonochrome(frame->page()->mainFrame()->view())) { 237 if ((!frame || !style) && !mediaValues)
238 return expectedValue;
239
240 bool isMonochrome;
241 if (frame)
242 isMonochrome = screenIsMonochrome(frame->page()->mainFrame()->view());
243 else
244 isMonochrome = (mediaValues->getMonochromeBitsPerComponent() > 0);
245
246 if (!isMonochrome) {
215 if (value) { 247 if (value) {
216 float number; 248 float number;
217 return numberValue(value, number) && compareValue(0, static_cast<int >(number), op); 249 return numberValue(value, number) && compareValue(0, static_cast<int >(number), op);
218 } 250 }
219 return false; 251 return false;
220 } 252 }
221 253
222 return colorMediaFeatureEval(value, style, frame, op); 254 return colorMediaFeatureEval(value, style, frame, op, mediaValues, expectedV alue);
223 } 255 }
224 256
225 static IntSize viewportSize(FrameView* view) 257 static IntSize viewportSize(FrameView* view)
226 { 258 {
227 return view->layoutSize(ScrollableArea::IncludeScrollbars); 259 return view->layoutSize(ScrollableArea::IncludeScrollbars);
228 } 260 }
229 261
230 static bool orientationMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* fr ame, MediaFeaturePrefix) 262 static bool orientationMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* fr ame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
231 { 263 {
232 FrameView* view = frame->view(); 264 if (!frame && !mediaValues)
233 int width = viewportSize(view).width(); 265 return expectedValue;
234 int height = viewportSize(view).height(); 266
267 int width;
268 int height;
269 if (frame) {
270 FrameView* view = frame->view();
271 width = viewportSize(view).width();
272 height = viewportSize(view).height();
273 } else {
274 width = mediaValues->getViewportWidth();
275 height = mediaValues->getViewportHeight();
276 }
277
235 if (value && value->isPrimitiveValue()) { 278 if (value && value->isPrimitiveValue()) {
236 const CSSValueID id = toCSSPrimitiveValue(value)->getValueID(); 279 const CSSValueID id = toCSSPrimitiveValue(value)->getValueID();
237 if (width > height) // Square viewport is portrait. 280 if (width > height) // Square viewport is portrait.
238 return CSSValueLandscape == id; 281 return CSSValueLandscape == id;
239 return CSSValuePortrait == id; 282 return CSSValuePortrait == id;
240 } 283 }
241 284
242 // Expression (orientation) evaluates to true if width and height >= 0. 285 // Expression (orientation) evaluates to true if width and height >= 0.
243 return height >= 0 && width >= 0; 286 return height >= 0 && width >= 0;
244 } 287 }
245 288
246 static bool aspectRatioMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* fr ame, MediaFeaturePrefix op) 289 static bool aspectRatioMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* fr ame, MediaFeaturePrefix op, MediaValues* mediaValues, bool expectedValue)
247 { 290 {
291 if (!frame && !mediaValues)
292 return expectedValue;
293
248 if (value) { 294 if (value) {
249 FrameView* view = frame->view(); 295 int width;
250 return compareAspectRatioValue(value, viewportSize(view).width(), viewpo rtSize(view).height(), op); 296 int height;
297 if (frame) {
298 FrameView* view = frame->view();
299 width = viewportSize(view).width();
300 height = viewportSize(view).height();
301 } else {
302 width = mediaValues->getViewportWidth();
303 height = mediaValues->getViewportHeight();
304 }
305
306 return compareAspectRatioValue(value, width, height, op);
251 } 307 }
252 308
253 // ({,min-,max-}aspect-ratio) 309 // ({,min-,max-}aspect-ratio)
254 // assume if we have a device, its aspect ratio is non-zero 310 // assume if we have a device, its aspect ratio is non-zero
255 return true; 311 return true;
256 } 312 }
257 313
258 static bool deviceAspectRatioMediaFeatureEval(CSSValue* value, RenderStyle*, Fra me* frame, MediaFeaturePrefix op) 314 static bool deviceAspectRatioMediaFeatureEval(CSSValue* value, RenderStyle*, Fra me* frame, MediaFeaturePrefix op, MediaValues* mediaValues, bool expectedValue)
259 { 315 {
316 if (!frame && !mediaValues)
317 return expectedValue;
318
260 if (value) { 319 if (value) {
261 FloatRect sg = screenRect(frame->page()->mainFrame()->view()); 320 int width;
262 return compareAspectRatioValue(value, static_cast<int>(sg.width()), stat ic_cast<int>(sg.height()), op); 321 int height;
322 if (frame) {
323 FloatRect sg = screenRect(frame->page()->mainFrame()->view());
324 width = static_cast<int>(sg.width());
325 height = static_cast<int>(sg.height());
326 } else {
327 width = mediaValues->getDeviceWidth();
328 height = mediaValues->getDeviceHeight();
329 }
330
331 return compareAspectRatioValue(value, width, height, op);
263 } 332 }
264 333
265 // ({,min-,max-}device-aspect-ratio) 334 // ({,min-,max-}device-aspect-ratio)
266 // assume if we have a device, its aspect ratio is non-zero 335 // assume if we have a device, its aspect ratio is non-zero
267 return true; 336 return true;
268 } 337 }
269 338
270 static bool evalResolution(CSSValue* value, Frame* frame, MediaFeaturePrefix op) 339 static bool evalResolution(CSSValue* value, Frame* frame, MediaFeaturePrefix op, MediaValues* mediaValues, bool expectedValue)
271 { 340 {
341 if (!frame && !mediaValues)
342 return expectedValue;
343
272 // FIXME: Possible handle other media types than 'screen' and 'print'. 344 // FIXME: Possible handle other media types than 'screen' and 'print'.
273 float deviceScaleFactor = 0; 345 float deviceScaleFactor = 0;
274 346
275 // This checks the actual media type applied to the document, and we know 347 // This checks the actual media type applied to the document, and we know
276 // this method only got called if this media type matches the one defined 348 // this method only got called if this media type matches the one defined
277 // in the query. Thus, if if the document's media type is "print", the 349 // in the query. Thus, if if the document's media type is "print", the
278 // media type of the query will either be "print" or "all". 350 // media type of the query will either be "print" or "all".
279 String mediaType = frame->view()->mediaType(); 351 if (frame) {
280 if (equalIgnoringCase(mediaType, "screen")) 352 String mediaType = frame->view()->mediaType();
281 deviceScaleFactor = frame->page()->deviceScaleFactor(); 353 if (equalIgnoringCase(mediaType, "screen")) {
282 else if (equalIgnoringCase(mediaType, "print")) { 354 deviceScaleFactor = frame->page()->deviceScaleFactor();
283 // The resolution of images while printing should not depend on the DPI 355 } else if (equalIgnoringCase(mediaType, "print")) {
284 // of the screen. Until we support proper ways of querying this info 356 // The resolution of images while printing should not depend on the DPI
285 // we use 300px which is considered minimum for current printers. 357 // of the screen. Until we support proper ways of querying this info
286 deviceScaleFactor = 300 / cssPixelsPerInch; 358 // we use 300px which is considered minimum for current printers.
359 deviceScaleFactor = 300 / cssPixelsPerInch;
360 }
361 } else {
362 deviceScaleFactor = mediaValues->getPixelRatio();
287 } 363 }
288 364
289 if (!value) 365 if (!value)
290 return !!deviceScaleFactor; 366 return !!deviceScaleFactor;
291 367
292 if (!value->isPrimitiveValue()) 368 if (!value->isPrimitiveValue())
293 return false; 369 return false;
294 370
295 CSSPrimitiveValue* resolution = toCSSPrimitiveValue(value); 371 CSSPrimitiveValue* resolution = toCSSPrimitiveValue(value);
296 372
(...skipping 10 matching lines...) Expand all
307 // approximates the reference pixel". With that in mind, allowing 2 deci mal 383 // approximates the reference pixel". With that in mind, allowing 2 deci mal
308 // point precision seems appropriate. 384 // point precision seems appropriate.
309 return compareValue( 385 return compareValue(
310 floorf(0.5 + 100 * deviceScaleFactor) / 100, 386 floorf(0.5 + 100 * deviceScaleFactor) / 100,
311 floorf(0.5 + 100 * resolution->getFloatValue(CSSPrimitiveValue::CSS_ DPPX)) / 100, op); 387 floorf(0.5 + 100 * resolution->getFloatValue(CSSPrimitiveValue::CSS_ DPPX)) / 100, op);
312 } 388 }
313 389
314 return compareValue(deviceScaleFactor, resolution->getFloatValue(CSSPrimitiv eValue::CSS_DPPX), op); 390 return compareValue(deviceScaleFactor, resolution->getFloatValue(CSSPrimitiv eValue::CSS_DPPX), op);
315 } 391 }
316 392
317 static bool devicePixelRatioMediaFeatureEval(CSSValue *value, RenderStyle*, Fram e* frame, MediaFeaturePrefix op) 393 static bool devicePixelRatioMediaFeatureEval(CSSValue *value, RenderStyle*, Fram e* frame, MediaFeaturePrefix op, MediaValues* mediaValues, bool expectedValue)
318 { 394 {
319 return (!value || toCSSPrimitiveValue(value)->isNumber()) && evalResolution( value, frame, op); 395 return (!value || toCSSPrimitiveValue(value)->isNumber()) && evalResolution( value, frame, op, mediaValues, expectedValue);
320 } 396 }
321 397
322 static bool resolutionMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* fra me, MediaFeaturePrefix op) 398 static bool resolutionMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* fra me, MediaFeaturePrefix op, MediaValues* MediaValues, bool expectedValue)
323 { 399 {
324 return (!value || toCSSPrimitiveValue(value)->isResolution()) && evalResolut ion(value, frame, op); 400 return (!value || toCSSPrimitiveValue(value)->isResolution()) && evalResolut ion(value, frame, op, MediaValues, expectedValue);
325 } 401 }
326 402
327 static bool gridMediaFeatureEval(CSSValue* value, RenderStyle*, Frame*, MediaFea turePrefix op) 403 static bool gridMediaFeatureEval(CSSValue* value, RenderStyle*, Frame*, MediaFea turePrefix op, MediaValues*, bool)
328 { 404 {
329 // if output device is bitmap, grid: 0 == true 405 // if output device is bitmap, grid: 0 == true
330 // assume we have bitmap device 406 // assume we have bitmap device
331 float number; 407 float number;
332 if (value && numberValue(value, number)) 408 if (value && numberValue(value, number))
333 return compareValue(static_cast<int>(number), 0, op); 409 return compareValue(static_cast<int>(number), 0, op);
334 return false; 410 return false;
335 } 411 }
336 412
337 static bool computeLength(CSSValue* value, bool strict, RenderStyle* style, Rend erStyle* rootStyle, int& result) 413 static bool computeLength(CSSValue* value, bool strict, RenderStyle* style, Rend erStyle* rootStyle, int defaultFontSize, int& result)
338 { 414 {
339 if (!value->isPrimitiveValue()) 415 if (!value->isPrimitiveValue())
340 return false; 416 return false;
341 417
342 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value); 418 CSSPrimitiveValue* primitiveValue = toCSSPrimitiveValue(value);
343 419
344 if (primitiveValue->isNumber()) { 420 if (primitiveValue->isNumber()) {
345 result = primitiveValue->getIntValue(); 421 result = primitiveValue->getIntValue();
346 return !strict || !result; 422 return !strict || !result;
347 } 423 }
348 424
349 if (primitiveValue->isLength()) { 425 if (primitiveValue->isLength()) {
350 result = primitiveValue->computeLength<int>(style, rootStyle, 1.0 /* mul tiplier */, true /* computingFontSize */); 426 if (style) {
427 result = primitiveValue->computeLength<int>(style, rootStyle, 1.0 /* multiplier */, true /* computingFontSize */);
428 } else {
429 unsigned short type = primitiveValue->primitiveType();
430 int factor = 0;
431 if (type == CSSPrimitiveValue::CSS_EMS || type == CSSPrimitiveValue: :CSS_REMS) {
432 if (defaultFontSize>0)
433 factor = defaultFontSize;
434 else
435 return false;
436 } else if (type == CSSPrimitiveValue::CSS_PX) {
437 factor = 1;
438 } else {
439 return false;
440 }
441 result = roundForImpreciseConversion<int>(primitiveValue->getDoubleV alue()*factor);
442 }
351 return true; 443 return true;
352 } 444 }
353 445
354 return false; 446 return false;
355 } 447 }
356 448
357 static bool deviceHeightMediaFeatureEval(CSSValue* value, RenderStyle* style, Fr ame* frame, MediaFeaturePrefix op) 449 static bool deviceHeightMediaFeatureEval(CSSValue* value, RenderStyle* style, Fr ame* frame, MediaFeaturePrefix op, MediaValues* mediaValues, bool expectedValue)
358 { 450 {
451 if ((!frame || !style) && !mediaValues)
452 return expectedValue;
453 int fontSize = 0;
454 if (mediaValues)
455 fontSize = mediaValues->getDefaultFontSize();
456
359 if (value) { 457 if (value) {
360 FloatRect sg = screenRect(frame->page()->mainFrame()->view()); 458 RenderStyle* rootStyle;
361 RenderStyle* rootStyle = frame->document()->documentElement()->renderSty le(); 459 long height;
362 int length; 460 int length;
363 long height = sg.height(); 461 bool inStrictMode = true;
462 if (frame) {
463 FloatRect sg = screenRect(frame->page()->mainFrame()->view());
464 rootStyle = frame->document()->documentElement()->renderStyle();
465 height = sg.height();
466 inStrictMode = !frame->document()->inQuirksMode();
467 } else {
468 height = mediaValues->getDeviceHeight();
469 }
364 InspectorInstrumentation::applyScreenHeightOverride(frame, &height); 470 InspectorInstrumentation::applyScreenHeightOverride(frame, &height);
365 return computeLength(value, !frame->document()->inQuirksMode(), style, r ootStyle, length) && compareValue(static_cast<int>(height), length, op); 471 return computeLength(value, inStrictMode, style, rootStyle, fontSize, le ngth) && compareValue(static_cast<int>(height), length, op);
366 } 472 }
367 // ({,min-,max-}device-height) 473 // ({,min-,max-}device-height)
368 // assume if we have a device, assume non-zero 474 // assume if we have a device, assume non-zero
369 return true; 475 return true;
370 } 476 }
371 477
372 static bool deviceWidthMediaFeatureEval(CSSValue* value, RenderStyle* style, Fra me* frame, MediaFeaturePrefix op) 478 static bool deviceWidthMediaFeatureEval(CSSValue* value, RenderStyle* style, Fra me* frame, MediaFeaturePrefix op, MediaValues* mediaValues, bool expectedValue)
373 { 479 {
480 if ((!frame || !style) && !mediaValues)
481 return expectedValue;
482 int fontSize = 0;
483 if (mediaValues)
484 fontSize = mediaValues->getDefaultFontSize();
485
374 if (value) { 486 if (value) {
375 FloatRect sg = screenRect(frame->page()->mainFrame()->view()); 487 RenderStyle* rootStyle;
376 RenderStyle* rootStyle = frame->document()->documentElement()->renderSty le(); 488 long width;
377 int length; 489 int length;
378 long width = sg.width(); 490 bool inStrictMode = true;
491 if (frame) {
492 FloatRect sg = screenRect(frame->page()->mainFrame()->view());
493 rootStyle = frame->document()->documentElement()->renderStyle();
494 width = sg.width();
495 inStrictMode = !frame->document()->inQuirksMode();
496 } else {
497 width = mediaValues->getDeviceWidth();
498 }
379 InspectorInstrumentation::applyScreenWidthOverride(frame, &width); 499 InspectorInstrumentation::applyScreenWidthOverride(frame, &width);
380 return computeLength(value, !frame->document()->inQuirksMode(), style, r ootStyle, length) && compareValue(static_cast<int>(width), length, op); 500 return computeLength(value, inStrictMode, style, rootStyle, fontSize, le ngth) && compareValue(static_cast<int>(width), length, op);
381 } 501 }
382 // ({,min-,max-}device-width) 502 // ({,min-,max-}device-width)
383 // assume if we have a device, assume non-zero 503 // assume if we have a device, assume non-zero
384 return true; 504 return true;
385 } 505 }
386 506
387 static bool heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* f rame, MediaFeaturePrefix op) 507 static bool heightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* f rame, MediaFeaturePrefix op, MediaValues* mediaValues, bool expectedValue)
388 { 508 {
509 if ((!frame || !style) && !mediaValues)
510 return expectedValue;
511 int fontSize = 0;
512 if (mediaValues)
513 fontSize = mediaValues->getDefaultFontSize();
514
389 FrameView* view = frame->view(); 515 FrameView* view = frame->view();
390 516
391 int height = viewportSize(view).height(); 517 int height = viewportSize(view).height();
392 if (value) { 518 if (value) {
393 if (RenderView* renderView = frame->document()->renderView()) 519 RenderView* renderView = 0;
394 height = adjustForAbsoluteZoom(height, renderView); 520 RenderStyle* rootStyle = 0;
395 RenderStyle* rootStyle = frame->document()->documentElement()->renderSty le(); 521 bool inStrictMode = true;
522 if (frame) {
523 if (renderView = frame->document()->renderView())
524 height = adjustForAbsoluteZoom(height, renderView);
525 rootStyle = frame->document()->documentElement()->renderStyle();
526 inStrictMode = !frame->document()->inQuirksMode();
527 }
396 int length; 528 int length;
397 return computeLength(value, !frame->document()->inQuirksMode(), style, r ootStyle, length) && compareValue(height, length, op); 529 return computeLength(value, inStrictMode, style, rootStyle, fontSize, le ngth) && compareValue(height, length, op);
398 } 530 }
399 531
400 return height; 532 return height;
401 } 533 }
402 534
403 static bool widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* fr ame, MediaFeaturePrefix op) 535 static bool widthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* fr ame, MediaFeaturePrefix op, MediaValues* mediaValues, bool expectedValue)
404 { 536 {
405 FrameView* view = frame->view(); 537 if ((!frame || !style) && !mediaValues)
538 return expectedValue;
539 int fontSize = 0;
540 int width;
541 if (mediaValues)
542 fontSize = mediaValues->getDefaultFontSize();
406 543
407 int width = viewportSize(view).width(); 544 if (frame) {
545 FrameView* view = frame->view();
546 width = viewportSize(view).width();
547 } else {
548 width = mediaValues->getViewportWidth();
549 }
550
408 if (value) { 551 if (value) {
409 if (RenderView* renderView = frame->document()->renderView()) 552 RenderView* renderView = 0;
410 width = adjustForAbsoluteZoom(width, renderView); 553 RenderStyle* rootStyle = 0;
411 RenderStyle* rootStyle = frame->document()->documentElement()->renderSty le(); 554 bool inStrictMode = true;
555 if (frame) {
556 if (renderView = frame->document()->renderView())
557 width = adjustForAbsoluteZoom(width, renderView);
558 rootStyle = frame->document()->documentElement()->renderStyle();
559 inStrictMode = !frame->document()->inQuirksMode();
560 }
412 int length; 561 int length;
413 return computeLength(value, !frame->document()->inQuirksMode(), style, r ootStyle, length) && compareValue(width, length, op); 562 return computeLength(value, inStrictMode, style, rootStyle, fontSize, le ngth) && compareValue(width, length, op);
414 } 563 }
415 564
416 return width; 565 return width;
417 } 566 }
418 567
419 // rest of the functions are trampolines which set the prefix according to the m edia feature expression used 568 // rest of the functions are trampolines which set the prefix according to the m edia feature expression used
420 569
421 static bool minColorMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix) 570 static bool minColorMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
422 { 571 {
423 return colorMediaFeatureEval(value, style, frame, MinPrefix); 572 return colorMediaFeatureEval(value, style, frame, MinPrefix, mediaValues, ex pectedValue);
424 } 573 }
425 574
426 static bool maxColorMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix) 575 static bool maxColorMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
427 { 576 {
428 return colorMediaFeatureEval(value, style, frame, MaxPrefix); 577 return colorMediaFeatureEval(value, style, frame, MaxPrefix, mediaValues, ex pectedValue);
429 } 578 }
430 579
431 static bool minColorIndexMediaFeatureEval(CSSValue* value, RenderStyle* style, F rame* frame, MediaFeaturePrefix) 580 static bool minColorIndexMediaFeatureEval(CSSValue* value, RenderStyle* style, F rame* frame, MediaFeaturePrefix, MediaValues*, bool expectedValue)
432 { 581 {
433 return colorIndexMediaFeatureEval(value, style, frame, MinPrefix); 582 return colorIndexMediaFeatureEval(value, style, frame, MinPrefix, 0, expecte dValue);
434 } 583 }
435 584
436 static bool maxColorIndexMediaFeatureEval(CSSValue* value, RenderStyle* style, F rame* frame, MediaFeaturePrefix) 585 static bool maxColorIndexMediaFeatureEval(CSSValue* value, RenderStyle* style, F rame* frame, MediaFeaturePrefix, MediaValues*, bool expectedValue)
437 { 586 {
438 return colorIndexMediaFeatureEval(value, style, frame, MaxPrefix); 587 return colorIndexMediaFeatureEval(value, style, frame, MaxPrefix, 0, expecte dValue);
439 } 588 }
440 589
441 static bool minMonochromeMediaFeatureEval(CSSValue* value, RenderStyle* style, F rame* frame, MediaFeaturePrefix) 590 static bool minMonochromeMediaFeatureEval(CSSValue* value, RenderStyle* style, F rame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
442 { 591 {
443 return monochromeMediaFeatureEval(value, style, frame, MinPrefix); 592 return monochromeMediaFeatureEval(value, style, frame, MinPrefix, mediaValue s, expectedValue);
444 } 593 }
445 594
446 static bool maxMonochromeMediaFeatureEval(CSSValue* value, RenderStyle* style, F rame* frame, MediaFeaturePrefix) 595 static bool maxMonochromeMediaFeatureEval(CSSValue* value, RenderStyle* style, F rame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
447 { 596 {
448 return monochromeMediaFeatureEval(value, style, frame, MaxPrefix); 597 return monochromeMediaFeatureEval(value, style, frame, MaxPrefix, mediaValue s, expectedValue);
449 } 598 }
450 599
451 static bool minAspectRatioMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix) 600 static bool minAspectRatioMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
452 { 601 {
453 return aspectRatioMediaFeatureEval(value, style, frame, MinPrefix); 602 return aspectRatioMediaFeatureEval(value, style, frame, MinPrefix, mediaValu es, expectedValue);
454 } 603 }
455 604
456 static bool maxAspectRatioMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix) 605 static bool maxAspectRatioMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
457 { 606 {
458 return aspectRatioMediaFeatureEval(value, style, frame, MaxPrefix); 607 return aspectRatioMediaFeatureEval(value, style, frame, MaxPrefix, mediaValu es, expectedValue);
459 } 608 }
460 609
461 static bool minDeviceAspectRatioMediaFeatureEval(CSSValue* value, RenderStyle* s tyle, Frame* frame, MediaFeaturePrefix) 610 static bool minDeviceAspectRatioMediaFeatureEval(CSSValue* value, RenderStyle* s tyle, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedV alue)
462 { 611 {
463 return deviceAspectRatioMediaFeatureEval(value, style, frame, MinPrefix); 612 return deviceAspectRatioMediaFeatureEval(value, style, frame, MinPrefix, med iaValues, expectedValue);
464 } 613 }
465 614
466 static bool maxDeviceAspectRatioMediaFeatureEval(CSSValue* value, RenderStyle* s tyle, Frame* frame, MediaFeaturePrefix) 615 static bool maxDeviceAspectRatioMediaFeatureEval(CSSValue* value, RenderStyle* s tyle, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedV alue)
467 { 616 {
468 return deviceAspectRatioMediaFeatureEval(value, style, frame, MaxPrefix); 617 return deviceAspectRatioMediaFeatureEval(value, style, frame, MaxPrefix, med iaValues, expectedValue);
469 } 618 }
470 619
471 static bool minDevicePixelRatioMediaFeatureEval(CSSValue* value, RenderStyle* st yle, Frame* frame, MediaFeaturePrefix) 620 static bool minDevicePixelRatioMediaFeatureEval(CSSValue* value, RenderStyle* st yle, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedVa lue)
472 { 621 {
473 return devicePixelRatioMediaFeatureEval(value, style, frame, MinPrefix); 622 return devicePixelRatioMediaFeatureEval(value, style, frame, MinPrefix, medi aValues, expectedValue);
474 } 623 }
475 624
476 static bool maxDevicePixelRatioMediaFeatureEval(CSSValue* value, RenderStyle* st yle, Frame* frame, MediaFeaturePrefix) 625 static bool maxDevicePixelRatioMediaFeatureEval(CSSValue* value, RenderStyle* st yle, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedVa lue)
477 { 626 {
478 return devicePixelRatioMediaFeatureEval(value, style, frame, MaxPrefix); 627 return devicePixelRatioMediaFeatureEval(value, style, frame, MaxPrefix, medi aValues, expectedValue);
479 } 628 }
480 629
481 static bool minHeightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame * frame, MediaFeaturePrefix) 630 static bool minHeightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame * frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
482 { 631 {
483 return heightMediaFeatureEval(value, style, frame, MinPrefix); 632 return heightMediaFeatureEval(value, style, frame, MinPrefix, mediaValues, e xpectedValue);
484 } 633 }
485 634
486 static bool maxHeightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame * frame, MediaFeaturePrefix) 635 static bool maxHeightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame * frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
487 { 636 {
488 return heightMediaFeatureEval(value, style, frame, MaxPrefix); 637 return heightMediaFeatureEval(value, style, frame, MaxPrefix, mediaValues, e xpectedValue);
489 } 638 }
490 639
491 static bool minWidthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix) 640 static bool minWidthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
492 { 641 {
493 return widthMediaFeatureEval(value, style, frame, MinPrefix); 642 return widthMediaFeatureEval(value, style, frame, MinPrefix, mediaValues, ex pectedValue);
494 } 643 }
495 644
496 static bool maxWidthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix) 645 static bool maxWidthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
497 { 646 {
498 return widthMediaFeatureEval(value, style, frame, MaxPrefix); 647 return widthMediaFeatureEval(value, style, frame, MaxPrefix, mediaValues, ex pectedValue);
499 } 648 }
500 649
501 static bool minDeviceHeightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix) 650 static bool minDeviceHeightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
502 { 651 {
503 return deviceHeightMediaFeatureEval(value, style, frame, MinPrefix); 652 return deviceHeightMediaFeatureEval(value, style, frame, MinPrefix, mediaVal ues, expectedValue);
504 } 653 }
505 654
506 static bool maxDeviceHeightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix) 655 static bool maxDeviceHeightMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
507 { 656 {
508 return deviceHeightMediaFeatureEval(value, style, frame, MaxPrefix); 657 return deviceHeightMediaFeatureEval(value, style, frame, MaxPrefix, mediaVal ues, expectedValue);
509 } 658 }
510 659
511 static bool minDeviceWidthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix) 660 static bool minDeviceWidthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
512 { 661 {
513 return deviceWidthMediaFeatureEval(value, style, frame, MinPrefix); 662 return deviceWidthMediaFeatureEval(value, style, frame, MinPrefix, mediaValu es, expectedValue);
514 } 663 }
515 664
516 static bool maxDeviceWidthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix) 665 static bool maxDeviceWidthMediaFeatureEval(CSSValue* value, RenderStyle* style, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
517 { 666 {
518 return deviceWidthMediaFeatureEval(value, style, frame, MaxPrefix); 667 return deviceWidthMediaFeatureEval(value, style, frame, MaxPrefix, mediaValu es, expectedValue);
519 } 668 }
520 669
521 static bool minResolutionMediaFeatureEval(CSSValue* value, RenderStyle* style, F rame* frame, MediaFeaturePrefix) 670 static bool minResolutionMediaFeatureEval(CSSValue* value, RenderStyle* style, F rame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
522 { 671 {
523 return resolutionMediaFeatureEval(value, style, frame, MinPrefix); 672 return resolutionMediaFeatureEval(value, style, frame, MinPrefix, mediaValue s, expectedValue);
524 } 673 }
525 674
526 static bool maxResolutionMediaFeatureEval(CSSValue* value, RenderStyle* style, F rame* frame, MediaFeaturePrefix) 675 static bool maxResolutionMediaFeatureEval(CSSValue* value, RenderStyle* style, F rame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
527 { 676 {
528 return resolutionMediaFeatureEval(value, style, frame, MaxPrefix); 677 return resolutionMediaFeatureEval(value, style, frame, MaxPrefix, mediaValue s, expectedValue);
529 } 678 }
530 679
531 static bool animationMediaFeatureEval(CSSValue* value, RenderStyle*, Frame*, Med iaFeaturePrefix op) 680 static bool animationMediaFeatureEval(CSSValue* value, RenderStyle*, Frame*, Med iaFeaturePrefix op, MediaValues*, bool)
532 { 681 {
533 if (value) { 682 if (value) {
534 float number; 683 float number;
535 return numberValue(value, number) && compareValue(1, static_cast<int>(nu mber), op); 684 return numberValue(value, number) && compareValue(1, static_cast<int>(nu mber), op);
536 } 685 }
537 return true; 686 return true;
538 } 687 }
539 688
540 static bool deprecatedTransitionMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* frame, MediaFeaturePrefix op) 689 static bool deprecatedTransitionMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* frame, MediaFeaturePrefix op, MediaValues*, bool)
541 { 690 {
542 UseCounter::countDeprecation(frame->document(), UseCounter::PrefixedTransiti onMediaFeature); 691 UseCounter::countDeprecation(frame->document(), UseCounter::PrefixedTransiti onMediaFeature);
543 692
544 if (value) { 693 if (value) {
545 float number; 694 float number;
546 return numberValue(value, number) && compareValue(1, static_cast<int>(nu mber), op); 695 return numberValue(value, number) && compareValue(1, static_cast<int>(nu mber), op);
547 } 696 }
548 return true; 697 return true;
549 } 698 }
550 699
551 static bool transform2dMediaFeatureEval(CSSValue* value, RenderStyle*, Frame*, M ediaFeaturePrefix op) 700 static bool transform2dMediaFeatureEval(CSSValue* value, RenderStyle*, Frame*, M ediaFeaturePrefix op, MediaValues*, bool)
552 { 701 {
553 if (value) { 702 if (value) {
554 float number; 703 float number;
555 return numberValue(value, number) && compareValue(1, static_cast<int>(nu mber), op); 704 return numberValue(value, number) && compareValue(1, static_cast<int>(nu mber), op);
556 } 705 }
557 return true; 706 return true;
558 } 707 }
559 708
560 static bool transform3dMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* fr ame, MediaFeaturePrefix op) 709 static bool transform3dMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* fr ame, MediaFeaturePrefix op, MediaValues* mediaValues, bool expectedValue)
561 { 710 {
711 if (!frame && !mediaValues)
712 return expectedValue;
713
562 bool returnValueIfNoParameter; 714 bool returnValueIfNoParameter;
563 int have3dRendering; 715 int have3dRendering;
564 716
565 bool threeDEnabled = false; 717 bool threeDEnabled = false;
566 if (RenderView* view = frame->contentRenderer()) 718 if (frame) {
567 threeDEnabled = view->compositor()->canRender3DTransforms(); 719 if (RenderView* view = frame->contentRenderer())
720 threeDEnabled = view->compositor()->canRender3DTransforms();
721 } else {
722 threeDEnabled = mediaValues->getThreeDEnabled();
723 }
568 724
569 returnValueIfNoParameter = threeDEnabled; 725 returnValueIfNoParameter = threeDEnabled;
570 have3dRendering = threeDEnabled ? 1 : 0; 726 have3dRendering = threeDEnabled ? 1 : 0;
571 727
572 if (value) { 728 if (value) {
573 float number; 729 float number;
574 return numberValue(value, number) && compareValue(have3dRendering, stati c_cast<int>(number), op); 730 return numberValue(value, number) && compareValue(have3dRendering, stati c_cast<int>(number), op);
575 } 731 }
576 return returnValueIfNoParameter; 732 return returnValueIfNoParameter;
577 } 733 }
578 734
579 static bool viewModeMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* frame , MediaFeaturePrefix op) 735 static bool viewModeMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* frame , MediaFeaturePrefix op, MediaValues*, bool)
580 { 736 {
581 UNUSED_PARAM(op); 737 UNUSED_PARAM(op);
582 if (!value) 738 if (!value)
583 return true; 739 return true;
584 740
585 return toCSSPrimitiveValue(value)->getValueID() == CSSValueWindowed; 741 return toCSSPrimitiveValue(value)->getValueID() == CSSValueWindowed;
586 } 742 }
587 743
588 enum PointerDeviceType { TouchPointer, MousePointer, NoPointer, UnknownPointer } ; 744 enum PointerDeviceType { TouchPointer, MousePointer, NoPointer, UnknownPointer } ;
589 745
590 static PointerDeviceType leastCapablePrimaryPointerDeviceType(Frame* frame) 746 static PointerDeviceType leastCapablePrimaryPointerDeviceType(Frame* frame)
591 { 747 {
592 if (frame->settings()->deviceSupportsTouch()) 748 if (frame->settings()->deviceSupportsTouch())
593 return TouchPointer; 749 return TouchPointer;
594 750
595 // FIXME: We should also try to determine if we know we have a mouse. 751 // FIXME: We should also try to determine if we know we have a mouse.
596 // When we do this, we'll also need to differentiate between known not to 752 // When we do this, we'll also need to differentiate between known not to
597 // have mouse or touch screen (NoPointer) and unknown (UnknownPointer). 753 // have mouse or touch screen (NoPointer) and unknown (UnknownPointer).
598 // We could also take into account other preferences like accessibility 754 // We could also take into account other preferences like accessibility
599 // settings to decide which of the available pointers should be considered 755 // settings to decide which of the available pointers should be considered
600 // "primary". 756 // "primary".
601 757
602 return UnknownPointer; 758 return UnknownPointer;
603 } 759 }
604 760
605 static bool hoverMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* frame, M ediaFeaturePrefix) 761 static bool hoverMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* frame, M ediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
606 { 762 {
607 PointerDeviceType pointer = leastCapablePrimaryPointerDeviceType(frame); 763 if (!frame && !mediaValues)
764 return expectedValue;
765
766 PointerDeviceType pointer;
767 if (frame)
768 pointer = leastCapablePrimaryPointerDeviceType(frame);
769 else
770 pointer = static_cast<PointerDeviceType>(mediaValues->getPointer());
608 771
609 // If we're on a port that hasn't explicitly opted into providing pointer de vice information 772 // If we're on a port that hasn't explicitly opted into providing pointer de vice information
610 // (or otherwise can't be confident in the pointer hardware available), then behave exactly 773 // (or otherwise can't be confident in the pointer hardware available), then behave exactly
611 // as if this feature feature isn't supported. 774 // as if this feature feature isn't supported.
612 if (pointer == UnknownPointer) 775 if (pointer == UnknownPointer)
613 return false; 776 return false;
614 777
615 float number = 1; 778 float number = 1;
616 if (value) { 779 if (value) {
617 if (!numberValue(value, number)) 780 if (!numberValue(value, number))
618 return false; 781 return false;
619 } 782 }
620 783
621 return (pointer == NoPointer && !number) 784 return (pointer == NoPointer && !number)
622 || (pointer == TouchPointer && !number) 785 || (pointer == TouchPointer && !number)
623 || (pointer == MousePointer && number == 1); 786 || (pointer == MousePointer && number == 1);
624 } 787 }
625 788
626 static bool pointerMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* frame, MediaFeaturePrefix) 789 static bool pointerMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* frame, MediaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
627 { 790 {
628 PointerDeviceType pointer = leastCapablePrimaryPointerDeviceType(frame); 791 if (!frame && !mediaValues)
792 return expectedValue;
793
794 PointerDeviceType pointer;
795 if (frame)
796 pointer = leastCapablePrimaryPointerDeviceType(frame);
797 else
798 pointer = static_cast<PointerDeviceType>(mediaValues->getPointer());
629 799
630 // If we're on a port that hasn't explicitly opted into providing pointer de vice information 800 // If we're on a port that hasn't explicitly opted into providing pointer de vice information
631 // (or otherwise can't be confident in the pointer hardware available), then behave exactly 801 // (or otherwise can't be confident in the pointer hardware available), then behave exactly
632 // as if this feature feature isn't supported. 802 // as if this feature feature isn't supported.
633 if (pointer == UnknownPointer) 803 if (pointer == UnknownPointer)
634 return false; 804 return false;
635 805
636 if (!value) 806 if (!value)
637 return pointer != NoPointer; 807 return pointer != NoPointer;
638 808
639 if (!value->isPrimitiveValue()) 809 if (!value->isPrimitiveValue())
640 return false; 810 return false;
641 811
642 const CSSValueID id = toCSSPrimitiveValue(value)->getValueID(); 812 const CSSValueID id = toCSSPrimitiveValue(value)->getValueID();
643 return (pointer == NoPointer && id == CSSValueNone) 813 return (pointer == NoPointer && id == CSSValueNone)
644 || (pointer == TouchPointer && id == CSSValueCoarse) 814 || (pointer == TouchPointer && id == CSSValueCoarse)
645 || (pointer == MousePointer && id == CSSValueFine); 815 || (pointer == MousePointer && id == CSSValueFine);
646 } 816 }
647 817
648 static bool scanMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* frame, Me diaFeaturePrefix) 818 static bool scanMediaFeatureEval(CSSValue* value, RenderStyle*, Frame* frame, Me diaFeaturePrefix, MediaValues* mediaValues, bool expectedValue)
649 { 819 {
820 if (!frame && !mediaValues)
821 return expectedValue;
822
650 // Scan only applies to tv media. 823 // Scan only applies to tv media.
824 String mediaType;
825 if (frame)
826 mediaType = frame->view()->mediaType();
827 else
828 mediaType = mediaValues->getMediaType();
829
651 if (!equalIgnoringCase(frame->view()->mediaType(), "tv")) 830 if (!equalIgnoringCase(frame->view()->mediaType(), "tv"))
652 return false; 831 return false;
653 832
654 if (!value) 833 if (!value)
655 return true; 834 return true;
656 835
657 if (!value->isPrimitiveValue()) 836 if (!value->isPrimitiveValue())
658 return false; 837 return false;
659 838
660 // If a platform interface supplies progressive/interlace info for TVs in th e 839 // If a platform interface supplies progressive/interlace info for TVs in th e
661 // future, it needs to be handled here. For now, assume a modern TV with 840 // future, it needs to be handled here. For now, assume a modern TV with
662 // progressive display. 841 // progressive display.
663 return toCSSPrimitiveValue(value)->getValueID() == CSSValueProgressive; 842 return toCSSPrimitiveValue(value)->getValueID() == CSSValueProgressive;
664 } 843 }
665 844
666 static void createFunctionMap() 845 static void createFunctionMap()
667 { 846 {
668 // Create the table. 847 // Create the table.
669 gFunctionMap = new FunctionMap; 848 gFunctionMap = new FunctionMap;
670 #define ADD_TO_FUNCTIONMAP(name, str) \ 849 #define ADD_TO_FUNCTIONMAP(name, str) \
671 gFunctionMap->set(name##MediaFeature.impl(), name##MediaFeatureEval); 850 gFunctionMap->set(name##MediaFeature.impl(), name##MediaFeatureEval);
672 CSS_MEDIAQUERY_NAMES_FOR_EACH_MEDIAFEATURE(ADD_TO_FUNCTIONMAP); 851 CSS_MEDIAQUERY_NAMES_FOR_EACH_MEDIAFEATURE(ADD_TO_FUNCTIONMAP);
673 #undef ADD_TO_FUNCTIONMAP 852 #undef ADD_TO_FUNCTIONMAP
674 } 853 }
675 854
676 bool MediaQueryEvaluator::eval(const MediaQueryExp* expr) const 855 bool MediaQueryEvaluator::eval(const MediaQueryExp* expr) const
677 { 856 {
678 if (!m_frame || !m_style) 857 if (!m_mediaValues && (!m_frame || !m_style))
679 return m_expResult; 858 return m_expResult;
680 859
681 if (!gFunctionMap) 860 if (!gFunctionMap)
682 createFunctionMap(); 861 createFunctionMap();
683 862
684 // call the media feature evaluation function. Assume no prefix 863 // call the media feature evaluation function. Assume no prefix
685 // and let trampoline functions override the prefix if prefix is 864 // and let trampoline functions override the prefix if prefix is
686 // used 865 // used
687 EvalFunc func = gFunctionMap->get(expr->mediaFeature().impl()); 866 EvalFunc func = gFunctionMap->get(expr->mediaFeature().impl());
688 if (func) 867 if (func)
689 return func(expr->value(), m_style.get(), m_frame, NoPrefix); 868 return func(expr->value(), m_style.get(), m_frame, NoPrefix, m_mediaValu es.get(), m_expResult);
690 869
691 return false; 870 return false;
692 } 871 }
693 872
873 PassRefPtr<MediaValues> MediaValues::create(Document* document)
874 {
875 ASSERT(document->frame());
876 ASSERT(document->renderer());
877 ASSERT(document->renderer()->style());
878 Frame* frame = document->frame();
879 RenderStyle* style = document->renderer()->style();
880
881 // get the values from Frame and Style
882 FrameView* view = frame->view();
883 RenderView* renderView = frame->document()->renderView();
884 int viewportWidth = viewportSize(view).width();
885 int viewportHeight = viewportSize(view).height();
886 FloatRect sg = screenRect(frame->page()->mainFrame()->view());
887 int deviceWidth = static_cast<int>(sg.width());
888 int deviceHeight = static_cast<int>(sg.height());
889 float pixelRatio = frame->page()->deviceScaleFactor();
890 int bitsPerComponent = screenDepthPerComponent(frame->page()->mainFrame()->v iew());
891 int colorBitsPerComponent = 0;
892 int monochromeBitsPerComponent = 0;
893 int defaultFontSize = style->fontDescription().specifiedSize();
894 bool threeDEnabled = false;
895 String mediaType = frame->view()->mediaType();
896 if (renderView) {
897 viewportWidth = adjustForAbsoluteZoom(viewportWidth, renderView);
898 viewportHeight = adjustForAbsoluteZoom(viewportHeight, renderView);
899 }
900 if (RenderView* view = frame->contentRenderer())
901 threeDEnabled = view->compositor()->canRender3DTransforms();
902 if (screenIsMonochrome(frame->page()->mainFrame()->view()))
903 monochromeBitsPerComponent = bitsPerComponent;
904 else
905 colorBitsPerComponent = bitsPerComponent;
906 PointerDeviceType pointer = leastCapablePrimaryPointerDeviceType(frame);
907
908 return adoptRef(new MediaValues(viewportWidth,
909 viewportHeight,
910 deviceWidth,
911 deviceHeight,
912 pixelRatio,
913 colorBitsPerComponent,
914 monochromeBitsPerComponent,
915 pointer,
916 defaultFontSize,
917 threeDEnabled,
918 mediaType));
919 }
920 PassRefPtr<MediaValues> MediaValues::copy(const MediaValues* mediaValues)
921 {
922 return adoptRef(new MediaValues(mediaValues->m_viewportWidth,
923 mediaValues->m_viewportHeight,
924 mediaValues->m_deviceWidth,
925 mediaValues->m_deviceHeight,
926 mediaValues->m_pixelRatio,
927 mediaValues->m_colorBitsPerComponent,
928 mediaValues->m_monochromeBitsPerComponent,
929 mediaValues->m_pointer,
930 mediaValues->m_defaultFontSize,
931 mediaValues->m_threeDEnabled,
932 mediaValues->m_mediaType));
933 }
934
694 } // namespace 935 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698