1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
6 #include "core/css/MediaQueryEvaluator.h"
8 #include "core/MediaTypeNames.h"
9 #include "core/css/MediaList.h"
10 #include "core/css/MediaValuesCached.h"
11 #include "core/frame/FrameView.h"
12 #include "core/testing/DummyPageHolder.h"
13 #include "wtf/PassOwnPtr.h"
14 #include "wtf/text/StringBuilder.h"
16 #include <gtest/gtest.h>
25 TestCase screenTestCases[] = {
29 {"screen and (color)", 1},
30 {"not screen and (color)", 0},
31 {"screen and (device-aspect-ratio: 16/9)", 0},
32 {"screen and (device-aspect-ratio: 1/1)", 1},
33 {"all and (min-color: 2)", 1},
34 {"all and (min-color: 32)", 0},
35 {"all and (min-color-index: 0)", 1},
36 {"all and (min-color-index: 1)", 0},
37 {"all and (monochrome)", 0},
38 {"all and (min-monochrome: 0)", 1},
39 {"all and (grid: 0)", 1},
40 {"(resolution: 2dppx)", 1},
41 {"(resolution: 1dppx)", 0},
42 {"(orientation: portrait)", 1},
43 {"(orientation: landscape)", 0},
44 {"tv and (scan: progressive)", 0},
45 {"(pointer: coarse)", 0},
46 {"(pointer: fine)", 1},
47 {"(hover: hover)", 1},
48 {"(hover: on-demand)", 0},
50 {0, 0} // Do not remove the terminator line.
53 TestCase viewportTestCases[] = {
54 {"all and (min-width: 500px)", 1},
55 {"(min-width: 500px)", 1},
56 {"(min-width: 501px)", 0},
57 {"(max-width: 500px)", 1},
58 {"(max-width: 499px)", 0},
59 {"(width: 500px)", 1},
60 {"(width: 501px)", 0},
61 {"(min-height: 500px)", 1},
62 {"(min-height: 501px)", 0},
63 {"(min-height: 500.001px)", 0},
64 {"(max-height: 500px)", 1},
65 {"(max-height: 499.999px)", 0},
66 {"(max-height: 499px)", 0},
67 {"(height: 500px)", 1},
68 {"(height: 500.001px)", 0},
69 {"(height: 499.999px)", 0},
70 {"(height: 501px)", 0},
73 {"(width: whatisthis)", 0},
74 {"screen and (min-width: 400px) and (max-width: 700px)", 1},
75 {0, 0} // Do not remove the terminator line.
78 TestCase printTestCases[] = {
79 {"print and (min-resolution: 1dppx)", 1},
80 {"print and (min-resolution: 118dpcm)", 1},
81 {"print and (min-resolution: 119dpcm)", 0},
82 {0, 0} // Do not remove the terminator line.
85 void testMQEvaluator(TestCase* testCases, const MediaQueryEvaluator& mediaQueryEvaluator)
87 RefPtrWillBePersistent<MediaQuerySet> querySet = nullptr;
88 for (unsigned i = 0; testCases[i].input; ++i) {
89 querySet = MediaQuerySet::create(testCases[i].input);
90 ASSERT_EQ(testCases[i].output, mediaQueryEvaluator.eval(querySet.get()));
94 TEST(MediaQueryEvaluatorTest, Cached)
96 MediaValuesCached::MediaValuesCachedData data;
97 data.viewportWidth = 500;
98 data.viewportHeight = 500;
99 data.deviceWidth = 500;
100 data.deviceHeight = 500;
101 data.devicePixelRatio = 2.0;
102 data.colorBitsPerComponent = 24;
103 data.monochromeBitsPerComponent = 0;
104 data.primaryPointerType = PointerTypeFine;
105 data.primaryHoverType = HoverTypeHover;
106 data.defaultFontSize = 16;
107 data.threeDEnabled = true;
108 data.mediaType = MediaTypeNames::screen;
109 data.strictMode = true;
110 RefPtr<MediaValues> mediaValues = MediaValuesCached::create(data);
112 MediaQueryEvaluator mediaQueryEvaluator(*mediaValues);
113 testMQEvaluator(screenTestCases, mediaQueryEvaluator);
114 testMQEvaluator(viewportTestCases, mediaQueryEvaluator);
116 data.mediaType = MediaTypeNames::print;
117 mediaValues = MediaValuesCached::create(data);
118 MediaQueryEvaluator printMediaQueryEvaluator(*mediaValues);
119 testMQEvaluator(printTestCases, printMediaQueryEvaluator);
122 TEST(MediaQueryEvaluatorTest, Dynamic)
124 OwnPtr<DummyPageHolder> pageHolder = DummyPageHolder::create(IntSize(500, 500));
125 pageHolder->frameView().setMediaType(MediaTypeNames::screen);
127 MediaQueryEvaluator mediaQueryEvaluator(&pageHolder->frame());
128 testMQEvaluator(viewportTestCases, mediaQueryEvaluator);
129 pageHolder->frameView().setMediaType(MediaTypeNames::print);
130 testMQEvaluator(printTestCases, mediaQueryEvaluator);
133 TEST(MediaQueryEvaluatorTest, DynamicNoView)
135 OwnPtr<DummyPageHolder> pageHolder = DummyPageHolder::create(IntSize(500, 500));
136 RefPtrWillBePersistent<FrameView> view = pageHolder->frame().view();
137 pageHolder->frame().setView(nullptr);
138 MediaQueryEvaluator mediaQueryEvaluator(&pageHolder->frame());
139 RefPtrWillBePersistent<MediaQuerySet> querySet = MediaQuerySet::create("foobar");
141 ASSERT_EQ(output, mediaQueryEvaluator.eval(querySet.get()));
142 pageHolder->frame().setView(view);