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