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 7525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7536 EXPECT_EQ(0, child_count); | 7536 EXPECT_EQ(0, child_count); |
7537 | 7537 |
7538 EXPECT_EQ( | 7538 EXPECT_EQ( |
7539 " Site A ------------ proxies for B\n" | 7539 " Site A ------------ proxies for B\n" |
7540 " +--Site B ------- proxies for A\n" | 7540 " +--Site B ------- proxies for A\n" |
7541 "Where A = http://a.com/\n" | 7541 "Where A = http://a.com/\n" |
7542 " B = http://b.com/", | 7542 " B = http://b.com/", |
7543 DepictFrameTree(root)); | 7543 DepictFrameTree(root)); |
7544 } | 7544 } |
7545 | 7545 |
7546 // Helper filter class to wait for a ShowView or ShowWidget message, record the | 7546 // Helper filter class to wait for a ShowCreatedWindow or ShowWidget message, |
7547 // routing ID from the message, and then drop the message. | 7547 // record the routing ID from the message, and then drop the message. |
| 7548 const uint32_t kMessageClasses[] = {ViewMsgStart, FrameMsgStart}; |
7548 class PendingWidgetMessageFilter : public BrowserMessageFilter { | 7549 class PendingWidgetMessageFilter : public BrowserMessageFilter { |
7549 public: | 7550 public: |
7550 PendingWidgetMessageFilter() | 7551 PendingWidgetMessageFilter() |
7551 : BrowserMessageFilter(ViewMsgStart), | 7552 : BrowserMessageFilter(kMessageClasses, arraysize(kMessageClasses)), |
7552 routing_id_(MSG_ROUTING_NONE), | 7553 routing_id_(MSG_ROUTING_NONE), |
7553 message_loop_runner_(new MessageLoopRunner) {} | 7554 message_loop_runner_(new MessageLoopRunner) {} |
7554 | 7555 |
7555 bool OnMessageReceived(const IPC::Message& message) override { | 7556 bool OnMessageReceived(const IPC::Message& message) override { |
7556 bool handled = true; | 7557 bool handled = true; |
7557 IPC_BEGIN_MESSAGE_MAP(PendingWidgetMessageFilter, message) | 7558 IPC_BEGIN_MESSAGE_MAP(PendingWidgetMessageFilter, message) |
7558 IPC_MESSAGE_HANDLER(ViewHostMsg_ShowView, OnShowView) | 7559 IPC_MESSAGE_HANDLER(FrameHostMsg_ShowCreatedWindow, OnShowCreatedWindow) |
7559 IPC_MESSAGE_HANDLER(ViewHostMsg_ShowWidget, OnShowWidget) | 7560 IPC_MESSAGE_HANDLER(ViewHostMsg_ShowWidget, OnShowWidget) |
7560 IPC_MESSAGE_UNHANDLED(handled = false) | 7561 IPC_MESSAGE_UNHANDLED(handled = false) |
7561 IPC_END_MESSAGE_MAP() | 7562 IPC_END_MESSAGE_MAP() |
7562 return handled; | 7563 return handled; |
7563 } | 7564 } |
7564 | 7565 |
7565 void Wait() { | 7566 void Wait() { |
7566 message_loop_runner_->Run(); | 7567 message_loop_runner_->Run(); |
7567 } | 7568 } |
7568 | 7569 |
7569 int routing_id() { return routing_id_; } | 7570 int routing_id() { return routing_id_; } |
7570 | 7571 |
7571 private: | 7572 private: |
7572 ~PendingWidgetMessageFilter() override {} | 7573 ~PendingWidgetMessageFilter() override {} |
7573 | 7574 |
7574 void OnShowView(int routing_id, | 7575 void OnShowCreatedWindow(int pending_widget_routing_id, |
7575 WindowOpenDisposition disposition, | 7576 WindowOpenDisposition disposition, |
7576 const gfx::Rect& initial_rect, | 7577 const gfx::Rect& initial_rect, |
7577 bool user_gesture) { | 7578 bool user_gesture) { |
7578 content::BrowserThread::PostTask( | 7579 content::BrowserThread::PostTask( |
7579 content::BrowserThread::UI, FROM_HERE, | 7580 content::BrowserThread::UI, FROM_HERE, |
7580 base::Bind(&PendingWidgetMessageFilter::OnReceivedRoutingIDOnUI, this, | 7581 base::Bind(&PendingWidgetMessageFilter::OnReceivedRoutingIDOnUI, this, |
7581 routing_id)); | 7582 pending_widget_routing_id)); |
7582 } | 7583 } |
7583 | 7584 |
7584 void OnShowWidget(int routing_id, const gfx::Rect& initial_rect) { | 7585 void OnShowWidget(int routing_id, const gfx::Rect& initial_rect) { |
7585 content::BrowserThread::PostTask( | 7586 content::BrowserThread::PostTask( |
7586 content::BrowserThread::UI, FROM_HERE, | 7587 content::BrowserThread::UI, FROM_HERE, |
7587 base::Bind(&PendingWidgetMessageFilter::OnReceivedRoutingIDOnUI, this, | 7588 base::Bind(&PendingWidgetMessageFilter::OnReceivedRoutingIDOnUI, this, |
7588 routing_id)); | 7589 routing_id)); |
7589 } | 7590 } |
7590 | 7591 |
7591 void OnReceivedRoutingIDOnUI(int routing_id) { | 7592 void OnReceivedRoutingIDOnUI(int widget_routing_id) { |
7592 routing_id_ = routing_id; | 7593 routing_id_ = widget_routing_id; |
7593 message_loop_runner_->Quit(); | 7594 message_loop_runner_->Quit(); |
7594 } | 7595 } |
7595 | 7596 |
7596 int routing_id_; | 7597 int routing_id_; |
7597 scoped_refptr<MessageLoopRunner> message_loop_runner_; | 7598 scoped_refptr<MessageLoopRunner> message_loop_runner_; |
7598 | 7599 |
7599 DISALLOW_COPY_AND_ASSIGN(PendingWidgetMessageFilter); | 7600 DISALLOW_COPY_AND_ASSIGN(PendingWidgetMessageFilter); |
7600 }; | 7601 }; |
7601 | 7602 |
7602 // Test for https://crbug.com/612276. Simultaneously open two new windows from | 7603 // Test for https://crbug.com/612276. Simultaneously open two new windows from |
(...skipping 11 matching lines...) Expand all Loading... |
7614 "a.com", "/cross_site_iframe_factory.html?a(b,c)")); | 7615 "a.com", "/cross_site_iframe_factory.html?a(b,c)")); |
7615 EXPECT_TRUE(NavigateToURL(shell(), main_url)); | 7616 EXPECT_TRUE(NavigateToURL(shell(), main_url)); |
7616 | 7617 |
7617 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); | 7618 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); |
7618 FrameTreeNode* child1 = root->child_at(0); | 7619 FrameTreeNode* child1 = root->child_at(0); |
7619 FrameTreeNode* child2 = root->child_at(1); | 7620 FrameTreeNode* child2 = root->child_at(1); |
7620 RenderProcessHost* process1 = child1->current_frame_host()->GetProcess(); | 7621 RenderProcessHost* process1 = child1->current_frame_host()->GetProcess(); |
7621 RenderProcessHost* process2 = child2->current_frame_host()->GetProcess(); | 7622 RenderProcessHost* process2 = child2->current_frame_host()->GetProcess(); |
7622 | 7623 |
7623 // Call window.open simultaneously in both subframes to create two popups. | 7624 // Call window.open simultaneously in both subframes to create two popups. |
7624 // Wait for and then drop both ViewHostMsg_ShowView messages. This will | 7625 // Wait for and then drop both FrameHostMsg_ShowCreatedWindow messages. This |
7625 // ensure that both CreateNewWindow calls happen before either | 7626 // will ensure that both CreateNewWindow calls happen before either |
7626 // ShowCreatedWindow call. | 7627 // ShowCreatedWindow call. |
7627 scoped_refptr<PendingWidgetMessageFilter> filter1 = | 7628 scoped_refptr<PendingWidgetMessageFilter> filter1 = |
7628 new PendingWidgetMessageFilter(); | 7629 new PendingWidgetMessageFilter(); |
7629 process1->AddFilter(filter1.get()); | 7630 process1->AddFilter(filter1.get()); |
7630 EXPECT_TRUE(ExecuteScript(child1, "window.open();")); | 7631 EXPECT_TRUE(ExecuteScript(child1, "window.open();")); |
7631 filter1->Wait(); | 7632 filter1->Wait(); |
7632 | 7633 |
7633 scoped_refptr<PendingWidgetMessageFilter> filter2 = | 7634 scoped_refptr<PendingWidgetMessageFilter> filter2 = |
7634 new PendingWidgetMessageFilter(); | 7635 new PendingWidgetMessageFilter(); |
7635 process2->AddFilter(filter2.get()); | 7636 process2->AddFilter(filter2.get()); |
7636 EXPECT_TRUE(ExecuteScript(child2, "window.open();")); | 7637 EXPECT_TRUE(ExecuteScript(child2, "window.open();")); |
7637 filter2->Wait(); | 7638 filter2->Wait(); |
7638 | 7639 |
7639 // At this point, we should have two pending WebContents. | 7640 // At this point, we should have two pending WebContents. |
7640 EXPECT_TRUE(base::ContainsKey( | 7641 EXPECT_TRUE(base::ContainsKey( |
7641 web_contents()->pending_contents_, | 7642 web_contents()->pending_contents_, |
7642 std::make_pair(process1->GetID(), filter1->routing_id()))); | 7643 std::make_pair(process1->GetID(), filter1->routing_id()))); |
7643 EXPECT_TRUE(base::ContainsKey( | 7644 EXPECT_TRUE(base::ContainsKey( |
7644 web_contents()->pending_contents_, | 7645 web_contents()->pending_contents_, |
7645 std::make_pair(process2->GetID(), filter2->routing_id()))); | 7646 std::make_pair(process2->GetID(), filter2->routing_id()))); |
7646 | 7647 |
7647 // Both subframes were set up in the same way, so the next routing ID for the | 7648 // Both subframes were set up in the same way, so the next routing ID for the |
7648 // new popup windows should match up (this led to the collision in the | 7649 // new popup windows should match up (this led to the collision in the |
7649 // pending contents map in the original bug). | 7650 // pending contents map in the original bug). |
7650 EXPECT_EQ(filter1->routing_id(), filter2->routing_id()); | 7651 EXPECT_EQ(filter1->routing_id(), filter2->routing_id()); |
7651 | 7652 |
7652 // Now, simulate that both ShowView messages arrive by showing both of the | 7653 // Now, simulate that both FrameHostMsg_ShowCreatedWindow messages arrive by |
7653 // pending WebContents. | 7654 // showing both of the pending WebContents. |
7654 web_contents()->ShowCreatedWindow(process1->GetID(), filter1->routing_id(), | 7655 web_contents()->ShowCreatedWindow(process1->GetID(), filter1->routing_id(), |
7655 WindowOpenDisposition::NEW_FOREGROUND_TAB, | 7656 WindowOpenDisposition::NEW_FOREGROUND_TAB, |
7656 gfx::Rect(), true); | 7657 gfx::Rect(), true); |
7657 web_contents()->ShowCreatedWindow(process2->GetID(), filter2->routing_id(), | 7658 web_contents()->ShowCreatedWindow(process2->GetID(), filter2->routing_id(), |
7658 WindowOpenDisposition::NEW_FOREGROUND_TAB, | 7659 WindowOpenDisposition::NEW_FOREGROUND_TAB, |
7659 gfx::Rect(), true); | 7660 gfx::Rect(), true); |
7660 | 7661 |
7661 // Verify that both shells were properly created. | 7662 // Verify that both shells were properly created. |
7662 EXPECT_EQ(3u, Shell::windows().size()); | 7663 EXPECT_EQ(3u, Shell::windows().size()); |
7663 } | 7664 } |
(...skipping 1326 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8990 rfh->OnSwappedOut(); | 8991 rfh->OnSwappedOut(); |
8991 | 8992 |
8992 // Wait for the new a.com navigation to finish. | 8993 // Wait for the new a.com navigation to finish. |
8993 back_observer.Wait(); | 8994 back_observer.Wait(); |
8994 | 8995 |
8995 // The RVH for a.com should've been reused, and it should be active. | 8996 // The RVH for a.com should've been reused, and it should be active. |
8996 EXPECT_TRUE(rvh->is_active()); | 8997 EXPECT_TRUE(rvh->is_active()); |
8997 } | 8998 } |
8998 | 8999 |
8999 } // namespace content | 9000 } // namespace content |
OLD | NEW |