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.
4
5#include "config.h"
6#include "core/css/MediaQueryEvaluator.h"
7
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"
15
16#include <gtest/gtest.h>
17
18namespace blink {
19
20typedef struct {
21    const char* input;
22    const bool output;
23} TestCase;
24
25TestCase screenTestCases[] = {
26    {"", 1},
27    {" ", 1},
28    {"screen", 1},
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},
49    {"(hover: none)", 0},
50    {0, 0} // Do not remove the terminator line.
51};
52
53TestCase 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    {"(max-height: 500px)", 1},
64    {"(max-height: 499px)", 0},
65    {"(height: 500px)", 1},
66    {"(height: 501px)", 0},
67    {"screen and (min-width: 400px) and (max-width: 700px)", 1},
68    {0, 0} // Do not remove the terminator line.
69};
70
71TestCase printTestCases[] = {
72    {"print and (min-resolution: 1dppx)", 1},
73    {"print and (min-resolution: 118dpcm)", 1},
74    {"print and (min-resolution: 119dpcm)", 0},
75    {0, 0} // Do not remove the terminator line.
76};
77
78void testMQEvaluator(TestCase* testCases, const MediaQueryEvaluator& mediaQueryEvaluator)
79{
80    for (unsigned i = 0; testCases[i].input; ++i) {
81        RefPtrWillBeRawPtr<MediaQuerySet> querySet = MediaQuerySet::create(testCases[i].input);
82        ASSERT_EQ(testCases[i].output, mediaQueryEvaluator.eval(querySet.get()));
83    }
84}
85
86TEST(MediaQueryEvaluatorTest, Cached)
87{
88    MediaValuesCached::MediaValuesCachedData data;
89    data.viewportWidth = 500;
90    data.viewportHeight = 500;
91    data.deviceWidth = 500;
92    data.deviceHeight = 500;
93    data.devicePixelRatio = 2.0;
94    data.colorBitsPerComponent = 24;
95    data.monochromeBitsPerComponent = 0;
96    data.primaryPointerType = PointerTypeFine;
97    data.primaryHoverType = HoverTypeHover;
98    data.defaultFontSize = 16;
99    data.threeDEnabled = true;
100    data.mediaType = MediaTypeNames::screen;
101    data.strictMode = true;
102    RefPtr<MediaValues> mediaValues = MediaValuesCached::create(data);
103
104    MediaQueryEvaluator mediaQueryEvaluator(*mediaValues);
105    testMQEvaluator(screenTestCases, mediaQueryEvaluator);
106    testMQEvaluator(viewportTestCases, mediaQueryEvaluator);
107
108    data.mediaType = MediaTypeNames::print;
109    mediaValues = MediaValuesCached::create(data);
110    MediaQueryEvaluator printMediaQueryEvaluator(*mediaValues);
111    testMQEvaluator(printTestCases, printMediaQueryEvaluator);
112}
113
114TEST(MediaQueryEvaluatorTest, Dynamic)
115{
116    OwnPtr<DummyPageHolder> pageHolder = DummyPageHolder::create(IntSize(500, 500));
117    pageHolder->frameView().setMediaType(MediaTypeNames::screen);
118
119    MediaQueryEvaluator mediaQueryEvaluator(&pageHolder->frame());
120    testMQEvaluator(viewportTestCases, mediaQueryEvaluator);
121    pageHolder->frameView().setMediaType(MediaTypeNames::print);
122    testMQEvaluator(printTestCases, mediaQueryEvaluator);
123}
124
125TEST(MediaQueryEvaluatorTest, DynamicNoView)
126{
127    OwnPtr<DummyPageHolder> pageHolder = DummyPageHolder::create(IntSize(500, 500));
128    RefPtr<FrameView> view = pageHolder->frame().view();
129    pageHolder->frame().setView(nullptr);
130    MediaQueryEvaluator mediaQueryEvaluator(&pageHolder->frame());
131    RefPtrWillBeRawPtr<MediaQuerySet> querySet = MediaQuerySet::create("foobar");
132    bool output = false;
133    ASSERT_EQ(output, mediaQueryEvaluator.eval(querySet.get()));
134    pageHolder->frame().setView(view);
135}
136
137} // namespace
138