OLD | NEW |
| (Empty) |
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 #ifndef COMPONENTS_TEST_RUNNER_WEB_TEST_PROXY_H_ | |
6 #define COMPONENTS_TEST_RUNNER_WEB_TEST_PROXY_H_ | |
7 | |
8 #include <memory> | |
9 #include <string> | |
10 #include <utility> | |
11 | |
12 #include "base/callback.h" | |
13 #include "base/macros.h" | |
14 #include "build/build_config.h" | |
15 #include "components/test_runner/test_runner_export.h" | |
16 #include "components/test_runner/web_view_test_client.h" | |
17 #include "components/test_runner/web_widget_test_client.h" | |
18 #include "third_party/WebKit/public/platform/WebDragOperation.h" | |
19 #include "third_party/WebKit/public/platform/WebRect.h" | |
20 #include "third_party/WebKit/public/platform/WebScreenInfo.h" | |
21 #include "third_party/WebKit/public/platform/WebURLError.h" | |
22 #include "third_party/WebKit/public/platform/WebURLRequest.h" | |
23 #include "third_party/WebKit/public/web/WebDOMMessageEvent.h" | |
24 #include "third_party/WebKit/public/web/WebHistoryCommitType.h" | |
25 #include "third_party/WebKit/public/web/WebNavigationPolicy.h" | |
26 #include "third_party/WebKit/public/web/WebTextDirection.h" | |
27 #include "third_party/WebKit/public/web/WebViewClient.h" | |
28 #include "third_party/WebKit/public/web/WebWidgetClient.h" | |
29 | |
30 namespace blink { | |
31 class WebDragData; | |
32 class WebFileChooserCompletion; | |
33 class WebImage; | |
34 class WebLocalFrame; | |
35 class WebString; | |
36 class WebView; | |
37 class WebWidget; | |
38 struct WebFileChooserParams; | |
39 struct WebPoint; | |
40 struct WebWindowFeatures; | |
41 } | |
42 | |
43 namespace test_runner { | |
44 | |
45 class AccessibilityController; | |
46 class EventSender; | |
47 class TestInterfaces; | |
48 class TestRunnerForSpecificView; | |
49 class TextInputController; | |
50 class WebTestDelegate; | |
51 class WebTestInterfaces; | |
52 | |
53 // WebTestProxyBase is the "brain" of WebTestProxy in the sense that | |
54 // WebTestProxy does the bridge between RenderViewImpl and WebTestProxyBase and | |
55 // when it requires a behavior to be different from the usual, it will call | |
56 // WebTestProxyBase that implements the expected behavior. | |
57 // See WebTestProxy class comments for more information. | |
58 class TEST_RUNNER_EXPORT WebTestProxyBase { | |
59 public: | |
60 blink::WebWidget* web_widget() { return web_widget_; } | |
61 void set_web_widget(blink::WebWidget* widget) { | |
62 DCHECK(widget); | |
63 DCHECK(!web_widget_); | |
64 web_widget_ = widget; | |
65 } | |
66 | |
67 blink::WebView* web_view() { return web_view_; } | |
68 void set_web_view(blink::WebView* view) { | |
69 DCHECK(view); | |
70 DCHECK(!web_view_); | |
71 web_view_ = view; | |
72 } | |
73 | |
74 void set_view_test_client( | |
75 std::unique_ptr<WebViewTestClient> view_test_client) { | |
76 DCHECK(view_test_client); | |
77 DCHECK(!view_test_client_); | |
78 view_test_client_ = std::move(view_test_client); | |
79 } | |
80 | |
81 void set_widget_test_client( | |
82 std::unique_ptr<WebWidgetTestClient> widget_test_client) { | |
83 DCHECK(widget_test_client); | |
84 DCHECK(!widget_test_client_); | |
85 widget_test_client_ = std::move(widget_test_client); | |
86 } | |
87 | |
88 WebTestDelegate* delegate() { return delegate_; } | |
89 void set_delegate(WebTestDelegate* delegate) { | |
90 DCHECK(delegate); | |
91 DCHECK(!delegate_); | |
92 delegate_ = delegate; | |
93 } | |
94 | |
95 TestInterfaces* test_interfaces() { return test_interfaces_; } | |
96 void SetInterfaces(WebTestInterfaces* web_test_interfaces); | |
97 | |
98 EventSender* event_sender() { return event_sender_.get(); } | |
99 | |
100 AccessibilityController* accessibility_controller() { | |
101 return accessibility_controller_.get(); | |
102 } | |
103 | |
104 TestRunnerForSpecificView* view_test_runner() { | |
105 return view_test_runner_.get(); | |
106 } | |
107 | |
108 void Reset(); | |
109 void BindTo(blink::WebLocalFrame* frame); | |
110 | |
111 void GetScreenOrientationForTesting(blink::WebScreenInfo&); | |
112 | |
113 protected: | |
114 WebTestProxyBase(); | |
115 ~WebTestProxyBase(); | |
116 | |
117 blink::WebViewClient* view_test_client() { return view_test_client_.get(); } | |
118 blink::WebWidgetClient* widget_test_client() { | |
119 return widget_test_client_.get(); | |
120 } | |
121 | |
122 private: | |
123 TestInterfaces* test_interfaces_; | |
124 WebTestDelegate* delegate_; | |
125 blink::WebView* web_view_; | |
126 blink::WebWidget* web_widget_; | |
127 std::unique_ptr<WebViewTestClient> view_test_client_; | |
128 std::unique_ptr<WebWidgetTestClient> widget_test_client_; | |
129 std::unique_ptr<AccessibilityController> accessibility_controller_; | |
130 std::unique_ptr<EventSender> event_sender_; | |
131 std::unique_ptr<TextInputController> text_input_controller_; | |
132 std::unique_ptr<TestRunnerForSpecificView> view_test_runner_; | |
133 | |
134 DISALLOW_COPY_AND_ASSIGN(WebTestProxyBase); | |
135 }; | |
136 | |
137 // WebTestProxy is used during LayoutTests and always instantiated, at time of | |
138 // writing with Base=RenderViewImpl. It does not directly inherit from it for | |
139 // layering purposes. | |
140 // The intent of that class is to wrap RenderViewImpl for tests purposes in | |
141 // order to reduce the amount of test specific code in the production code. | |
142 // WebTestProxy is only doing the glue between RenderViewImpl and | |
143 // WebTestProxyBase, that means that there is no logic living in this class | |
144 // except deciding which base class should be called (could be both). | |
145 // | |
146 // Examples of usage: | |
147 // * when a fooClient has a mock implementation, WebTestProxy can override the | |
148 // fooClient() call and have WebTestProxyBase return the mock implementation. | |
149 // * when a value needs to be overridden by LayoutTests, WebTestProxy can | |
150 // override RenderViewImpl's getter and call a getter from WebTestProxyBase | |
151 // instead. In addition, WebTestProxyBase will have a public setter that | |
152 // could be called from the TestRunner. | |
153 #if defined(OS_WIN) | |
154 // WebTestProxy is a diamond-shaped hierarchy, with WebWidgetClient at the root. | |
155 // VS warns when we inherit the WebWidgetClient method implementations from | |
156 // RenderWidget. It's safe to ignore that warning. | |
157 #pragma warning(disable: 4250) | |
158 #endif | |
159 template <class Base, typename... Args> | |
160 class WebTestProxy : public Base, public WebTestProxyBase { | |
161 public: | |
162 explicit WebTestProxy(Args... args) : Base(args...) {} | |
163 | |
164 // WebWidgetClient implementation. | |
165 blink::WebScreenInfo screenInfo() override { | |
166 blink::WebScreenInfo info = Base::screenInfo(); | |
167 blink::WebScreenInfo test_info = widget_test_client()->screenInfo(); | |
168 if (test_info.orientationType != blink::WebScreenOrientationUndefined) { | |
169 info.orientationType = test_info.orientationType; | |
170 info.orientationAngle = test_info.orientationAngle; | |
171 } | |
172 return info; | |
173 } | |
174 void scheduleAnimation() override { | |
175 widget_test_client()->scheduleAnimation(); | |
176 } | |
177 bool requestPointerLock() override { | |
178 return widget_test_client()->requestPointerLock(); | |
179 } | |
180 void requestPointerUnlock() override { | |
181 widget_test_client()->requestPointerUnlock(); | |
182 } | |
183 bool isPointerLocked() override { | |
184 return widget_test_client()->isPointerLocked(); | |
185 } | |
186 void didFocus() override { | |
187 view_test_client()->didFocus(); | |
188 Base::didFocus(); | |
189 } | |
190 void setToolTipText(const blink::WebString& text, | |
191 blink::WebTextDirection hint) override { | |
192 widget_test_client()->setToolTipText(text, hint); | |
193 Base::setToolTipText(text, hint); | |
194 } | |
195 void resetInputMethod() override { widget_test_client()->resetInputMethod(); } | |
196 | |
197 // WebViewClient implementation. | |
198 void startDragging(blink::WebLocalFrame* frame, | |
199 const blink::WebDragData& data, | |
200 blink::WebDragOperationsMask mask, | |
201 const blink::WebImage& image, | |
202 const blink::WebPoint& point) override { | |
203 view_test_client()->startDragging(frame, data, mask, image, point); | |
204 // Don't forward this call to Base because we don't want to do a real | |
205 // drag-and-drop. | |
206 } | |
207 void didChangeContents() override { | |
208 view_test_client()->didChangeContents(); | |
209 Base::didChangeContents(); | |
210 } | |
211 blink::WebView* createView(blink::WebLocalFrame* creator, | |
212 const blink::WebURLRequest& request, | |
213 const blink::WebWindowFeatures& features, | |
214 const blink::WebString& frame_name, | |
215 blink::WebNavigationPolicy policy, | |
216 bool suppress_opener) override { | |
217 if (!view_test_client()->createView(creator, request, features, frame_name, | |
218 policy, suppress_opener)) | |
219 return nullptr; | |
220 return Base::createView( | |
221 creator, request, features, frame_name, policy, suppress_opener); | |
222 } | |
223 void setStatusText(const blink::WebString& text) override { | |
224 view_test_client()->setStatusText(text); | |
225 Base::setStatusText(text); | |
226 } | |
227 void printPage(blink::WebLocalFrame* frame) override { | |
228 view_test_client()->printPage(frame); | |
229 } | |
230 blink::WebSpeechRecognizer* speechRecognizer() override { | |
231 return view_test_client()->speechRecognizer(); | |
232 } | |
233 void showValidationMessage( | |
234 const blink::WebRect& anchor_in_root_view, | |
235 const blink::WebString& main_message, | |
236 blink::WebTextDirection main_message_hint, | |
237 const blink::WebString& sub_message, | |
238 blink::WebTextDirection sub_message_hint) override { | |
239 view_test_client()->showValidationMessage(anchor_in_root_view, main_message, | |
240 main_message_hint, sub_message, | |
241 sub_message_hint); | |
242 } | |
243 blink::WebString acceptLanguages() override { | |
244 return view_test_client()->acceptLanguages(); | |
245 } | |
246 | |
247 private: | |
248 virtual ~WebTestProxy() {} | |
249 | |
250 DISALLOW_COPY_AND_ASSIGN(WebTestProxy); | |
251 }; | |
252 | |
253 } // namespace test_runner | |
254 | |
255 #endif // COMPONENTS_TEST_RUNNER_WEB_TEST_PROXY_H_ | |
OLD | NEW |