| 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 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 64 | 64 |
| 65 typedef bool (*EvalFunc)(const MediaQueryExpValue&, MediaFeaturePrefix, const Me
diaValues&); | 65 typedef bool (*EvalFunc)(const MediaQueryExpValue&, MediaFeaturePrefix, const Me
diaValues&); |
| 66 typedef HashMap<StringImpl*, EvalFunc> FunctionMap; | 66 typedef HashMap<StringImpl*, EvalFunc> FunctionMap; |
| 67 static FunctionMap* gFunctionMap; | 67 static FunctionMap* gFunctionMap; |
| 68 | 68 |
| 69 MediaQueryEvaluator::MediaQueryEvaluator(bool mediaFeatureResult) | 69 MediaQueryEvaluator::MediaQueryEvaluator(bool mediaFeatureResult) |
| 70 : m_expectedResult(mediaFeatureResult) | 70 : m_expectedResult(mediaFeatureResult) |
| 71 { | 71 { |
| 72 } | 72 } |
| 73 | 73 |
| 74 MediaQueryEvaluator::MediaQueryEvaluator(const String& acceptedMediaType, bool m
ediaFeatureResult) | |
| 75 : m_mediaType(acceptedMediaType) | |
| 76 , m_expectedResult(mediaFeatureResult) | |
| 77 { | |
| 78 } | |
| 79 | |
| 80 MediaQueryEvaluator::MediaQueryEvaluator(const char* acceptedMediaType, bool med
iaFeatureResult) | 74 MediaQueryEvaluator::MediaQueryEvaluator(const char* acceptedMediaType, bool med
iaFeatureResult) |
| 81 : m_mediaType(acceptedMediaType) | 75 : m_mediaType(acceptedMediaType) |
| 82 , m_expectedResult(mediaFeatureResult) | 76 , m_expectedResult(mediaFeatureResult) |
| 83 { | 77 { |
| 84 } | 78 } |
| 85 | 79 |
| 86 MediaQueryEvaluator::MediaQueryEvaluator(const String& acceptedMediaType, LocalF
rame* frame) | 80 MediaQueryEvaluator::MediaQueryEvaluator(LocalFrame* frame) |
| 87 : m_mediaType(acceptedMediaType) | 81 : m_expectedResult(false) // Doesn't matter when we have m_frame and m_style
. |
| 88 , m_expectedResult(false) // Doesn't matter when we have m_frame and m_style
. | |
| 89 , m_mediaValues(MediaValues::createDynamicIfFrameExists(frame)) | 82 , m_mediaValues(MediaValues::createDynamicIfFrameExists(frame)) |
| 90 { | 83 { |
| 91 } | 84 } |
| 92 | 85 |
| 93 MediaQueryEvaluator::MediaQueryEvaluator(const String& acceptedMediaType, const
MediaValues& mediaValues) | 86 MediaQueryEvaluator::MediaQueryEvaluator(const MediaValues& mediaValues) |
| 94 : m_mediaType(acceptedMediaType) | 87 : m_expectedResult(false) // Doesn't matter when we have mediaValues. |
| 95 , m_expectedResult(false) // Doesn't matter when we have mediaValues. | |
| 96 , m_mediaValues(mediaValues.copy()) | 88 , m_mediaValues(mediaValues.copy()) |
| 97 { | 89 { |
| 98 } | 90 } |
| 99 | 91 |
| 100 MediaQueryEvaluator::~MediaQueryEvaluator() | 92 MediaQueryEvaluator::~MediaQueryEvaluator() |
| 101 { | 93 { |
| 102 } | 94 } |
| 103 | 95 |
| 96 const String MediaQueryEvaluator::mediaType() const |
| 97 { |
| 98 // If a static mediaType was given by the constructor, we use it here. |
| 99 if (!m_mediaType.isEmpty()) |
| 100 return m_mediaType; |
| 101 // Otherwise, we get one from mediaValues (which may be dynamic or cached). |
| 102 if (m_mediaValues) |
| 103 return m_mediaValues->mediaType(); |
| 104 return nullAtom; |
| 105 } |
| 106 |
| 104 bool MediaQueryEvaluator::mediaTypeMatch(const String& mediaTypeToMatch) const | 107 bool MediaQueryEvaluator::mediaTypeMatch(const String& mediaTypeToMatch) const |
| 105 { | 108 { |
| 106 return mediaTypeToMatch.isEmpty() | 109 return mediaTypeToMatch.isEmpty() |
| 107 || equalIgnoringCase(mediaTypeToMatch, MediaTypeNames::all) | 110 || equalIgnoringCase(mediaTypeToMatch, MediaTypeNames::all) |
| 108 || equalIgnoringCase(mediaTypeToMatch, m_mediaType); | 111 || equalIgnoringCase(mediaTypeToMatch, mediaType()); |
| 109 } | 112 } |
| 110 | 113 |
| 111 bool MediaQueryEvaluator::mediaTypeMatchSpecific(const char* mediaTypeToMatch) c
onst | 114 bool MediaQueryEvaluator::mediaTypeMatchSpecific(const char* mediaTypeToMatch) c
onst |
| 112 { | 115 { |
| 113 // Like mediaTypeMatch, but without the special cases for "" and "all". | 116 // Like mediaTypeMatch, but without the special cases for "" and "all". |
| 114 ASSERT(mediaTypeToMatch); | 117 ASSERT(mediaTypeToMatch); |
| 115 ASSERT(mediaTypeToMatch[0] != '\0'); | 118 ASSERT(mediaTypeToMatch[0] != '\0'); |
| 116 ASSERT(!equalIgnoringCase(mediaTypeToMatch, MediaTypeNames::all)); | 119 ASSERT(!equalIgnoringCase(mediaTypeToMatch, MediaTypeNames::all)); |
| 117 return equalIgnoringCase(mediaTypeToMatch, m_mediaType); | 120 return equalIgnoringCase(mediaTypeToMatch, mediaType()); |
| 118 } | 121 } |
| 119 | 122 |
| 120 static bool applyRestrictor(MediaQuery::Restrictor r, bool value) | 123 static bool applyRestrictor(MediaQuery::Restrictor r, bool value) |
| 121 { | 124 { |
| 122 return r == MediaQuery::Not ? !value : value; | 125 return r == MediaQuery::Not ? !value : value; |
| 123 } | 126 } |
| 124 | 127 |
| 125 bool MediaQueryEvaluator::eval(const MediaQuerySet* querySet, MediaQueryResultLi
st* viewportDependentMediaQueryResults) const | 128 bool MediaQueryEvaluator::eval(const MediaQuerySet* querySet, MediaQueryResultLi
st* viewportDependentMediaQueryResults) const |
| 126 { | 129 { |
| 127 if (!querySet) | 130 if (!querySet) |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 262 static bool evalResolution(const MediaQueryExpValue& value, MediaFeaturePrefix o
p, const MediaValues& mediaValues) | 265 static bool evalResolution(const MediaQueryExpValue& value, MediaFeaturePrefix o
p, const MediaValues& mediaValues) |
| 263 { | 266 { |
| 264 // According to MQ4, only 'screen', 'print' and 'speech' may match. | 267 // According to MQ4, only 'screen', 'print' and 'speech' may match. |
| 265 // FIXME: What should speech match? https://www.w3.org/Style/CSS/Tracker/iss
ues/348 | 268 // FIXME: What should speech match? https://www.w3.org/Style/CSS/Tracker/iss
ues/348 |
| 266 float actualResolution = 0; | 269 float actualResolution = 0; |
| 267 | 270 |
| 268 // This checks the actual media type applied to the document, and we know | 271 // This checks the actual media type applied to the document, and we know |
| 269 // this method only got called if this media type matches the one defined | 272 // this method only got called if this media type matches the one defined |
| 270 // in the query. Thus, if if the document's media type is "print", the | 273 // in the query. Thus, if if the document's media type is "print", the |
| 271 // media type of the query will either be "print" or "all". | 274 // media type of the query will either be "print" or "all". |
| 272 if (mediaValues.screenMediaType()) { | 275 if (equalIgnoringCase(mediaValues.mediaType(), MediaTypeNames::screen)) { |
| 273 actualResolution = clampTo<float>(mediaValues.devicePixelRatio()); | 276 actualResolution = clampTo<float>(mediaValues.devicePixelRatio()); |
| 274 } else if (mediaValues.printMediaType()) { | 277 } else if (equalIgnoringCase(mediaValues.mediaType(), MediaTypeNames::print)
) { |
| 275 // The resolution of images while printing should not depend on the DPI | 278 // The resolution of images while printing should not depend on the DPI |
| 276 // of the screen. Until we support proper ways of querying this info | 279 // of the screen. Until we support proper ways of querying this info |
| 277 // we use 300px which is considered minimum for current printers. | 280 // we use 300px which is considered minimum for current printers. |
| 278 actualResolution = 300 / cssPixelsPerInch; | 281 actualResolution = 300 / cssPixelsPerInch; |
| 279 } | 282 } |
| 280 | 283 |
| 281 if (!value.isValid()) | 284 if (!value.isValid()) |
| 282 return !!actualResolution; | 285 return !!actualResolution; |
| 283 | 286 |
| 284 if (!value.isValue) | 287 if (!value.isValue) |
| (...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 560 if (!value.isID) | 563 if (!value.isID) |
| 561 return false; | 564 return false; |
| 562 | 565 |
| 563 return (pointer == MediaValues::NoPointer && value.id == CSSValueNone) | 566 return (pointer == MediaValues::NoPointer && value.id == CSSValueNone) |
| 564 || (pointer == MediaValues::TouchPointer && value.id == CSSValueCoarse) | 567 || (pointer == MediaValues::TouchPointer && value.id == CSSValueCoarse) |
| 565 || (pointer == MediaValues::MousePointer && value.id == CSSValueFine); | 568 || (pointer == MediaValues::MousePointer && value.id == CSSValueFine); |
| 566 } | 569 } |
| 567 | 570 |
| 568 static bool scanMediaFeatureEval(const MediaQueryExpValue& value, MediaFeaturePr
efix, const MediaValues& mediaValues) | 571 static bool scanMediaFeatureEval(const MediaQueryExpValue& value, MediaFeaturePr
efix, const MediaValues& mediaValues) |
| 569 { | 572 { |
| 570 if (!mediaValues.scanMediaType()) | 573 // Scan only applies to 'tv' media. |
| 574 if (!equalIgnoringCase(mediaValues.mediaType(), MediaTypeNames::tv)) |
| 571 return false; | 575 return false; |
| 572 | 576 |
| 573 if (!value.isValid()) | 577 if (!value.isValid()) |
| 574 return true; | 578 return true; |
| 575 | 579 |
| 576 if (!value.isID) | 580 if (!value.isID) |
| 577 return false; | 581 return false; |
| 578 | 582 |
| 579 // If a platform interface supplies progressive/interlace info for TVs in th
e | 583 // If a platform interface supplies progressive/interlace info for TVs in th
e |
| 580 // future, it needs to be handled here. For now, assume a modern TV with | 584 // future, it needs to be handled here. For now, assume a modern TV with |
| (...skipping 22 matching lines...) Expand all Loading... |
| 603 // Call the media feature evaluation function. Assume no prefix and let | 607 // Call the media feature evaluation function. Assume no prefix and let |
| 604 // trampoline functions override the prefix if prefix is used. | 608 // trampoline functions override the prefix if prefix is used. |
| 605 EvalFunc func = gFunctionMap->get(expr->mediaFeature().impl()); | 609 EvalFunc func = gFunctionMap->get(expr->mediaFeature().impl()); |
| 606 if (func) | 610 if (func) |
| 607 return func(expr->expValue(), NoPrefix, *m_mediaValues); | 611 return func(expr->expValue(), NoPrefix, *m_mediaValues); |
| 608 | 612 |
| 609 return false; | 613 return false; |
| 610 } | 614 } |
| 611 | 615 |
| 612 } // namespace | 616 } // namespace |
| OLD | NEW |