OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |