OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/site_per_process_browsertest.h" | 5 #include "content/browser/site_per_process_browsertest.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 6293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6304 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowPopup, OnShowPopup) | 6304 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowPopup, OnShowPopup) |
6305 #else | 6305 #else |
6306 IPC_MESSAGE_HANDLER(ViewHostMsg_ShowWidget, OnShowWidget) | 6306 IPC_MESSAGE_HANDLER(ViewHostMsg_ShowWidget, OnShowWidget) |
6307 #endif | 6307 #endif |
6308 IPC_END_MESSAGE_MAP() | 6308 IPC_END_MESSAGE_MAP() |
6309 return false; | 6309 return false; |
6310 } | 6310 } |
6311 | 6311 |
6312 gfx::Rect last_initial_rect() const { return initial_rect_; } | 6312 gfx::Rect last_initial_rect() const { return initial_rect_; } |
6313 | 6313 |
| 6314 int last_routing_id() const { return routing_id_; } |
| 6315 |
6314 void Wait() { | 6316 void Wait() { |
6315 initial_rect_ = gfx::Rect(); | 6317 initial_rect_ = gfx::Rect(); |
| 6318 routing_id_ = MSG_ROUTING_NONE; |
6316 message_loop_runner_->Run(); | 6319 message_loop_runner_->Run(); |
6317 } | 6320 } |
6318 | 6321 |
6319 void Reset() { | 6322 void Reset() { |
6320 initial_rect_ = gfx::Rect(); | 6323 initial_rect_ = gfx::Rect(); |
| 6324 routing_id_ = MSG_ROUTING_NONE; |
6321 message_loop_runner_ = new content::MessageLoopRunner; | 6325 message_loop_runner_ = new content::MessageLoopRunner; |
6322 } | 6326 } |
6323 | 6327 |
6324 private: | 6328 private: |
6325 ~ShowWidgetMessageFilter() override {} | 6329 ~ShowWidgetMessageFilter() override {} |
6326 | 6330 |
6327 void OnShowWidget(int route_id, const gfx::Rect& initial_rect) { | 6331 void OnShowWidget(int route_id, const gfx::Rect& initial_rect) { |
6328 content::BrowserThread::PostTask( | 6332 content::BrowserThread::PostTask( |
6329 content::BrowserThread::UI, FROM_HERE, | 6333 content::BrowserThread::UI, FROM_HERE, |
6330 base::Bind(&ShowWidgetMessageFilter::OnShowWidgetOnUI, this, route_id, | 6334 base::Bind(&ShowWidgetMessageFilter::OnShowWidgetOnUI, this, route_id, |
6331 initial_rect)); | 6335 initial_rect)); |
6332 } | 6336 } |
6333 | 6337 |
6334 #if defined(OS_MACOSX) || defined(OS_ANDROID) | 6338 #if defined(OS_MACOSX) || defined(OS_ANDROID) |
6335 void OnShowPopup(const FrameHostMsg_ShowPopup_Params& params) { | 6339 void OnShowPopup(const FrameHostMsg_ShowPopup_Params& params) { |
6336 content::BrowserThread::PostTask( | 6340 content::BrowserThread::PostTask( |
6337 content::BrowserThread::UI, FROM_HERE, | 6341 content::BrowserThread::UI, FROM_HERE, |
6338 base::Bind(&ShowWidgetMessageFilter::OnShowWidgetOnUI, this, | 6342 base::Bind(&ShowWidgetMessageFilter::OnShowWidgetOnUI, this, |
6339 MSG_ROUTING_NONE, params.bounds)); | 6343 MSG_ROUTING_NONE, params.bounds)); |
6340 } | 6344 } |
6341 #endif | 6345 #endif |
6342 | 6346 |
6343 void OnShowWidgetOnUI(int route_id, const gfx::Rect& initial_rect) { | 6347 void OnShowWidgetOnUI(int route_id, const gfx::Rect& initial_rect) { |
6344 initial_rect_ = initial_rect; | 6348 initial_rect_ = initial_rect; |
| 6349 routing_id_ = route_id; |
6345 message_loop_runner_->Quit(); | 6350 message_loop_runner_->Quit(); |
6346 } | 6351 } |
6347 | 6352 |
6348 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; | 6353 scoped_refptr<content::MessageLoopRunner> message_loop_runner_; |
6349 gfx::Rect initial_rect_; | 6354 gfx::Rect initial_rect_; |
| 6355 int routing_id_; |
6350 | 6356 |
6351 DISALLOW_COPY_AND_ASSIGN(ShowWidgetMessageFilter); | 6357 DISALLOW_COPY_AND_ASSIGN(ShowWidgetMessageFilter); |
6352 }; | 6358 }; |
6353 | 6359 |
6354 // Test that clicking a select element in an out-of-process iframe creates | 6360 // Test that clicking a select element in an out-of-process iframe creates |
6355 // a popup menu in the correct position. | 6361 // a popup menu in the correct position. |
6356 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, PopupMenuTest) { | 6362 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, PopupMenuTest) { |
6357 GURL main_url( | 6363 GURL main_url( |
6358 embedded_test_server()->GetURL("/cross_site_iframe_factory.html?a(a)")); | 6364 embedded_test_server()->GetURL("/cross_site_iframe_factory.html?a(a)")); |
6359 EXPECT_TRUE(NavigateToURL(shell(), main_url)); | 6365 EXPECT_TRUE(NavigateToURL(shell(), main_url)); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6402 gfx::Rect popup_rect = filter->last_initial_rect(); | 6408 gfx::Rect popup_rect = filter->last_initial_rect(); |
6403 #if defined(OS_MACOSX) || defined(OS_ANDROID) | 6409 #if defined(OS_MACOSX) || defined(OS_ANDROID) |
6404 // On Mac and Android we receive the coordinates before they are transformed, | 6410 // On Mac and Android we receive the coordinates before they are transformed, |
6405 // so they are still relative to the out-of-process iframe origin. | 6411 // so they are still relative to the out-of-process iframe origin. |
6406 EXPECT_EQ(popup_rect.x(), 9); | 6412 EXPECT_EQ(popup_rect.x(), 9); |
6407 EXPECT_EQ(popup_rect.y(), 9); | 6413 EXPECT_EQ(popup_rect.y(), 9); |
6408 #else | 6414 #else |
6409 EXPECT_EQ(popup_rect.x() - rwhv_root->GetViewBounds().x(), 354); | 6415 EXPECT_EQ(popup_rect.x() - rwhv_root->GetViewBounds().x(), 354); |
6410 EXPECT_EQ(popup_rect.y() - rwhv_root->GetViewBounds().y(), 94); | 6416 EXPECT_EQ(popup_rect.y() - rwhv_root->GetViewBounds().y(), 94); |
6411 #endif | 6417 #endif |
| 6418 |
| 6419 #if defined(OS_LINUX) |
| 6420 // Verify click-and-drag selection of popups still works on Linux with |
| 6421 // OOPIFs enabled. This is only necessary to test on Aura because Mac and |
| 6422 // Android use native widgets. Windows does not support this as UI |
| 6423 // convention (it requires separate clicks to open the menu and select an |
| 6424 // option). See https://crbug.com/703191. |
| 6425 int process_id = child_node->current_frame_host()->GetProcess()->GetID(); |
| 6426 filter->Reset(); |
| 6427 RenderWidgetHostInputEventRouter* router = |
| 6428 static_cast<WebContentsImpl*>(shell()->web_contents()) |
| 6429 ->GetInputEventRouter(); |
| 6430 // Re-open the select element. |
| 6431 click_event.x = 360; |
| 6432 click_event.y = 90; |
| 6433 click_event.clickCount = 1; |
| 6434 router->RouteMouseEvent(rwhv_root, &click_event, ui::LatencyInfo()); |
| 6435 |
| 6436 filter->Wait(); |
| 6437 |
| 6438 RenderWidgetHostView* popup_view = |
| 6439 RenderWidgetHost::FromID(process_id, filter->last_routing_id()) |
| 6440 ->GetView(); |
| 6441 |
| 6442 RenderWidgetHostMouseEventMonitor popup_monitor( |
| 6443 popup_view->GetRenderWidgetHost()); |
| 6444 |
| 6445 // Next send a mouse up directly targeting the first option, simulating a |
| 6446 // drag. This requires a ui::MouseEvent because it tests behavior that is |
| 6447 // above RWH input event routing. |
| 6448 ui::MouseEvent mouse_up_event(ui::ET_MOUSE_RELEASED, gfx::Point(10, 5), |
| 6449 gfx::Point(10, 5), ui::EventTimeForNow(), |
| 6450 ui::EF_LEFT_MOUSE_BUTTON, |
| 6451 ui::EF_LEFT_MOUSE_BUTTON); |
| 6452 static_cast<RenderWidgetHostViewAura*>(popup_view) |
| 6453 ->OnMouseEvent(&mouse_up_event); |
| 6454 |
| 6455 // This verifies that the popup actually received the event, and it wasn't |
| 6456 // diverted to a different RenderWidgetHostView due to mouse capture. |
| 6457 EXPECT_TRUE(popup_monitor.EventWasReceived()); |
| 6458 #endif |
6412 } | 6459 } |
6413 | 6460 |
6414 // Test that clicking a select element in a nested out-of-process iframe creates | 6461 // Test that clicking a select element in a nested out-of-process iframe creates |
6415 // a popup menu in the correct position, even if the top-level page repositions | 6462 // a popup menu in the correct position, even if the top-level page repositions |
6416 // its out-of-process iframe. This verifies that screen positioning information | 6463 // its out-of-process iframe. This verifies that screen positioning information |
6417 // is propagating down the frame tree correctly. | 6464 // is propagating down the frame tree correctly. |
6418 #if defined(OS_ANDROID) | 6465 #if defined(OS_ANDROID) |
6419 // Surface-based hit testing and coordinate translation is not yet avaiable on | 6466 // Surface-based hit testing and coordinate translation is not yet avaiable on |
6420 // Android. | 6467 // Android. |
6421 #define MAYBE_NestedPopupMenuTest DISABLED_NestedPopupMenuTest | 6468 #define MAYBE_NestedPopupMenuTest DISABLED_NestedPopupMenuTest |
(...skipping 3526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9948 names.insert(root->children[0]->frame_entry->frame_unique_name()); | 9995 names.insert(root->children[0]->frame_entry->frame_unique_name()); |
9949 } | 9996 } |
9950 | 9997 |
9951 // More than one entry in the set means that the subframe frame navigation | 9998 // More than one entry in the set means that the subframe frame navigation |
9952 // entries didn't have a consistent unique name. This will break history | 9999 // entries didn't have a consistent unique name. This will break history |
9953 // navigations =( | 10000 // navigations =( |
9954 EXPECT_THAT(names, SizeIs(1)) << "Mismatched names for subframe!"; | 10001 EXPECT_THAT(names, SizeIs(1)) << "Mismatched names for subframe!"; |
9955 } | 10002 } |
9956 | 10003 |
9957 } // namespace content | 10004 } // namespace content |
OLD | NEW |