OLD | NEW |
| (Empty) |
1 // Copyright 2017 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 "core/html/MediaCustomControlsFullscreenDetector.h" | |
6 | |
7 #include "core/EventTypeNames.h" | |
8 #include "core/html/HTMLVideoElement.h" | |
9 #include "core/testing/DummyPageHolder.h" | |
10 #include "platform/RuntimeEnabledFeatures.h" | |
11 #include "platform/geometry/IntRect.h" | |
12 #include "testing/gtest/include/gtest/gtest.h" | |
13 | |
14 namespace blink { | |
15 | |
16 namespace { | |
17 | |
18 struct TestParam { | |
19 String description; | |
20 IntRect targetRect; | |
21 bool expectedResult; | |
22 }; | |
23 | |
24 } // anonymous namespace | |
25 | |
26 class MediaCustomControlsFullscreenDetectorTest : public ::testing::Test { | |
27 protected: | |
28 void SetUp() override { | |
29 m_originalVideoFullscreenDetectionEnabled = | |
30 RuntimeEnabledFeatures::videoFullscreenDetectionEnabled(); | |
31 | |
32 RuntimeEnabledFeatures::setVideoFullscreenDetectionEnabled(true); | |
33 | |
34 m_pageHolder = DummyPageHolder::create(); | |
35 m_newPageHolder = DummyPageHolder::create(); | |
36 } | |
37 | |
38 void TearDown() override { | |
39 RuntimeEnabledFeatures::setVideoFullscreenDetectionEnabled( | |
40 m_originalVideoFullscreenDetectionEnabled); | |
41 } | |
42 | |
43 HTMLVideoElement* videoElement() const { | |
44 return toHTMLVideoElement(document().querySelector("video")); | |
45 } | |
46 | |
47 static MediaCustomControlsFullscreenDetector* fullscreenDetectorFor( | |
48 HTMLVideoElement* videoElement) { | |
49 return videoElement->m_customControlsFullscreenDetector; | |
50 } | |
51 | |
52 MediaCustomControlsFullscreenDetector* fullscreenDetector() const { | |
53 return fullscreenDetectorFor(videoElement()); | |
54 } | |
55 | |
56 Document& document() const { return m_pageHolder->document(); } | |
57 Document& newDocument() const { return m_newPageHolder->document(); } | |
58 | |
59 bool checkEventListenerRegistered(EventTarget& target, | |
60 const AtomicString& eventType, | |
61 EventListener* listener) { | |
62 EventListenerVector* listeners = target.getEventListeners(eventType); | |
63 if (!listeners) | |
64 return false; | |
65 | |
66 for (const auto& registeredListener : *listeners) { | |
67 if (registeredListener.listener() == listener) | |
68 return true; | |
69 } | |
70 return false; | |
71 } | |
72 | |
73 static bool computeIsDominantVideo(const IntRect& targetRect, | |
74 const IntRect& rootRect, | |
75 const IntRect& intersectionRect) { | |
76 return MediaCustomControlsFullscreenDetector:: | |
77 computeIsDominantVideoForTests(targetRect, rootRect, intersectionRect); | |
78 } | |
79 | |
80 private: | |
81 std::unique_ptr<DummyPageHolder> m_pageHolder; | |
82 std::unique_ptr<DummyPageHolder> m_newPageHolder; | |
83 Persistent<HTMLVideoElement> m_video; | |
84 | |
85 bool m_originalVideoFullscreenDetectionEnabled; | |
86 }; | |
87 | |
88 TEST_F(MediaCustomControlsFullscreenDetectorTest, computeIsDominantVideo) { | |
89 // TestWithParam cannot be applied here as IntRect needs the memory allocator | |
90 // to be initialized, but the array of parameters is statically initialized, | |
91 // which is before the memory allocation initialization. | |
92 TestParam testParams[] = { | |
93 {"xCompleteFill", {0, 0, 100, 50}, true}, | |
94 {"yCompleteFill", {0, 0, 50, 100}, true}, | |
95 {"xyCompleteFill", {0, 0, 100, 100}, true}, | |
96 {"xIncompleteFillTooSmall", {0, 0, 84, 50}, false}, | |
97 {"yIncompleteFillTooSmall", {0, 0, 50, 84}, false}, | |
98 {"xIncompleteFillJustRight", {0, 0, 86, 50}, true}, | |
99 {"yIncompleteFillJustRight", {0, 0, 50, 86}, true}, | |
100 {"xVisibleProportionTooSmall", {-26, 0, 100, 100}, false}, | |
101 {"yVisibleProportionTooSmall", {0, -26, 100, 100}, false}, | |
102 {"xVisibleProportionJustRight", {-24, 0, 100, 100}, true}, | |
103 {"yVisibleProportionJustRight", {0, -24, 100, 100}, true}, | |
104 }; | |
105 | |
106 IntRect rootRect(0, 0, 100, 100); | |
107 | |
108 for (const TestParam& testParam : testParams) { | |
109 const IntRect& targetRect = testParam.targetRect; | |
110 IntRect intersectionRect = intersection(targetRect, rootRect); | |
111 EXPECT_EQ(testParam.expectedResult, | |
112 computeIsDominantVideo(targetRect, rootRect, intersectionRect)) | |
113 << testParam.description << " failed"; | |
114 } | |
115 } | |
116 | |
117 TEST_F(MediaCustomControlsFullscreenDetectorTest, | |
118 hasNoListenersBeforeAddingToDocument) { | |
119 HTMLVideoElement* video = | |
120 toHTMLVideoElement(document().createElement("video")); | |
121 | |
122 EXPECT_FALSE(checkEventListenerRegistered(document(), | |
123 EventTypeNames::fullscreenchange, | |
124 fullscreenDetectorFor(video))); | |
125 EXPECT_FALSE(checkEventListenerRegistered( | |
126 document(), EventTypeNames::webkitfullscreenchange, | |
127 fullscreenDetectorFor(video))); | |
128 EXPECT_FALSE(checkEventListenerRegistered( | |
129 *video, EventTypeNames::loadedmetadata, fullscreenDetectorFor(video))); | |
130 } | |
131 | |
132 TEST_F(MediaCustomControlsFullscreenDetectorTest, | |
133 hasListenersAfterAddToDocumentByScript) { | |
134 HTMLVideoElement* video = | |
135 toHTMLVideoElement(document().createElement("video")); | |
136 document().body()->appendChild(video); | |
137 | |
138 EXPECT_TRUE(checkEventListenerRegistered( | |
139 document(), EventTypeNames::fullscreenchange, fullscreenDetector())); | |
140 EXPECT_TRUE(checkEventListenerRegistered( | |
141 document(), EventTypeNames::webkitfullscreenchange, | |
142 fullscreenDetector())); | |
143 EXPECT_TRUE(checkEventListenerRegistered( | |
144 *videoElement(), EventTypeNames::loadedmetadata, fullscreenDetector())); | |
145 } | |
146 | |
147 TEST_F(MediaCustomControlsFullscreenDetectorTest, | |
148 hasListenersAfterAddToDocumentByParser) { | |
149 document().body()->setInnerHTML("<body><video></video></body>"); | |
150 | |
151 EXPECT_TRUE(checkEventListenerRegistered( | |
152 document(), EventTypeNames::fullscreenchange, fullscreenDetector())); | |
153 EXPECT_TRUE(checkEventListenerRegistered( | |
154 document(), EventTypeNames::webkitfullscreenchange, | |
155 fullscreenDetector())); | |
156 EXPECT_TRUE(checkEventListenerRegistered( | |
157 *videoElement(), EventTypeNames::loadedmetadata, fullscreenDetector())); | |
158 } | |
159 | |
160 TEST_F(MediaCustomControlsFullscreenDetectorTest, | |
161 hasListenersAfterDocumentMove) { | |
162 HTMLVideoElement* video = | |
163 toHTMLVideoElement(document().createElement("video")); | |
164 document().body()->appendChild(video); | |
165 | |
166 newDocument().body()->appendChild(videoElement()); | |
167 | |
168 EXPECT_FALSE(checkEventListenerRegistered(document(), | |
169 EventTypeNames::fullscreenchange, | |
170 fullscreenDetectorFor(video))); | |
171 EXPECT_FALSE(checkEventListenerRegistered( | |
172 document(), EventTypeNames::webkitfullscreenchange, | |
173 fullscreenDetectorFor(video))); | |
174 | |
175 EXPECT_TRUE(checkEventListenerRegistered(newDocument(), | |
176 EventTypeNames::fullscreenchange, | |
177 fullscreenDetectorFor(video))); | |
178 EXPECT_TRUE(checkEventListenerRegistered( | |
179 newDocument(), EventTypeNames::webkitfullscreenchange, | |
180 fullscreenDetectorFor(video))); | |
181 | |
182 EXPECT_TRUE(checkEventListenerRegistered( | |
183 *video, EventTypeNames::loadedmetadata, fullscreenDetectorFor(video))); | |
184 } | |
185 | |
186 } // namespace blink | |
OLD | NEW |