1 // Copyright (c) 2012 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.
5 #include "content/browser/browser_plugin/test_browser_plugin_guest.h"
7 #include "base/test/test_timeouts.h"
8 #include "content/browser/renderer_host/render_view_host_impl.h"
9 #include "content/browser/web_contents/web_contents_impl.h"
10 #include "content/common/browser_plugin/browser_plugin_messages.h"
14 class BrowserPluginGuest;
16 TestBrowserPluginGuest::TestBrowserPluginGuest(
18 WebContentsImpl* web_contents)
19 : BrowserPluginGuest(instance_id, false, web_contents),
20 update_rect_count_(0),
21 exit_observed_(false),
22 focus_observed_(false),
23 blur_observed_(false),
24 advance_focus_observed_(false),
25 input_observed_(false),
26 load_stop_observed_(false),
27 ime_cancel_observed_(false) {
30 TestBrowserPluginGuest::~TestBrowserPluginGuest() {
33 WebContentsImpl* TestBrowserPluginGuest::web_contents() const {
34 return static_cast<WebContentsImpl*>(BrowserPluginGuest::web_contents());
37 void TestBrowserPluginGuest::SendMessageToEmbedder(IPC::Message* msg) {
38 if (msg->type() == BrowserPluginMsg_UpdateRect::ID) {
41 BrowserPluginMsg_UpdateRect_Params params;
42 BrowserPluginMsg_UpdateRect::Read(msg, &instance_id, ¶ms);
43 last_view_size_observed_ = params.view_size;
44 if (!expected_auto_view_size_.IsEmpty() &&
45 expected_auto_view_size_ == params.view_size) {
46 if (auto_view_size_message_loop_runner_)
47 auto_view_size_message_loop_runner_->Quit();
49 if (send_message_loop_runner_)
50 send_message_loop_runner_->Quit();
52 BrowserPluginGuest::SendMessageToEmbedder(msg);
55 void TestBrowserPluginGuest::WaitForUpdateRectMsg() {
56 // Check if we already got any UpdateRect message.
57 if (update_rect_count_ > 0)
59 send_message_loop_runner_ = new MessageLoopRunner();
60 send_message_loop_runner_->Run();
63 void TestBrowserPluginGuest::ResetUpdateRectCount() {
64 update_rect_count_ = 0;
67 void TestBrowserPluginGuest::RenderProcessGone(base::TerminationStatus status) {
68 exit_observed_ = true;
69 if (status != base::TERMINATION_STATUS_NORMAL_TERMINATION &&
70 status != base::TERMINATION_STATUS_STILL_RUNNING)
71 VLOG(0) << "Guest crashed status: " << status;
72 if (crash_message_loop_runner_)
73 crash_message_loop_runner_->Quit();
74 BrowserPluginGuest::RenderProcessGone(status);
77 void TestBrowserPluginGuest::OnHandleInputEvent(
79 const gfx::Rect& guest_window_rect,
80 const blink::WebInputEvent* event) {
81 BrowserPluginGuest::OnHandleInputEvent(instance_id,
84 input_observed_ = true;
85 if (input_message_loop_runner_)
86 input_message_loop_runner_->Quit();
89 void TestBrowserPluginGuest::WaitForExit() {
90 // Check if we already observed a guest crash, return immediately if so.
94 crash_message_loop_runner_ = new MessageLoopRunner();
95 crash_message_loop_runner_->Run();
98 void TestBrowserPluginGuest::WaitForFocus() {
99 if (focus_observed_) {
100 focus_observed_ = false;
103 focus_message_loop_runner_ = new MessageLoopRunner();
104 focus_message_loop_runner_->Run();
105 focus_observed_ = false;
108 void TestBrowserPluginGuest::WaitForBlur() {
109 if (blur_observed_) {
110 blur_observed_ = false;
113 blur_message_loop_runner_ = new MessageLoopRunner();
114 blur_message_loop_runner_->Run();
115 blur_observed_ = false;
118 void TestBrowserPluginGuest::WaitForAdvanceFocus() {
119 if (advance_focus_observed_)
121 advance_focus_message_loop_runner_ = new MessageLoopRunner();
122 advance_focus_message_loop_runner_->Run();
125 void TestBrowserPluginGuest::WaitForInput() {
126 if (input_observed_) {
127 input_observed_ = false;
131 input_message_loop_runner_ = new MessageLoopRunner();
132 input_message_loop_runner_->Run();
133 input_observed_ = false;
136 void TestBrowserPluginGuest::WaitForLoadStop() {
137 if (load_stop_observed_) {
138 load_stop_observed_ = false;
142 load_stop_message_loop_runner_ = new MessageLoopRunner();
143 load_stop_message_loop_runner_->Run();
144 load_stop_observed_ = false;
147 void TestBrowserPluginGuest::WaitForViewSize(const gfx::Size& view_size) {
148 if (last_view_size_observed_ == view_size) {
149 last_view_size_observed_ = gfx::Size();
153 expected_auto_view_size_ = view_size;
154 auto_view_size_message_loop_runner_ = new MessageLoopRunner();
155 auto_view_size_message_loop_runner_->Run();
156 last_view_size_observed_ = gfx::Size();
159 void TestBrowserPluginGuest::WaitForImeCancel() {
160 if (ime_cancel_observed_) {
161 ime_cancel_observed_ = false;
165 ime_cancel_message_loop_runner_ = new MessageLoopRunner();
166 ime_cancel_message_loop_runner_->Run();
167 ime_cancel_observed_ = false;
170 void TestBrowserPluginGuest::WaitForResizeGuest(const gfx::Size& view_size) {
171 if (last_size_observed_in_resize_ == view_size) {
172 last_size_observed_in_resize_ = gfx::Size();
176 expected_view_size_in_resize_ = view_size;
177 resize_guest_message_loop_runner_ = new MessageLoopRunner();
178 resize_guest_message_loop_runner_->Run();
179 last_size_observed_in_resize_ = gfx::Size();
182 void TestBrowserPluginGuest::OnSetFocus(int instance_id, bool focused) {
184 focus_observed_ = true;
185 if (focus_message_loop_runner_)
186 focus_message_loop_runner_->Quit();
188 blur_observed_ = true;
189 if (blur_message_loop_runner_)
190 blur_message_loop_runner_->Quit();
192 BrowserPluginGuest::OnSetFocus(instance_id, focused);
195 void TestBrowserPluginGuest::OnTakeFocus(bool reverse) {
196 advance_focus_observed_ = true;
197 if (advance_focus_message_loop_runner_)
198 advance_focus_message_loop_runner_->Quit();
199 BrowserPluginGuest::OnTakeFocus(reverse);
202 void TestBrowserPluginGuest::DidStopLoading(
203 RenderViewHost* render_view_host) {
204 BrowserPluginGuest::DidStopLoading(render_view_host);
205 load_stop_observed_ = true;
206 if (load_stop_message_loop_runner_)
207 load_stop_message_loop_runner_->Quit();
210 void TestBrowserPluginGuest::OnImeCancelComposition() {
211 if (!ime_cancel_observed_) {
212 ime_cancel_observed_ = true;
213 if (ime_cancel_message_loop_runner_)
214 ime_cancel_message_loop_runner_->Quit();
216 BrowserPluginGuest::OnImeCancelComposition();
219 void TestBrowserPluginGuest::OnResizeGuest(
221 const BrowserPluginHostMsg_ResizeGuest_Params& params) {
222 last_size_observed_in_resize_ = params.view_rect.size();
223 if (last_size_observed_in_resize_ == expected_view_size_in_resize_ &&
224 resize_guest_message_loop_runner_) {
225 resize_guest_message_loop_runner_->Quit();
228 BrowserPluginGuest::OnResizeGuest(instance_id, params);
231 } // namespace content