Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(247)

Side by Side Diff: content/browser/site_per_process_browsertest.cc

Issue 2052633002: Extend the ToRenderFrameHost magic to FrameTreeNode* and Shell* (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix induced script bug. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 // when it receives a reply. 84 // when it receives a reply.
85 void PostMessageAndWaitForReply(FrameTreeNode* sender_ftn, 85 void PostMessageAndWaitForReply(FrameTreeNode* sender_ftn,
86 const std::string& post_message_script, 86 const std::string& post_message_script,
87 const std::string& reply_status) { 87 const std::string& reply_status) {
88 // Subtle: msg_queue needs to be declared before the ExecuteScript below, or 88 // Subtle: msg_queue needs to be declared before the ExecuteScript below, or
89 // else it might miss the message of interest. See https://crbug.com/518729. 89 // else it might miss the message of interest. See https://crbug.com/518729.
90 DOMMessageQueue msg_queue; 90 DOMMessageQueue msg_queue;
91 91
92 bool success = false; 92 bool success = false;
93 EXPECT_TRUE(ExecuteScriptAndExtractBool( 93 EXPECT_TRUE(ExecuteScriptAndExtractBool(
94 sender_ftn->current_frame_host(), 94 sender_ftn,
95 "window.domAutomationController.send(" + post_message_script + ");", 95 "window.domAutomationController.send(" + post_message_script + ");",
96 &success)); 96 &success));
97 EXPECT_TRUE(success); 97 EXPECT_TRUE(success);
98 98
99 std::string status; 99 std::string status;
100 while (msg_queue.WaitForMessage(&status)) { 100 while (msg_queue.WaitForMessage(&status)) {
101 if (status == reply_status) 101 if (status == reply_status)
102 break; 102 break;
103 } 103 }
104 } 104 }
105 105
106 // Helper function to extract and return "window.receivedMessages" from the 106 // Helper function to extract and return "window.receivedMessages" from the
107 // |sender_ftn| frame. This variable is used in post_message.html to count the 107 // |sender_ftn| frame. This variable is used in post_message.html to count the
108 // number of messages received via postMessage by the current window. 108 // number of messages received via postMessage by the current window.
109 int GetReceivedMessages(FrameTreeNode* ftn) { 109 int GetReceivedMessages(FrameTreeNode* ftn) {
110 int received_messages = 0; 110 int received_messages = 0;
111 EXPECT_TRUE(ExecuteScriptAndExtractInt( 111 EXPECT_TRUE(ExecuteScriptAndExtractInt(
112 ftn->current_frame_host(), 112 ftn, "window.domAutomationController.send(window.receivedMessages);",
113 "window.domAutomationController.send(window.receivedMessages);",
114 &received_messages)); 113 &received_messages));
115 return received_messages; 114 return received_messages;
116 } 115 }
117 116
118 // Helper function to perform a window.open from the |caller_frame| targeting a 117 // Helper function to perform a window.open from the |caller_frame| targeting a
119 // frame with the specified name. 118 // frame with the specified name.
120 void NavigateNamedFrame(const ToRenderFrameHost& caller_frame, 119 void NavigateNamedFrame(const ToRenderFrameHost& caller_frame,
121 const GURL& url, 120 const GURL& url,
122 const std::string& name) { 121 const std::string& name) {
123 bool success = false; 122 bool success = false;
(...skipping 14 matching lines...) Expand all
138 mouse_event.button = blink::WebPointerProperties::ButtonLeft; 137 mouse_event.button = blink::WebPointerProperties::ButtonLeft;
139 mouse_event.x = x; 138 mouse_event.x = x;
140 mouse_event.y = y; 139 mouse_event.y = y;
141 rwh->ForwardMouseEvent(mouse_event); 140 rwh->ForwardMouseEvent(mouse_event);
142 } 141 }
143 142
144 // Retrieve document.origin for the frame |ftn|. 143 // Retrieve document.origin for the frame |ftn|.
145 std::string GetDocumentOrigin(FrameTreeNode* ftn) { 144 std::string GetDocumentOrigin(FrameTreeNode* ftn) {
146 std::string origin; 145 std::string origin;
147 EXPECT_TRUE(ExecuteScriptAndExtractString( 146 EXPECT_TRUE(ExecuteScriptAndExtractString(
148 ftn->current_frame_host(), 147 ftn, "domAutomationController.send(document.origin)", &origin));
149 "domAutomationController.send(document.origin)", &origin));
150 return origin; 148 return origin;
151 } 149 }
152 150
153 class RenderWidgetHostMouseEventMonitor { 151 class RenderWidgetHostMouseEventMonitor {
154 public: 152 public:
155 explicit RenderWidgetHostMouseEventMonitor(RenderWidgetHost* host) 153 explicit RenderWidgetHostMouseEventMonitor(RenderWidgetHost* host)
156 : host_(host), event_received_(false) { 154 : host_(host), event_received_(false) {
157 host_->AddMouseEventCallback( 155 host_->AddMouseEventCallback(
158 base::Bind(&RenderWidgetHostMouseEventMonitor::MouseEventCallback, 156 base::Bind(&RenderWidgetHostMouseEventMonitor::MouseEventCallback,
159 base::Unretained(this))); 157 base::Unretained(this)));
(...skipping 1132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1292 ->GetProcess() 1290 ->GetProcess()
1293 ->GetID(); 1291 ->GetID();
1294 int subframe_rvh_id = root->child_at(0) 1292 int subframe_rvh_id = root->child_at(0)
1295 ->current_frame_host() 1293 ->current_frame_host()
1296 ->render_view_host() 1294 ->render_view_host()
1297 ->GetRoutingID(); 1295 ->GetRoutingID();
1298 EXPECT_TRUE(RenderViewHost::FromID(subframe_process_id, subframe_rvh_id)); 1296 EXPECT_TRUE(RenderViewHost::FromID(subframe_process_id, subframe_rvh_id));
1299 1297
1300 // Use Javascript in the parent to remove one of the frames and ensure that 1298 // Use Javascript in the parent to remove one of the frames and ensure that
1301 // the subframe goes away. 1299 // the subframe goes away.
1302 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), 1300 EXPECT_TRUE(ExecuteScript(shell(),
1303 "document.body.removeChild(" 1301 "document.body.removeChild("
1304 "document.querySelectorAll('iframe')[0])")); 1302 "document.querySelectorAll('iframe')[0])"));
1305 ASSERT_EQ(1U, root->child_count()); 1303 ASSERT_EQ(1U, root->child_count());
1306 1304
1307 // Load a new same-site page in the top-level frame and ensure the other 1305 // Load a new same-site page in the top-level frame and ensure the other
1308 // subframe goes away. 1306 // subframe goes away.
1309 GURL new_url(embedded_test_server()->GetURL("a.com", "/title1.html")); 1307 GURL new_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
1310 NavigateToURL(shell(), new_url); 1308 NavigateToURL(shell(), new_url);
1311 ASSERT_EQ(0U, root->child_count()); 1309 ASSERT_EQ(0U, root->child_count());
1312 1310
(...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after
1554 " D = http://f00.com/", 1552 " D = http://f00.com/",
1555 DepictFrameTree(root)); 1553 DepictFrameTree(root));
1556 1554
1557 // Navigate the iframe itself to about:blank using a script executing in its 1555 // Navigate the iframe itself to about:blank using a script executing in its
1558 // own context. It should stay in the same SiteInstance as before, not the 1556 // own context. It should stay in the same SiteInstance as before, not the
1559 // parent one. 1557 // parent one.
1560 std::string script( 1558 std::string script(
1561 "window.domAutomationController.send(" 1559 "window.domAutomationController.send("
1562 "window.location.href = 'about:blank');"); 1560 "window.location.href = 'about:blank');");
1563 TestFrameNavigationObserver frame_observer(child); 1561 TestFrameNavigationObserver frame_observer(child);
1564 EXPECT_TRUE(ExecuteScript(child->current_frame_host(), script)); 1562 EXPECT_TRUE(ExecuteScript(child, script));
1565 frame_observer.Wait(); 1563 frame_observer.Wait();
1566 EXPECT_EQ(about_blank_url, child->current_url()); 1564 EXPECT_EQ(about_blank_url, child->current_url());
1567 1565
1568 // Ensure that we have navigated using the top level process. 1566 // Ensure that we have navigated using the top level process.
1569 EXPECT_EQ( 1567 EXPECT_EQ(
1570 " Site A ------------ proxies for D\n" 1568 " Site A ------------ proxies for D\n"
1571 " |--Site D ------- proxies for A\n" 1569 " |--Site D ------- proxies for A\n"
1572 " +--Site A ------- proxies for D\n" 1570 " +--Site A ------- proxies for D\n"
1573 " +--Site A -- proxies for D\n" 1571 " +--Site A -- proxies for D\n"
1574 "Where A = http://a.com/\n" 1572 "Where A = http://a.com/\n"
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
1975 RenderProcessHost* child_process = 1973 RenderProcessHost* child_process =
1976 root->child_at(0)->current_frame_host()->GetProcess(); 1974 root->child_at(0)->current_frame_host()->GetProcess();
1977 RenderProcessHostWatcher crash_observer( 1975 RenderProcessHostWatcher crash_observer(
1978 child_process, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT); 1976 child_process, RenderProcessHostWatcher::WATCH_FOR_PROCESS_EXIT);
1979 child_process->Shutdown(0, false); 1977 child_process->Shutdown(0, false);
1980 crash_observer.Wait(); 1978 crash_observer.Wait();
1981 1979
1982 // Add a new child frame to the third subframe. 1980 // Add a new child frame to the third subframe.
1983 RenderFrameHostCreatedObserver frame_observer(shell()->web_contents(), 1); 1981 RenderFrameHostCreatedObserver frame_observer(shell()->web_contents(), 1);
1984 EXPECT_TRUE(ExecuteScript( 1982 EXPECT_TRUE(ExecuteScript(
1985 root->child_at(2)->current_frame_host(), 1983 root->child_at(2),
1986 "document.body.appendChild(document.createElement('iframe'));")); 1984 "document.body.appendChild(document.createElement('iframe'));"));
1987 frame_observer.Wait(); 1985 frame_observer.Wait();
1988 1986
1989 // The new frame should have a RenderFrameProxyHost for B, but it should not 1987 // The new frame should have a RenderFrameProxyHost for B, but it should not
1990 // be alive, and B should still not have a process (verified by last line of 1988 // be alive, and B should still not have a process (verified by last line of
1991 // expected DepictFrameTree output). 1989 // expected DepictFrameTree output).
1992 EXPECT_EQ( 1990 EXPECT_EQ(
1993 " Site A ------------ proxies for B\n" 1991 " Site A ------------ proxies for B\n"
1994 " |--Site B ------- proxies for A\n" 1992 " |--Site B ------- proxies for A\n"
1995 " |--Site A ------- proxies for B\n" 1993 " |--Site A ------- proxies for B\n"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2031 CreateChildFrameAfterKillingOpener) { 2029 CreateChildFrameAfterKillingOpener) {
2032 GURL main_url(embedded_test_server()->GetURL("a.com", "/title1.html")); 2030 GURL main_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
2033 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 2031 EXPECT_TRUE(NavigateToURL(shell(), main_url));
2034 2032
2035 // It is safe to obtain the root frame tree node here, as it doesn't change. 2033 // It is safe to obtain the root frame tree node here, as it doesn't change.
2036 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 2034 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
2037 SiteInstance* site_instance_a = root->current_frame_host()->GetSiteInstance(); 2035 SiteInstance* site_instance_a = root->current_frame_host()->GetSiteInstance();
2038 2036
2039 // Open a popup and navigate it cross-process to b.com. 2037 // Open a popup and navigate it cross-process to b.com.
2040 ShellAddedObserver new_shell_observer; 2038 ShellAddedObserver new_shell_observer;
2041 EXPECT_TRUE(ExecuteScript(root->current_frame_host(), 2039 EXPECT_TRUE(ExecuteScript(root, "popup = window.open('about:blank');"));
2042 "popup = window.open('about:blank');"));
2043 Shell* popup = new_shell_observer.GetShell(); 2040 Shell* popup = new_shell_observer.GetShell();
2044 GURL popup_url(embedded_test_server()->GetURL("b.com", "/title2.html")); 2041 GURL popup_url(embedded_test_server()->GetURL("b.com", "/title2.html"));
2045 EXPECT_TRUE(NavigateToURL(popup, popup_url)); 2042 EXPECT_TRUE(NavigateToURL(popup, popup_url));
2046 2043
2047 // Verify that each top-level frame has proxies in the other's SiteInstance. 2044 // Verify that each top-level frame has proxies in the other's SiteInstance.
2048 FrameTreeNode* popup_root = 2045 FrameTreeNode* popup_root =
2049 static_cast<WebContentsImpl*>(popup->web_contents()) 2046 static_cast<WebContentsImpl*>(popup->web_contents())
2050 ->GetFrameTree() 2047 ->GetFrameTree()
2051 ->root(); 2048 ->root();
2052 EXPECT_EQ( 2049 EXPECT_EQ(
(...skipping 25 matching lines...) Expand all
2078 EXPECT_TRUE(root->current_frame_host()->IsRenderFrameLive()); 2075 EXPECT_TRUE(root->current_frame_host()->IsRenderFrameLive());
2079 2076
2080 // The popup's proxy in a.com should still not be live. Re-navigating the 2077 // The popup's proxy in a.com should still not be live. Re-navigating the
2081 // main window to a.com doesn't reinitialize a.com proxies for popups 2078 // main window to a.com doesn't reinitialize a.com proxies for popups
2082 // previously opened from the main window. 2079 // previously opened from the main window.
2083 EXPECT_FALSE(rfph->is_render_frame_proxy_live()); 2080 EXPECT_FALSE(rfph->is_render_frame_proxy_live());
2084 2081
2085 // Add a new child frame on the popup. 2082 // Add a new child frame on the popup.
2086 RenderFrameHostCreatedObserver frame_observer(popup->web_contents(), 1); 2083 RenderFrameHostCreatedObserver frame_observer(popup->web_contents(), 1);
2087 EXPECT_TRUE(ExecuteScript( 2084 EXPECT_TRUE(ExecuteScript(
2088 popup->web_contents(), 2085 popup, "document.body.appendChild(document.createElement('iframe'));"));
2089 "document.body.appendChild(document.createElement('iframe'));"));
2090 frame_observer.Wait(); 2086 frame_observer.Wait();
2091 2087
2092 // Both the child frame's and its parent's proxies should still not be live. 2088 // Both the child frame's and its parent's proxies should still not be live.
2093 // The main page can't reach them since it lost reference to the popup after 2089 // The main page can't reach them since it lost reference to the popup after
2094 // it crashed, so there is no need to create them. 2090 // it crashed, so there is no need to create them.
2095 EXPECT_FALSE(rfph->is_render_frame_proxy_live()); 2091 EXPECT_FALSE(rfph->is_render_frame_proxy_live());
2096 RenderFrameProxyHost* child_rfph = 2092 RenderFrameProxyHost* child_rfph =
2097 popup_root->child_at(0)->render_manager()->GetRenderFrameProxyHost( 2093 popup_root->child_at(0)->render_manager()->GetRenderFrameProxyHost(
2098 site_instance_a); 2094 site_instance_a);
2099 EXPECT_TRUE(child_rfph); 2095 EXPECT_TRUE(child_rfph);
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after
2261 2257
2262 EXPECT_EQ( 2258 EXPECT_EQ(
2263 " Site A ------------ proxies for B\n" 2259 " Site A ------------ proxies for B\n"
2264 " +--Site B ------- proxies for A\n" 2260 " +--Site B ------- proxies for A\n"
2265 "Where A = http://b.com/\n" 2261 "Where A = http://b.com/\n"
2266 " B = http://baz.com/", 2262 " B = http://baz.com/",
2267 DepictFrameTree(root)); 2263 DepictFrameTree(root));
2268 2264
2269 // Add a new child frame to the top-level frame. 2265 // Add a new child frame to the top-level frame.
2270 RenderFrameHostCreatedObserver frame_observer(shell()->web_contents(), 1); 2266 RenderFrameHostCreatedObserver frame_observer(shell()->web_contents(), 1);
2271 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), 2267 EXPECT_TRUE(ExecuteScript(shell(), "addFrame('data:text/html,foo');"));
2272 "window.domAutomationController.send("
2273 " addFrame('data:text/html,foo'));"));
2274 frame_observer.Wait(); 2268 frame_observer.Wait();
2275 2269
2276 // The new frame should have a proxy in Site B, for use by the old frame. 2270 // The new frame should have a proxy in Site B, for use by the old frame.
2277 EXPECT_EQ( 2271 EXPECT_EQ(
2278 " Site A ------------ proxies for B\n" 2272 " Site A ------------ proxies for B\n"
2279 " |--Site B ------- proxies for A\n" 2273 " |--Site B ------- proxies for A\n"
2280 " +--Site A ------- proxies for B\n" 2274 " +--Site A ------- proxies for B\n"
2281 "Where A = http://b.com/\n" 2275 "Where A = http://b.com/\n"
2282 " B = http://baz.com/", 2276 " B = http://baz.com/",
2283 DepictFrameTree(root)); 2277 DepictFrameTree(root));
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after
2714 " Site A ------------ proxies for B\n" 2708 " Site A ------------ proxies for B\n"
2715 " +--Site B ------- proxies for A\n" 2709 " +--Site B ------- proxies for A\n"
2716 "Where A = http://a.com/\n" 2710 "Where A = http://a.com/\n"
2717 " B = http://b.com/", 2711 " B = http://b.com/",
2718 DepictFrameTree(root)); 2712 DepictFrameTree(root));
2719 2713
2720 FrameTreeNode* child = root->child_at(0); 2714 FrameTreeNode* child = root->child_at(0);
2721 2715
2722 std::string margin_width; 2716 std::string margin_width;
2723 EXPECT_TRUE(ExecuteScriptAndExtractString( 2717 EXPECT_TRUE(ExecuteScriptAndExtractString(
2724 child->current_frame_host(), 2718 child,
2725 "window.domAutomationController.send(" 2719 "window.domAutomationController.send("
2726 "document.body.getAttribute('marginwidth'));", 2720 "document.body.getAttribute('marginwidth'));",
2727 &margin_width)); 2721 &margin_width));
2728 EXPECT_EQ("10", margin_width); 2722 EXPECT_EQ("10", margin_width);
2729 2723
2730 std::string margin_height; 2724 std::string margin_height;
2731 EXPECT_TRUE(ExecuteScriptAndExtractString( 2725 EXPECT_TRUE(ExecuteScriptAndExtractString(
2732 child->current_frame_host(), 2726 child,
2733 "window.domAutomationController.send(" 2727 "window.domAutomationController.send("
2734 "document.body.getAttribute('marginheight'));", 2728 "document.body.getAttribute('marginheight'));",
2735 &margin_height)); 2729 &margin_height));
2736 EXPECT_EQ("50", margin_height); 2730 EXPECT_EQ("50", margin_height);
2737 2731
2738 // Run the test over variety of parent/child cases. 2732 // Run the test over variety of parent/child cases.
2739 GURL urls[] = { 2733 GURL urls[] = {
2740 // Remote to remote. 2734 // Remote to remote.
2741 embedded_test_server()->GetURL("c.com", "/title2.html"), 2735 embedded_test_server()->GetURL("c.com", "/title2.html"),
2742 // Remote to local. 2736 // Remote to local.
2743 embedded_test_server()->GetURL("a.com", "/title1.html"), 2737 embedded_test_server()->GetURL("a.com", "/title1.html"),
2744 // Local to remote. 2738 // Local to remote.
2745 embedded_test_server()->GetURL("b.com", "/title2.html") 2739 embedded_test_server()->GetURL("b.com", "/title2.html")
2746 }; 2740 };
2747 2741
2748 int current_margin_width = 15; 2742 int current_margin_width = 15;
2749 int current_margin_height = 25; 2743 int current_margin_height = 25;
2750 2744
2751 // Before each navigation, we change the marginwidth and marginheight 2745 // Before each navigation, we change the marginwidth and marginheight
2752 // properties of the frame. We then check whether those properties are applied 2746 // properties of the frame. We then check whether those properties are applied
2753 // correctly after the navigation has completed. 2747 // correctly after the navigation has completed.
2754 for (size_t i = 0; i < arraysize(urls); ++i) { 2748 for (size_t i = 0; i < arraysize(urls); ++i) {
2755 // Change marginwidth and marginheight before navigating. 2749 // Change marginwidth and marginheight before navigating.
2756 EXPECT_TRUE(ExecuteScript( 2750 EXPECT_TRUE(ExecuteScript(
2757 root->current_frame_host(), 2751 root,
2758 base::StringPrintf( 2752 base::StringPrintf("document.getElementById('child-1').setAttribute("
2759 "document.getElementById('child-1').setAttribute(" 2753 " 'marginwidth', '%d');",
2760 " 'marginwidth', '%d');", current_margin_width))); 2754 current_margin_width)));
2761 EXPECT_TRUE(ExecuteScript( 2755 EXPECT_TRUE(ExecuteScript(
2762 root->current_frame_host(), 2756 root,
2763 base::StringPrintf( 2757 base::StringPrintf("document.getElementById('child-1').setAttribute("
2764 "document.getElementById('child-1').setAttribute(" 2758 " 'marginheight', '%d');",
2765 " 'marginheight', '%d');", current_margin_height))); 2759 current_margin_height)));
2766 2760
2767 NavigateFrameToURL(child, urls[i]); 2761 NavigateFrameToURL(child, urls[i]);
2768 2762
2769 std::string actual_margin_width; 2763 std::string actual_margin_width;
2770 EXPECT_TRUE(ExecuteScriptAndExtractString( 2764 EXPECT_TRUE(ExecuteScriptAndExtractString(
2771 child->current_frame_host(), 2765 child,
2772 "window.domAutomationController.send(" 2766 "window.domAutomationController.send("
2773 "document.body.getAttribute('marginwidth'));", 2767 "document.body.getAttribute('marginwidth'));",
2774 &actual_margin_width)); 2768 &actual_margin_width));
2775 EXPECT_EQ(base::IntToString(current_margin_width), actual_margin_width); 2769 EXPECT_EQ(base::IntToString(current_margin_width), actual_margin_width);
2776 2770
2777 std::string actual_margin_height; 2771 std::string actual_margin_height;
2778 EXPECT_TRUE(ExecuteScriptAndExtractString( 2772 EXPECT_TRUE(ExecuteScriptAndExtractString(
2779 child->current_frame_host(), 2773 child,
2780 "window.domAutomationController.send(" 2774 "window.domAutomationController.send("
2781 "document.body.getAttribute('marginheight'));", 2775 "document.body.getAttribute('marginheight'));",
2782 &actual_margin_height)); 2776 &actual_margin_height));
2783 EXPECT_EQ(base::IntToString(current_margin_height), actual_margin_height); 2777 EXPECT_EQ(base::IntToString(current_margin_height), actual_margin_height);
2784 2778
2785 current_margin_width += 5; 2779 current_margin_width += 5;
2786 current_margin_height += 10; 2780 current_margin_height += 10;
2787 } 2781 }
2788 } 2782 }
2789 2783
(...skipping 24 matching lines...) Expand all
2814 FrameTreeNode* tiptop_child = root->child_at(0); 2808 FrameTreeNode* tiptop_child = root->child_at(0);
2815 FrameTreeNode* middle_child = root->child_at(0)->child_at(0); 2809 FrameTreeNode* middle_child = root->child_at(0)->child_at(0);
2816 FrameTreeNode* lowest_child = root->child_at(0)->child_at(0)->child_at(0); 2810 FrameTreeNode* lowest_child = root->child_at(0)->child_at(0)->child_at(0);
2817 2811
2818 // Check that b.com frame's location.ancestorOrigins contains the correct 2812 // Check that b.com frame's location.ancestorOrigins contains the correct
2819 // origin for the parent. The origin should have been replicated as part of 2813 // origin for the parent. The origin should have been replicated as part of
2820 // the ViewMsg_New message that created the parent's RenderFrameProxy in 2814 // the ViewMsg_New message that created the parent's RenderFrameProxy in
2821 // b.com's process. 2815 // b.com's process.
2822 int ancestor_origins_length = 0; 2816 int ancestor_origins_length = 0;
2823 EXPECT_TRUE(ExecuteScriptAndExtractInt( 2817 EXPECT_TRUE(ExecuteScriptAndExtractInt(
2824 tiptop_child->current_frame_host(), 2818 tiptop_child,
2825 "window.domAutomationController.send(location.ancestorOrigins.length);", 2819 "window.domAutomationController.send(location.ancestorOrigins.length);",
2826 &ancestor_origins_length)); 2820 &ancestor_origins_length));
2827 EXPECT_EQ(1, ancestor_origins_length); 2821 EXPECT_EQ(1, ancestor_origins_length);
2828 std::string result; 2822 std::string result;
2829 EXPECT_TRUE(ExecuteScriptAndExtractString( 2823 EXPECT_TRUE(ExecuteScriptAndExtractString(
2830 tiptop_child->current_frame_host(), 2824 tiptop_child,
2831 "window.domAutomationController.send(location.ancestorOrigins[0]);", 2825 "window.domAutomationController.send(location.ancestorOrigins[0]);",
2832 &result)); 2826 &result));
2833 EXPECT_EQ(a_origin, result + "/"); 2827 EXPECT_EQ(a_origin, result + "/");
2834 2828
2835 // Check that c.com frame's location.ancestorOrigins contains the correct 2829 // Check that c.com frame's location.ancestorOrigins contains the correct
2836 // origin for its two ancestors. The topmost parent origin should be 2830 // origin for its two ancestors. The topmost parent origin should be
2837 // replicated as part of ViewMsg_New, and the middle frame (b.com's) origin 2831 // replicated as part of ViewMsg_New, and the middle frame (b.com's) origin
2838 // should be replicated as part of FrameMsg_NewFrameProxy sent for b.com's 2832 // should be replicated as part of FrameMsg_NewFrameProxy sent for b.com's
2839 // frame in c.com's process. 2833 // frame in c.com's process.
2840 EXPECT_TRUE(ExecuteScriptAndExtractInt( 2834 EXPECT_TRUE(ExecuteScriptAndExtractInt(
2841 middle_child->current_frame_host(), 2835 middle_child,
2842 "window.domAutomationController.send(location.ancestorOrigins.length);", 2836 "window.domAutomationController.send(location.ancestorOrigins.length);",
2843 &ancestor_origins_length)); 2837 &ancestor_origins_length));
2844 EXPECT_EQ(2, ancestor_origins_length); 2838 EXPECT_EQ(2, ancestor_origins_length);
2845 EXPECT_TRUE(ExecuteScriptAndExtractString( 2839 EXPECT_TRUE(ExecuteScriptAndExtractString(
2846 middle_child->current_frame_host(), 2840 middle_child,
2847 "window.domAutomationController.send(location.ancestorOrigins[0]);", 2841 "window.domAutomationController.send(location.ancestorOrigins[0]);",
2848 &result)); 2842 &result));
2849 EXPECT_EQ(b_origin, result + "/"); 2843 EXPECT_EQ(b_origin, result + "/");
2850 EXPECT_TRUE(ExecuteScriptAndExtractString( 2844 EXPECT_TRUE(ExecuteScriptAndExtractString(
2851 middle_child->current_frame_host(), 2845 middle_child,
2852 "window.domAutomationController.send(location.ancestorOrigins[1]);", 2846 "window.domAutomationController.send(location.ancestorOrigins[1]);",
2853 &result)); 2847 &result));
2854 EXPECT_EQ(a_origin, result + "/"); 2848 EXPECT_EQ(a_origin, result + "/");
2855 2849
2856 // Check that the nested a.com frame's location.ancestorOrigins contains the 2850 // Check that the nested a.com frame's location.ancestorOrigins contains the
2857 // correct origin for its three ancestors. 2851 // correct origin for its three ancestors.
2858 EXPECT_TRUE(ExecuteScriptAndExtractInt( 2852 EXPECT_TRUE(ExecuteScriptAndExtractInt(
2859 lowest_child->current_frame_host(), 2853 lowest_child,
2860 "window.domAutomationController.send(location.ancestorOrigins.length);", 2854 "window.domAutomationController.send(location.ancestorOrigins.length);",
2861 &ancestor_origins_length)); 2855 &ancestor_origins_length));
2862 EXPECT_EQ(3, ancestor_origins_length); 2856 EXPECT_EQ(3, ancestor_origins_length);
2863 EXPECT_TRUE(ExecuteScriptAndExtractString( 2857 EXPECT_TRUE(ExecuteScriptAndExtractString(
2864 lowest_child->current_frame_host(), 2858 lowest_child,
2865 "window.domAutomationController.send(location.ancestorOrigins[0]);", 2859 "window.domAutomationController.send(location.ancestorOrigins[0]);",
2866 &result)); 2860 &result));
2867 EXPECT_EQ(c_origin, result + "/"); 2861 EXPECT_EQ(c_origin, result + "/");
2868 EXPECT_TRUE(ExecuteScriptAndExtractString( 2862 EXPECT_TRUE(ExecuteScriptAndExtractString(
2869 lowest_child->current_frame_host(), 2863 lowest_child,
2870 "window.domAutomationController.send(location.ancestorOrigins[1]);", 2864 "window.domAutomationController.send(location.ancestorOrigins[1]);",
2871 &result)); 2865 &result));
2872 EXPECT_EQ(b_origin, result + "/"); 2866 EXPECT_EQ(b_origin, result + "/");
2873 EXPECT_TRUE(ExecuteScriptAndExtractString( 2867 EXPECT_TRUE(ExecuteScriptAndExtractString(
2874 lowest_child->current_frame_host(), 2868 lowest_child,
2875 "window.domAutomationController.send(location.ancestorOrigins[2]);", 2869 "window.domAutomationController.send(location.ancestorOrigins[2]);",
2876 &result)); 2870 &result));
2877 EXPECT_EQ(a_origin, result + "/"); 2871 EXPECT_EQ(a_origin, result + "/");
2878 } 2872 }
2879 2873
2880 // Check that iframe sandbox flags are replicated correctly. 2874 // Check that iframe sandbox flags are replicated correctly.
2881 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, SandboxFlagsReplication) { 2875 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, SandboxFlagsReplication) {
2882 GURL main_url(embedded_test_server()->GetURL("/sandboxed_frames.html")); 2876 GURL main_url(embedded_test_server()->GetURL("/sandboxed_frames.html"));
2883 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 2877 EXPECT_TRUE(NavigateToURL(shell(), main_url));
2884 2878
(...skipping 16 matching lines...) Expand all
2901 // Load cross-site page into subframe's subframe. 2895 // Load cross-site page into subframe's subframe.
2902 ASSERT_EQ(2U, root->child_at(1)->child_count()); 2896 ASSERT_EQ(2U, root->child_at(1)->child_count());
2903 GURL bar_url(embedded_test_server()->GetURL("bar.com", "/title1.html")); 2897 GURL bar_url(embedded_test_server()->GetURL("bar.com", "/title1.html"));
2904 NavigateFrameToURL(root->child_at(1)->child_at(0), bar_url); 2898 NavigateFrameToURL(root->child_at(1)->child_at(0), bar_url);
2905 EXPECT_TRUE(observer.last_navigation_succeeded()); 2899 EXPECT_TRUE(observer.last_navigation_succeeded());
2906 EXPECT_EQ(bar_url, observer.last_navigation_url()); 2900 EXPECT_EQ(bar_url, observer.last_navigation_url());
2907 2901
2908 // Opening a popup in the sandboxed foo.com iframe should fail. 2902 // Opening a popup in the sandboxed foo.com iframe should fail.
2909 bool success = false; 2903 bool success = false;
2910 EXPECT_TRUE( 2904 EXPECT_TRUE(
2911 ExecuteScriptAndExtractBool(root->child_at(1)->current_frame_host(), 2905 ExecuteScriptAndExtractBool(root->child_at(1),
2912 "window.domAutomationController.send(" 2906 "window.domAutomationController.send("
2913 "!window.open('data:text/html,dataurl'));", 2907 "!window.open('data:text/html,dataurl'));",
2914 &success)); 2908 &success));
2915 EXPECT_TRUE(success); 2909 EXPECT_TRUE(success);
2916 EXPECT_EQ(1u, Shell::windows().size()); 2910 EXPECT_EQ(1u, Shell::windows().size());
2917 2911
2918 // Opening a popup in a frame whose parent is sandboxed should also fail. 2912 // Opening a popup in a frame whose parent is sandboxed should also fail.
2919 // Here, bar.com frame's sandboxed parent frame is a remote frame in 2913 // Here, bar.com frame's sandboxed parent frame is a remote frame in
2920 // bar.com's process. 2914 // bar.com's process.
2921 success = false; 2915 success = false;
2922 EXPECT_TRUE(ExecuteScriptAndExtractBool( 2916 EXPECT_TRUE(
2923 root->child_at(1)->child_at(0)->current_frame_host(), 2917 ExecuteScriptAndExtractBool(root->child_at(1)->child_at(0),
2924 "window.domAutomationController.send(" 2918 "window.domAutomationController.send("
2925 "!window.open('data:text/html,dataurl'));", 2919 "!window.open('data:text/html,dataurl'));",
2926 &success)); 2920 &success));
2927 EXPECT_TRUE(success); 2921 EXPECT_TRUE(success);
2928 EXPECT_EQ(1u, Shell::windows().size()); 2922 EXPECT_EQ(1u, Shell::windows().size());
2929 2923
2930 // Same, but now try the case where bar.com frame's sandboxed parent is a 2924 // Same, but now try the case where bar.com frame's sandboxed parent is a
2931 // local frame in bar.com's process. 2925 // local frame in bar.com's process.
2932 success = false; 2926 success = false;
2933 EXPECT_TRUE(ExecuteScriptAndExtractBool( 2927 EXPECT_TRUE(
2934 root->child_at(2)->child_at(0)->current_frame_host(), 2928 ExecuteScriptAndExtractBool(root->child_at(2)->child_at(0),
2935 "window.domAutomationController.send(" 2929 "window.domAutomationController.send("
2936 "!window.open('data:text/html,dataurl'));", 2930 "!window.open('data:text/html,dataurl'));",
2937 &success)); 2931 &success));
2938 EXPECT_TRUE(success); 2932 EXPECT_TRUE(success);
2939 EXPECT_EQ(1u, Shell::windows().size()); 2933 EXPECT_EQ(1u, Shell::windows().size());
2940 2934
2941 // Check that foo.com frame's location.ancestorOrigins contains the correct 2935 // Check that foo.com frame's location.ancestorOrigins contains the correct
2942 // origin for the parent, which should be unaffected by sandboxing. 2936 // origin for the parent, which should be unaffected by sandboxing.
2943 int ancestor_origins_length = 0; 2937 int ancestor_origins_length = 0;
2944 EXPECT_TRUE(ExecuteScriptAndExtractInt( 2938 EXPECT_TRUE(ExecuteScriptAndExtractInt(
2945 root->child_at(1)->current_frame_host(), 2939 root->child_at(1),
2946 "window.domAutomationController.send(location.ancestorOrigins.length);", 2940 "window.domAutomationController.send(location.ancestorOrigins.length);",
2947 &ancestor_origins_length)); 2941 &ancestor_origins_length));
2948 EXPECT_EQ(1, ancestor_origins_length); 2942 EXPECT_EQ(1, ancestor_origins_length);
2949 std::string result; 2943 std::string result;
2950 EXPECT_TRUE(ExecuteScriptAndExtractString( 2944 EXPECT_TRUE(ExecuteScriptAndExtractString(
2951 root->child_at(1)->current_frame_host(), 2945 root->child_at(1),
2952 "window.domAutomationController.send(location.ancestorOrigins[0]);", 2946 "window.domAutomationController.send(location.ancestorOrigins[0]);",
2953 &result)); 2947 &result));
2954 EXPECT_EQ(result + "/", main_url.GetOrigin().spec()); 2948 EXPECT_EQ(result + "/", main_url.GetOrigin().spec());
2955 2949
2956 // Now check location.ancestorOrigins for the bar.com frame. The middle frame 2950 // Now check location.ancestorOrigins for the bar.com frame. The middle frame
2957 // (foo.com's) origin should be unique, since that frame is sandboxed, and 2951 // (foo.com's) origin should be unique, since that frame is sandboxed, and
2958 // the top frame should match |main_url|. 2952 // the top frame should match |main_url|.
2959 FrameTreeNode* bottom_child = root->child_at(1)->child_at(0); 2953 FrameTreeNode* bottom_child = root->child_at(1)->child_at(0);
2960 EXPECT_TRUE(ExecuteScriptAndExtractInt( 2954 EXPECT_TRUE(ExecuteScriptAndExtractInt(
2961 bottom_child->current_frame_host(), 2955 bottom_child,
2962 "window.domAutomationController.send(location.ancestorOrigins.length);", 2956 "window.domAutomationController.send(location.ancestorOrigins.length);",
2963 &ancestor_origins_length)); 2957 &ancestor_origins_length));
2964 EXPECT_EQ(2, ancestor_origins_length); 2958 EXPECT_EQ(2, ancestor_origins_length);
2965 EXPECT_TRUE(ExecuteScriptAndExtractString( 2959 EXPECT_TRUE(ExecuteScriptAndExtractString(
2966 bottom_child->current_frame_host(), 2960 bottom_child,
2967 "window.domAutomationController.send(location.ancestorOrigins[0]);", 2961 "window.domAutomationController.send(location.ancestorOrigins[0]);",
2968 &result)); 2962 &result));
2969 EXPECT_EQ("null", result); 2963 EXPECT_EQ("null", result);
2970 EXPECT_TRUE(ExecuteScriptAndExtractString( 2964 EXPECT_TRUE(ExecuteScriptAndExtractString(
2971 bottom_child->current_frame_host(), 2965 bottom_child,
2972 "window.domAutomationController.send(location.ancestorOrigins[1]);", 2966 "window.domAutomationController.send(location.ancestorOrigins[1]);",
2973 &result)); 2967 &result));
2974 EXPECT_EQ(main_url.GetOrigin().spec(), result + "/"); 2968 EXPECT_EQ(main_url.GetOrigin().spec(), result + "/");
2975 } 2969 }
2976 2970
2977 // Check that dynamic updates to iframe sandbox flags are propagated correctly. 2971 // Check that dynamic updates to iframe sandbox flags are propagated correctly.
2978 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, DynamicSandboxFlags) { 2972 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, DynamicSandboxFlags) {
2979 GURL main_url( 2973 GURL main_url(
2980 embedded_test_server()->GetURL("/frame_tree/page_with_two_frames.html")); 2974 embedded_test_server()->GetURL("/frame_tree/page_with_two_frames.html"));
2981 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 2975 EXPECT_TRUE(NavigateToURL(shell(), main_url));
(...skipping 18 matching lines...) Expand all
3000 EXPECT_EQ(blink::WebSandboxFlags::None, 2994 EXPECT_EQ(blink::WebSandboxFlags::None,
3001 root->child_at(0)->pending_sandbox_flags()); 2995 root->child_at(0)->pending_sandbox_flags());
3002 EXPECT_EQ(blink::WebSandboxFlags::None, 2996 EXPECT_EQ(blink::WebSandboxFlags::None,
3003 root->child_at(0)->effective_sandbox_flags()); 2997 root->child_at(0)->effective_sandbox_flags());
3004 EXPECT_EQ(blink::WebSandboxFlags::None, 2998 EXPECT_EQ(blink::WebSandboxFlags::None,
3005 root->child_at(1)->pending_sandbox_flags()); 2999 root->child_at(1)->pending_sandbox_flags());
3006 EXPECT_EQ(blink::WebSandboxFlags::None, 3000 EXPECT_EQ(blink::WebSandboxFlags::None,
3007 root->child_at(1)->effective_sandbox_flags()); 3001 root->child_at(1)->effective_sandbox_flags());
3008 3002
3009 // Dynamically update sandbox flags for the first frame. 3003 // Dynamically update sandbox flags for the first frame.
3010 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), 3004 EXPECT_TRUE(ExecuteScript(
3011 "window.domAutomationController.send(" 3005 shell(),
3012 "document.querySelector('iframe').sandbox=" 3006 "document.querySelector('iframe').sandbox='allow-scripts';"));
3013 "'allow-scripts');"));
3014 3007
3015 // Check that updated sandbox flags are propagated to browser process. 3008 // Check that updated sandbox flags are propagated to browser process.
3016 // The new flags should be reflected in pending_sandbox_flags(), while 3009 // The new flags should be reflected in pending_sandbox_flags(), while
3017 // effective_sandbox_flags() should still reflect the old flags, because 3010 // effective_sandbox_flags() should still reflect the old flags, because
3018 // sandbox flag updates take place only after navigations. "allow-scripts" 3011 // sandbox flag updates take place only after navigations. "allow-scripts"
3019 // resets both SandboxFlags::Scripts and SandboxFlags::AutomaticFeatures bits 3012 // resets both SandboxFlags::Scripts and SandboxFlags::AutomaticFeatures bits
3020 // per blink::parseSandboxPolicy(). 3013 // per blink::parseSandboxPolicy().
3021 blink::WebSandboxFlags expected_flags = 3014 blink::WebSandboxFlags expected_flags =
3022 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts & 3015 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts &
3023 ~blink::WebSandboxFlags::AutomaticFeatures; 3016 ~blink::WebSandboxFlags::AutomaticFeatures;
(...skipping 21 matching lines...) Expand all
3045 " C = http://baz.com/", 3038 " C = http://baz.com/",
3046 DepictFrameTree(root)); 3039 DepictFrameTree(root));
3047 3040
3048 // Confirm that the browser process has updated the frame's current sandbox 3041 // Confirm that the browser process has updated the frame's current sandbox
3049 // flags. 3042 // flags.
3050 EXPECT_EQ(expected_flags, root->child_at(0)->pending_sandbox_flags()); 3043 EXPECT_EQ(expected_flags, root->child_at(0)->pending_sandbox_flags());
3051 EXPECT_EQ(expected_flags, root->child_at(0)->effective_sandbox_flags()); 3044 EXPECT_EQ(expected_flags, root->child_at(0)->effective_sandbox_flags());
3052 3045
3053 // Opening a popup in the now-sandboxed frame should fail. 3046 // Opening a popup in the now-sandboxed frame should fail.
3054 bool success = false; 3047 bool success = false;
3055 EXPECT_TRUE( 3048 EXPECT_TRUE(ExecuteScriptAndExtractBool(
3056 ExecuteScriptAndExtractBool(root->child_at(0)->current_frame_host(), 3049 root->child_at(0),
3057 "window.domAutomationController.send(" 3050 "window.domAutomationController.send("
3058 "!window.open('data:text/html,dataurl'));", 3051 " !window.open('data:text/html,dataurl'));",
3059 &success)); 3052 &success));
3060 EXPECT_TRUE(success); 3053 EXPECT_TRUE(success);
3061 EXPECT_EQ(1u, Shell::windows().size()); 3054 EXPECT_EQ(1u, Shell::windows().size());
3062 3055
3063 // Navigate the child of the now-sandboxed frame to a page on baz.com. The 3056 // Navigate the child of the now-sandboxed frame to a page on baz.com. The
3064 // child should inherit the latest sandbox flags from its parent frame, which 3057 // child should inherit the latest sandbox flags from its parent frame, which
3065 // is currently a proxy in baz.com's renderer process. This checks that the 3058 // is currently a proxy in baz.com's renderer process. This checks that the
3066 // proxies of |root->child_at(0)| were also updated with the latest sandbox 3059 // proxies of |root->child_at(0)| were also updated with the latest sandbox
3067 // flags. 3060 // flags.
3068 GURL baz_child_url(embedded_test_server()->GetURL("baz.com", "/title2.html")); 3061 GURL baz_child_url(embedded_test_server()->GetURL("baz.com", "/title2.html"));
3069 NavigateFrameToURL(root->child_at(0)->child_at(0), baz_child_url); 3062 NavigateFrameToURL(root->child_at(0)->child_at(0), baz_child_url);
3070 EXPECT_TRUE(observer.last_navigation_succeeded()); 3063 EXPECT_TRUE(observer.last_navigation_succeeded());
3071 EXPECT_EQ(baz_child_url, observer.last_navigation_url()); 3064 EXPECT_EQ(baz_child_url, observer.last_navigation_url());
3072 3065
3073 EXPECT_EQ( 3066 EXPECT_EQ(
3074 " Site A ------------ proxies for B C\n" 3067 " Site A ------------ proxies for B C\n"
3075 " |--Site B ------- proxies for A C\n" 3068 " |--Site B ------- proxies for A C\n"
3076 " | +--Site C -- proxies for A B\n" 3069 " | +--Site C -- proxies for A B\n"
3077 " +--Site C ------- proxies for A B\n" 3070 " +--Site C ------- proxies for A B\n"
3078 "Where A = http://127.0.0.1/\n" 3071 "Where A = http://127.0.0.1/\n"
3079 " B = http://bar.com/\n" 3072 " B = http://bar.com/\n"
3080 " C = http://baz.com/", 3073 " C = http://baz.com/",
3081 DepictFrameTree(root)); 3074 DepictFrameTree(root));
3082 3075
3083 // Opening a popup in the child of a sandboxed frame should fail. 3076 // Opening a popup in the child of a sandboxed frame should fail.
3084 success = false; 3077 success = false;
3085 EXPECT_TRUE(ExecuteScriptAndExtractBool( 3078 EXPECT_TRUE(ExecuteScriptAndExtractBool(
3086 root->child_at(0)->child_at(0)->current_frame_host(), 3079 root->child_at(0)->child_at(0),
3087 "window.domAutomationController.send(" 3080 "window.domAutomationController.send("
3088 "!window.open('data:text/html,dataurl'));", 3081 " !window.open('data:text/html,dataurl'));",
3089 &success)); 3082 &success));
3090 EXPECT_TRUE(success); 3083 EXPECT_TRUE(success);
3091 EXPECT_EQ(1u, Shell::windows().size()); 3084 EXPECT_EQ(1u, Shell::windows().size());
3092 3085
3093 // Child of a sandboxed frame should also be sandboxed on the browser side. 3086 // Child of a sandboxed frame should also be sandboxed on the browser side.
3094 EXPECT_EQ(expected_flags, 3087 EXPECT_EQ(expected_flags,
3095 root->child_at(0)->child_at(0)->effective_sandbox_flags()); 3088 root->child_at(0)->child_at(0)->effective_sandbox_flags());
3096 } 3089 }
3097 3090
3098 // Check that dynamic updates to iframe sandbox flags are propagated correctly. 3091 // Check that dynamic updates to iframe sandbox flags are propagated correctly.
3099 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 3092 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
3100 DynamicSandboxFlagsRemoteToLocal) { 3093 DynamicSandboxFlagsRemoteToLocal) {
3101 GURL main_url( 3094 GURL main_url(
3102 embedded_test_server()->GetURL("/frame_tree/page_with_two_frames.html")); 3095 embedded_test_server()->GetURL("/frame_tree/page_with_two_frames.html"));
3103 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 3096 EXPECT_TRUE(NavigateToURL(shell(), main_url));
3104 3097
3105 // It is safe to obtain the root frame tree node here, as it doesn't change. 3098 // It is safe to obtain the root frame tree node here, as it doesn't change.
3106 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 3099 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
3107 3100
3108 TestNavigationObserver observer(shell()->web_contents()); 3101 TestNavigationObserver observer(shell()->web_contents());
3109 ASSERT_EQ(2U, root->child_count()); 3102 ASSERT_EQ(2U, root->child_count());
3110 3103
3111 // Make sure the two frames starts out at correct URLs. 3104 // Make sure the two frames starts out at correct URLs.
3112 EXPECT_EQ(embedded_test_server()->GetURL("bar.com", "/title1.html"), 3105 EXPECT_EQ(embedded_test_server()->GetURL("bar.com", "/title1.html"),
3113 root->child_at(0)->current_url()); 3106 root->child_at(0)->current_url());
3114 EXPECT_EQ(embedded_test_server()->GetURL("/title1.html"), 3107 EXPECT_EQ(embedded_test_server()->GetURL("/title1.html"),
3115 root->child_at(1)->current_url()); 3108 root->child_at(1)->current_url());
3116 3109
3117 // Update the second frame's sandbox flags. 3110 // Update the second frame's sandbox flags.
3118 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), 3111 EXPECT_TRUE(ExecuteScript(
3119 "window.domAutomationController.send(" 3112 shell(),
3120 "document.querySelectorAll('iframe')[1].sandbox=" 3113 "document.querySelectorAll('iframe')[1].sandbox='allow-scripts'"));
3121 "'allow-scripts');"));
3122 3114
3123 // Check that the current sandbox flags are updated but the effective 3115 // Check that the current sandbox flags are updated but the effective
3124 // sandbox flags are not. 3116 // sandbox flags are not.
3125 blink::WebSandboxFlags expected_flags = 3117 blink::WebSandboxFlags expected_flags =
3126 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts & 3118 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts &
3127 ~blink::WebSandboxFlags::AutomaticFeatures; 3119 ~blink::WebSandboxFlags::AutomaticFeatures;
3128 EXPECT_EQ(expected_flags, root->child_at(1)->pending_sandbox_flags()); 3120 EXPECT_EQ(expected_flags, root->child_at(1)->pending_sandbox_flags());
3129 EXPECT_EQ(blink::WebSandboxFlags::None, 3121 EXPECT_EQ(blink::WebSandboxFlags::None,
3130 root->child_at(1)->effective_sandbox_flags()); 3122 root->child_at(1)->effective_sandbox_flags());
3131 3123
3132 // Navigate the second subframe to a page on bar.com. This will trigger a 3124 // Navigate the second subframe to a page on bar.com. This will trigger a
3133 // remote-to-local frame swap in bar.com's process. 3125 // remote-to-local frame swap in bar.com's process.
3134 GURL bar_url(embedded_test_server()->GetURL( 3126 GURL bar_url(embedded_test_server()->GetURL(
3135 "bar.com", "/frame_tree/page_with_one_frame.html")); 3127 "bar.com", "/frame_tree/page_with_one_frame.html"));
3136 NavigateFrameToURL(root->child_at(1), bar_url); 3128 NavigateFrameToURL(root->child_at(1), bar_url);
3137 EXPECT_EQ(bar_url, root->child_at(1)->current_url()); 3129 EXPECT_EQ(bar_url, root->child_at(1)->current_url());
3138 ASSERT_EQ(1U, root->child_at(1)->child_count()); 3130 ASSERT_EQ(1U, root->child_at(1)->child_count());
3139 3131
3140 // Confirm that the browser process has updated the current sandbox flags. 3132 // Confirm that the browser process has updated the current sandbox flags.
3141 EXPECT_EQ(expected_flags, root->child_at(1)->pending_sandbox_flags()); 3133 EXPECT_EQ(expected_flags, root->child_at(1)->pending_sandbox_flags());
3142 EXPECT_EQ(expected_flags, root->child_at(1)->effective_sandbox_flags()); 3134 EXPECT_EQ(expected_flags, root->child_at(1)->effective_sandbox_flags());
3143 3135
3144 // Opening a popup in the sandboxed second frame should fail. 3136 // Opening a popup in the sandboxed second frame should fail.
3145 bool success = false; 3137 bool success = false;
3146 EXPECT_TRUE( 3138 EXPECT_TRUE(ExecuteScriptAndExtractBool(
3147 ExecuteScriptAndExtractBool(root->child_at(1)->current_frame_host(), 3139 root->child_at(1),
3148 "window.domAutomationController.send(" 3140 "window.domAutomationController.send("
3149 "!window.open('data:text/html,dataurl'));", 3141 " !window.open('data:text/html,dataurl'));",
3150 &success)); 3142 &success));
3151 EXPECT_TRUE(success); 3143 EXPECT_TRUE(success);
3152 EXPECT_EQ(1u, Shell::windows().size()); 3144 EXPECT_EQ(1u, Shell::windows().size());
3153 3145
3154 // Make sure that the child frame inherits the sandbox flags of its 3146 // Make sure that the child frame inherits the sandbox flags of its
3155 // now-sandboxed parent frame. 3147 // now-sandboxed parent frame.
3156 success = false; 3148 success = false;
3157 EXPECT_TRUE(ExecuteScriptAndExtractBool( 3149 EXPECT_TRUE(ExecuteScriptAndExtractBool(
3158 root->child_at(1)->child_at(0)->current_frame_host(), 3150 root->child_at(1)->child_at(0),
3159 "window.domAutomationController.send(" 3151 "window.domAutomationController.send("
3160 "!window.open('data:text/html,dataurl'));", 3152 " !window.open('data:text/html,dataurl'));",
3161 &success)); 3153 &success));
3162 EXPECT_TRUE(success); 3154 EXPECT_TRUE(success);
3163 EXPECT_EQ(1u, Shell::windows().size()); 3155 EXPECT_EQ(1u, Shell::windows().size());
3164 } 3156 }
3165 3157
3166 // Check that dynamic updates to iframe sandbox flags are propagated correctly. 3158 // Check that dynamic updates to iframe sandbox flags are propagated correctly.
3167 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 3159 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
3168 DynamicSandboxFlagsRendererInitiatedNavigation) { 3160 DynamicSandboxFlagsRendererInitiatedNavigation) {
3169 GURL main_url( 3161 GURL main_url(
3170 embedded_test_server()->GetURL("/frame_tree/page_with_one_frame.html")); 3162 embedded_test_server()->GetURL("/frame_tree/page_with_one_frame.html"));
3171 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 3163 EXPECT_TRUE(NavigateToURL(shell(), main_url));
3172 3164
3173 // It is safe to obtain the root frame tree node here, as it doesn't change. 3165 // It is safe to obtain the root frame tree node here, as it doesn't change.
3174 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 3166 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
3175 3167
3176 TestNavigationObserver observer(shell()->web_contents()); 3168 TestNavigationObserver observer(shell()->web_contents());
3177 ASSERT_EQ(1U, root->child_count()); 3169 ASSERT_EQ(1U, root->child_count());
3178 3170
3179 // Make sure the frame starts out at the correct cross-site page. 3171 // Make sure the frame starts out at the correct cross-site page.
3180 EXPECT_EQ(embedded_test_server()->GetURL("baz.com", "/title1.html"), 3172 EXPECT_EQ(embedded_test_server()->GetURL("baz.com", "/title1.html"),
3181 root->child_at(0)->current_url()); 3173 root->child_at(0)->current_url());
3182 3174
3183 // The frame should not be sandboxed to start with. 3175 // The frame should not be sandboxed to start with.
3184 EXPECT_EQ(blink::WebSandboxFlags::None, 3176 EXPECT_EQ(blink::WebSandboxFlags::None,
3185 root->child_at(0)->pending_sandbox_flags()); 3177 root->child_at(0)->pending_sandbox_flags());
3186 EXPECT_EQ(blink::WebSandboxFlags::None, 3178 EXPECT_EQ(blink::WebSandboxFlags::None,
3187 root->child_at(0)->effective_sandbox_flags()); 3179 root->child_at(0)->effective_sandbox_flags());
3188 3180
3189 // Dynamically update the frame's sandbox flags. 3181 // Dynamically update the frame's sandbox flags.
3190 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), 3182 EXPECT_TRUE(ExecuteScript(
3191 "window.domAutomationController.send(" 3183 shell(), "document.querySelector('iframe').sandbox='allow-scripts';"));
3192 "document.querySelector('iframe').sandbox="
3193 "'allow-scripts');"));
3194 3184
3195 // Check that updated sandbox flags are propagated to browser process. 3185 // Check that updated sandbox flags are propagated to browser process.
3196 // The new flags should be set in pending_sandbox_flags(), while 3186 // The new flags should be set in pending_sandbox_flags(), while
3197 // effective_sandbox_flags() should still reflect the old flags, because 3187 // effective_sandbox_flags() should still reflect the old flags, because
3198 // sandbox flag updates take place only after navigations. "allow-scripts" 3188 // sandbox flag updates take place only after navigations. "allow-scripts"
3199 // resets both SandboxFlags::Scripts and SandboxFlags::AutomaticFeatures bits 3189 // resets both SandboxFlags::Scripts and SandboxFlags::AutomaticFeatures bits
3200 // per blink::parseSandboxPolicy(). 3190 // per blink::parseSandboxPolicy().
3201 blink::WebSandboxFlags expected_flags = 3191 blink::WebSandboxFlags expected_flags =
3202 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts & 3192 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts &
3203 ~blink::WebSandboxFlags::AutomaticFeatures; 3193 ~blink::WebSandboxFlags::AutomaticFeatures;
3204 EXPECT_EQ(expected_flags, root->child_at(0)->pending_sandbox_flags()); 3194 EXPECT_EQ(expected_flags, root->child_at(0)->pending_sandbox_flags());
3205 EXPECT_EQ(blink::WebSandboxFlags::None, 3195 EXPECT_EQ(blink::WebSandboxFlags::None,
3206 root->child_at(0)->effective_sandbox_flags()); 3196 root->child_at(0)->effective_sandbox_flags());
3207 3197
3208 // Perform a renderer-initiated same-site navigation in the first frame. The 3198 // Perform a renderer-initiated same-site navigation in the first frame. The
3209 // new sandbox flags should take effect. 3199 // new sandbox flags should take effect.
3210 TestFrameNavigationObserver frame_observer(root->child_at(0)); 3200 TestFrameNavigationObserver frame_observer(root->child_at(0));
3211 ASSERT_TRUE(ExecuteScript(root->child_at(0)->current_frame_host(), 3201 ASSERT_TRUE(
3212 "window.location.href='/title2.html'")); 3202 ExecuteScript(root->child_at(0), "window.location.href='/title2.html'"));
3213 frame_observer.Wait(); 3203 frame_observer.Wait();
3214 EXPECT_EQ(embedded_test_server()->GetURL("baz.com", "/title2.html"), 3204 EXPECT_EQ(embedded_test_server()->GetURL("baz.com", "/title2.html"),
3215 root->child_at(0)->current_url()); 3205 root->child_at(0)->current_url());
3216 3206
3217 // Confirm that the browser process has updated the frame's current sandbox 3207 // Confirm that the browser process has updated the frame's current sandbox
3218 // flags. 3208 // flags.
3219 EXPECT_EQ(expected_flags, root->child_at(0)->pending_sandbox_flags()); 3209 EXPECT_EQ(expected_flags, root->child_at(0)->pending_sandbox_flags());
3220 EXPECT_EQ(expected_flags, root->child_at(0)->effective_sandbox_flags()); 3210 EXPECT_EQ(expected_flags, root->child_at(0)->effective_sandbox_flags());
3221 3211
3222 // Opening a popup in the now-sandboxed frame should fail. 3212 // Opening a popup in the now-sandboxed frame should fail.
3223 bool success = false; 3213 bool success = false;
3224 EXPECT_TRUE( 3214 EXPECT_TRUE(ExecuteScriptAndExtractBool(
3225 ExecuteScriptAndExtractBool(root->child_at(0)->current_frame_host(), 3215 root->child_at(0),
3226 "window.domAutomationController.send(" 3216 "window.domAutomationController.send("
3227 "!window.open('data:text/html,dataurl'));", 3217 " !window.open('data:text/html,dataurl'));",
3228 &success)); 3218 &success));
3229 EXPECT_TRUE(success); 3219 EXPECT_TRUE(success);
3230 EXPECT_EQ(1u, Shell::windows().size()); 3220 EXPECT_EQ(1u, Shell::windows().size());
3231 } 3221 }
3232 3222
3233 // Verify that when a new child frame is added, the proxies created for it in 3223 // Verify that when a new child frame is added, the proxies created for it in
3234 // other SiteInstances have correct sandbox flags and origin. 3224 // other SiteInstances have correct sandbox flags and origin.
3235 // 3225 //
3236 // A A A 3226 // A A A
3237 // / / \ / \ . 3227 // / / \ / \ .
3238 // B -> B A -> B A 3228 // B -> B A -> B A
(...skipping 21 matching lines...) Expand all
3260 " +--Site B ------- proxies for A\n" 3250 " +--Site B ------- proxies for A\n"
3261 "Where A = http://127.0.0.1/\n" 3251 "Where A = http://127.0.0.1/\n"
3262 " B = http://baz.com/", 3252 " B = http://baz.com/",
3263 DepictFrameTree(root)); 3253 DepictFrameTree(root));
3264 3254
3265 // In the root frame, add a new sandboxed local frame, which itself has a 3255 // In the root frame, add a new sandboxed local frame, which itself has a
3266 // child frame on baz.com. Wait for three RenderFrameHosts to be created: 3256 // child frame on baz.com. Wait for three RenderFrameHosts to be created:
3267 // the new sandboxed local frame, its child (while it's still local), and a 3257 // the new sandboxed local frame, its child (while it's still local), and a
3268 // pending RFH when starting the cross-site navigation to baz.com. 3258 // pending RFH when starting the cross-site navigation to baz.com.
3269 RenderFrameHostCreatedObserver frame_observer(shell()->web_contents(), 3); 3259 RenderFrameHostCreatedObserver frame_observer(shell()->web_contents(), 3);
3270 EXPECT_TRUE( 3260 EXPECT_TRUE(ExecuteScript(root,
3271 ExecuteScript(root->current_frame_host(), 3261 "addFrame('/frame_tree/page_with_one_frame.html',"
3272 "window.domAutomationController.send(" 3262 " 'allow-scripts allow-same-origin'))"));
3273 " addFrame('/frame_tree/page_with_one_frame.html',"
3274 " 'allow-scripts allow-same-origin'))"));
3275 frame_observer.Wait(); 3263 frame_observer.Wait();
3276 3264
3277 // Wait for the cross-site navigation to baz.com in the grandchild to finish. 3265 // Wait for the cross-site navigation to baz.com in the grandchild to finish.
3278 FrameTreeNode* bottom_child = root->child_at(1)->child_at(0); 3266 FrameTreeNode* bottom_child = root->child_at(1)->child_at(0);
3279 TestFrameNavigationObserver navigation_observer(bottom_child); 3267 TestFrameNavigationObserver navigation_observer(bottom_child);
3280 navigation_observer.Wait(); 3268 navigation_observer.Wait();
3281 3269
3282 EXPECT_EQ( 3270 EXPECT_EQ(
3283 " Site A ------------ proxies for B\n" 3271 " Site A ------------ proxies for B\n"
3284 " |--Site B ------- proxies for A\n" 3272 " |--Site B ------- proxies for A\n"
3285 " +--Site A ------- proxies for B\n" 3273 " +--Site A ------- proxies for B\n"
3286 " +--Site B -- proxies for A\n" 3274 " +--Site B -- proxies for A\n"
3287 "Where A = http://127.0.0.1/\n" 3275 "Where A = http://127.0.0.1/\n"
3288 " B = http://baz.com/", 3276 " B = http://baz.com/",
3289 DepictFrameTree(root)); 3277 DepictFrameTree(root));
3290 3278
3291 // Use location.ancestorOrigins to check that the grandchild on baz.com sees 3279 // Use location.ancestorOrigins to check that the grandchild on baz.com sees
3292 // correct origin for its parent. 3280 // correct origin for its parent.
3293 int ancestor_origins_length = 0; 3281 int ancestor_origins_length = 0;
3294 EXPECT_TRUE(ExecuteScriptAndExtractInt( 3282 EXPECT_TRUE(ExecuteScriptAndExtractInt(
3295 bottom_child->current_frame_host(), 3283 bottom_child,
3296 "window.domAutomationController.send(location.ancestorOrigins.length);", 3284 "window.domAutomationController.send(location.ancestorOrigins.length);",
3297 &ancestor_origins_length)); 3285 &ancestor_origins_length));
3298 EXPECT_EQ(2, ancestor_origins_length); 3286 EXPECT_EQ(2, ancestor_origins_length);
3299 std::string parent_origin; 3287 std::string parent_origin;
3300 EXPECT_TRUE(ExecuteScriptAndExtractString( 3288 EXPECT_TRUE(ExecuteScriptAndExtractString(
3301 bottom_child->current_frame_host(), 3289 bottom_child,
3302 "window.domAutomationController.send(location.ancestorOrigins[0]);", 3290 "window.domAutomationController.send(location.ancestorOrigins[0]);",
3303 &parent_origin)); 3291 &parent_origin));
3304 EXPECT_EQ(main_url.GetOrigin().spec(), parent_origin + "/"); 3292 EXPECT_EQ(main_url.GetOrigin().spec(), parent_origin + "/");
3305 3293
3306 // Check that the sandbox flags in the browser process are correct. 3294 // Check that the sandbox flags in the browser process are correct.
3307 // "allow-scripts" resets both WebSandboxFlags::Scripts and 3295 // "allow-scripts" resets both WebSandboxFlags::Scripts and
3308 // WebSandboxFlags::AutomaticFeatures bits per blink::parseSandboxPolicy(). 3296 // WebSandboxFlags::AutomaticFeatures bits per blink::parseSandboxPolicy().
3309 blink::WebSandboxFlags expected_flags = 3297 blink::WebSandboxFlags expected_flags =
3310 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts & 3298 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts &
3311 ~blink::WebSandboxFlags::AutomaticFeatures & 3299 ~blink::WebSandboxFlags::AutomaticFeatures &
3312 ~blink::WebSandboxFlags::Origin; 3300 ~blink::WebSandboxFlags::Origin;
3313 EXPECT_EQ(expected_flags, root->child_at(1)->effective_sandbox_flags()); 3301 EXPECT_EQ(expected_flags, root->child_at(1)->effective_sandbox_flags());
3314 3302
3315 // The child of the sandboxed frame should've inherited sandbox flags, so it 3303 // The child of the sandboxed frame should've inherited sandbox flags, so it
3316 // should not be able to create popups. 3304 // should not be able to create popups.
3317 EXPECT_EQ(expected_flags, bottom_child->effective_sandbox_flags()); 3305 EXPECT_EQ(expected_flags, bottom_child->effective_sandbox_flags());
3318 bool success = false; 3306 bool success = false;
3319 EXPECT_TRUE( 3307 EXPECT_TRUE(ExecuteScriptAndExtractBool(
3320 ExecuteScriptAndExtractBool(bottom_child->current_frame_host(), 3308 bottom_child,
3321 "window.domAutomationController.send(" 3309 "window.domAutomationController.send("
3322 "!window.open('data:text/html,dataurl'));", 3310 " !window.open('data:text/html,dataurl'));",
3323 &success)); 3311 &success));
3324 EXPECT_TRUE(success); 3312 EXPECT_TRUE(success);
3325 EXPECT_EQ(1u, Shell::windows().size()); 3313 EXPECT_EQ(1u, Shell::windows().size());
3326 } 3314 }
3327 3315
3328 // Verify that a child frame can retrieve the name property set by its parent. 3316 // Verify that a child frame can retrieve the name property set by its parent.
3329 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, WindowNameReplication) { 3317 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, WindowNameReplication) {
3330 GURL main_url(embedded_test_server()->GetURL("/frame_tree/2-4.html")); 3318 GURL main_url(embedded_test_server()->GetURL("/frame_tree/2-4.html"));
3331 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 3319 EXPECT_TRUE(NavigateToURL(shell(), main_url));
3332 3320
3333 // It is safe to obtain the root frame tree node here, as it doesn't change. 3321 // It is safe to obtain the root frame tree node here, as it doesn't change.
3334 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 3322 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
3335 3323
3336 TestNavigationObserver observer(shell()->web_contents()); 3324 TestNavigationObserver observer(shell()->web_contents());
3337 3325
3338 // Load cross-site page into iframe. 3326 // Load cross-site page into iframe.
3339 GURL frame_url = 3327 GURL frame_url =
3340 embedded_test_server()->GetURL("foo.com", "/frame_tree/3-1.html"); 3328 embedded_test_server()->GetURL("foo.com", "/frame_tree/3-1.html");
3341 NavigateFrameToURL(root->child_at(0), frame_url); 3329 NavigateFrameToURL(root->child_at(0), frame_url);
3342 EXPECT_TRUE(observer.last_navigation_succeeded()); 3330 EXPECT_TRUE(observer.last_navigation_succeeded());
3343 EXPECT_EQ(frame_url, observer.last_navigation_url()); 3331 EXPECT_EQ(frame_url, observer.last_navigation_url());
3344 3332
3345 // Ensure that a new process is created for the subframe. 3333 // Ensure that a new process is created for the subframe.
3346 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), 3334 EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
3347 root->child_at(0)->current_frame_host()->GetSiteInstance()); 3335 root->child_at(0)->current_frame_host()->GetSiteInstance());
3348 3336
3349 // Check that the window.name seen by the frame matches the name attribute 3337 // Check that the window.name seen by the frame matches the name attribute
3350 // specified by its parent in the iframe tag. 3338 // specified by its parent in the iframe tag.
3351 std::string result; 3339 std::string result;
3352 EXPECT_TRUE(ExecuteScriptAndExtractString( 3340 EXPECT_TRUE(ExecuteScriptAndExtractString(
3353 root->child_at(0)->current_frame_host(), 3341 root->child_at(0), "window.domAutomationController.send(window.name);",
3354 "window.domAutomationController.send(window.name);", &result)); 3342 &result));
3355 EXPECT_EQ("3-1-name", result); 3343 EXPECT_EQ("3-1-name", result);
3356 } 3344 }
3357 3345
3358 // Verify that dynamic updates to a frame's window.name propagate to the 3346 // Verify that dynamic updates to a frame's window.name propagate to the
3359 // frame's proxies, so that the latest frame names can be used in navigations. 3347 // frame's proxies, so that the latest frame names can be used in navigations.
3360 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, DynamicWindowName) { 3348 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, DynamicWindowName) {
3361 GURL main_url(embedded_test_server()->GetURL("/frame_tree/2-4.html")); 3349 GURL main_url(embedded_test_server()->GetURL("/frame_tree/2-4.html"));
3362 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 3350 EXPECT_TRUE(NavigateToURL(shell(), main_url));
3363 3351
3364 // It is safe to obtain the root frame tree node here, as it doesn't change. 3352 // It is safe to obtain the root frame tree node here, as it doesn't change.
3365 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 3353 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
3366 TestNavigationObserver observer(shell()->web_contents()); 3354 TestNavigationObserver observer(shell()->web_contents());
3367 3355
3368 // Load cross-site page into iframe. 3356 // Load cross-site page into iframe.
3369 GURL frame_url = 3357 GURL frame_url =
3370 embedded_test_server()->GetURL("foo.com", "/frame_tree/3-1.html"); 3358 embedded_test_server()->GetURL("foo.com", "/frame_tree/3-1.html");
3371 NavigateFrameToURL(root->child_at(0), frame_url); 3359 NavigateFrameToURL(root->child_at(0), frame_url);
3372 EXPECT_TRUE(observer.last_navigation_succeeded()); 3360 EXPECT_TRUE(observer.last_navigation_succeeded());
3373 EXPECT_EQ(frame_url, observer.last_navigation_url()); 3361 EXPECT_EQ(frame_url, observer.last_navigation_url());
3374 3362
3375 // Browser process should know the child frame's original window.name 3363 // Browser process should know the child frame's original window.name
3376 // specified in the iframe element. 3364 // specified in the iframe element.
3377 EXPECT_EQ(root->child_at(0)->frame_name(), "3-1-name"); 3365 EXPECT_EQ(root->child_at(0)->frame_name(), "3-1-name");
3378 3366
3379 // Update the child frame's window.name. 3367 // Update the child frame's window.name.
3380 EXPECT_TRUE(ExecuteScript(root->child_at(0)->current_frame_host(), 3368 EXPECT_TRUE(
3381 "window.domAutomationController.send(" 3369 ExecuteScript(root->child_at(0), "window.name = 'updated-name';"));
3382 "window.name = 'updated-name');"));
3383 3370
3384 // The change should propagate to the browser process. 3371 // The change should propagate to the browser process.
3385 EXPECT_EQ(root->child_at(0)->frame_name(), "updated-name"); 3372 EXPECT_EQ(root->child_at(0)->frame_name(), "updated-name");
3386 3373
3387 // The proxy in the parent process should also receive the updated name. 3374 // The proxy in the parent process should also receive the updated name.
3388 // Check that it can reference the child frame by its new name. 3375 // Check that it can reference the child frame by its new name.
3389 bool success = false; 3376 bool success = false;
3390 EXPECT_TRUE( 3377 EXPECT_TRUE(
3391 ExecuteScriptAndExtractBool(shell()->web_contents(), 3378 ExecuteScriptAndExtractBool(shell(),
3392 "window.domAutomationController.send(" 3379 "window.domAutomationController.send("
3393 "frames['updated-name'] == frames[0]);", 3380 " frames['updated-name'] == frames[0]);",
3394 &success)); 3381 &success));
3395 EXPECT_TRUE(success); 3382 EXPECT_TRUE(success);
3396 3383
3397 // Issue a renderer-initiated navigation from the root frame to the child 3384 // Issue a renderer-initiated navigation from the root frame to the child
3398 // frame using the frame's name. Make sure correct frame is navigated. 3385 // frame using the frame's name. Make sure correct frame is navigated.
3399 // 3386 //
3400 // TODO(alexmos): When blink::createWindow is refactored to handle 3387 // TODO(alexmos): When blink::createWindow is refactored to handle
3401 // RemoteFrames, this should also be tested via window.open(url, frame_name) 3388 // RemoteFrames, this should also be tested via window.open(url, frame_name)
3402 // and a more complicated frame hierarchy (https://crbug.com/463742) 3389 // and a more complicated frame hierarchy (https://crbug.com/463742)
3403 TestFrameNavigationObserver frame_observer(root->child_at(0)); 3390 TestFrameNavigationObserver frame_observer(root->child_at(0));
3404 GURL foo_url(embedded_test_server()->GetURL("foo.com", "/title1.html")); 3391 GURL foo_url(embedded_test_server()->GetURL("foo.com", "/title1.html"));
3405 std::string script = base::StringPrintf( 3392 EXPECT_TRUE(ExecuteScript(
3406 "window.domAutomationController.send(" 3393 shell(),
3407 "frames['updated-name'].location.href = '%s');", 3394 base::StringPrintf("frames['updated-name'].location.href = '%s';",
3408 foo_url.spec().c_str()); 3395 foo_url.spec().c_str())));
3409 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), script));
3410 frame_observer.Wait(); 3396 frame_observer.Wait();
3411 EXPECT_EQ(foo_url, root->child_at(0)->current_url()); 3397 EXPECT_EQ(foo_url, root->child_at(0)->current_url());
3412 } 3398 }
3413 3399
3414 // Verify that when a frame is navigated to a new origin, the origin update 3400 // Verify that when a frame is navigated to a new origin, the origin update
3415 // propagates to the frame's proxies. 3401 // propagates to the frame's proxies.
3416 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, OriginUpdatesReachProxies) { 3402 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, OriginUpdatesReachProxies) {
3417 GURL main_url( 3403 GURL main_url(
3418 embedded_test_server()->GetURL("/frame_tree/page_with_two_frames.html")); 3404 embedded_test_server()->GetURL("/frame_tree/page_with_two_frames.html"));
3419 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 3405 EXPECT_TRUE(NavigateToURL(shell(), main_url));
(...skipping 23 matching lines...) Expand all
3443 // contain the second frame's updated origin (see blink::Frame::canNavigate). 3429 // contain the second frame's updated origin (see blink::Frame::canNavigate).
3444 std::unique_ptr<ConsoleObserverDelegate> console_delegate( 3430 std::unique_ptr<ConsoleObserverDelegate> console_delegate(
3445 new ConsoleObserverDelegate( 3431 new ConsoleObserverDelegate(
3446 shell()->web_contents(), 3432 shell()->web_contents(),
3447 "Unsafe JavaScript attempt to initiate navigation*")); 3433 "Unsafe JavaScript attempt to initiate navigation*"));
3448 shell()->web_contents()->SetDelegate(console_delegate.get()); 3434 shell()->web_contents()->SetDelegate(console_delegate.get());
3449 3435
3450 // frames[1] can't be used due to a bug where RemoteFrames are created out of 3436 // frames[1] can't be used due to a bug where RemoteFrames are created out of
3451 // order (https://crbug.com/478792). Instead, target second frame by name. 3437 // order (https://crbug.com/478792). Instead, target second frame by name.
3452 EXPECT_TRUE(ExecuteScript( 3438 EXPECT_TRUE(ExecuteScript(
3453 root->child_at(0)->current_frame_host(), 3439 root->child_at(0),
3454 "window.domAutomationController.send(" 3440 "parent.frames['frame2'].location.href = 'data:text/html,foo'"));
3455 " parent.frames['frame2'].location.href = 'data:text/html,foo');"));
3456 console_delegate->Wait(); 3441 console_delegate->Wait();
3457 3442
3458 std::string frame_origin = root->child_at(1)->current_origin().Serialize(); 3443 std::string frame_origin = root->child_at(1)->current_origin().Serialize();
3459 EXPECT_EQ(frame_origin + "/", frame_url.GetOrigin().spec()); 3444 EXPECT_EQ(frame_origin + "/", frame_url.GetOrigin().spec());
3460 EXPECT_TRUE( 3445 EXPECT_TRUE(
3461 base::MatchPattern(console_delegate->message(), "*" + frame_origin + "*")) 3446 base::MatchPattern(console_delegate->message(), "*" + frame_origin + "*"))
3462 << "Error message does not contain the frame's latest origin (" 3447 << "Error message does not contain the frame's latest origin ("
3463 << frame_origin << ")"; 3448 << frame_origin << ")";
3464 } 3449 }
3465 3450
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
3665 GURL interstitial_url("http://interstitial"); 3650 GURL interstitial_url("http://interstitial");
3666 InterstitialPageImpl* interstitial = new InterstitialPageImpl( 3651 InterstitialPageImpl* interstitial = new InterstitialPageImpl(
3667 opener_contents, static_cast<RenderWidgetHostDelegate*>(opener_contents), 3652 opener_contents, static_cast<RenderWidgetHostDelegate*>(opener_contents),
3668 true, interstitial_url, delegate); 3653 true, interstitial_url, delegate);
3669 interstitial->Show(); 3654 interstitial->Show();
3670 WaitForInterstitialAttach(opener_contents); 3655 WaitForInterstitialAttach(opener_contents);
3671 3656
3672 // Now, navigate the opener cross-process using the popup while it still has 3657 // Now, navigate the opener cross-process using the popup while it still has
3673 // an interstitial. This should not crash. 3658 // an interstitial. This should not crash.
3674 TestNavigationObserver navigation_observer(opener_contents); 3659 TestNavigationObserver navigation_observer(opener_contents);
3675 EXPECT_TRUE( 3660 EXPECT_TRUE(ExecuteScript(popup, "navigateOpener();"));
3676 ExecuteScript(popup->web_contents(),
3677 "window.domAutomationController.send(navigateOpener());"));
3678 navigation_observer.Wait(); 3661 navigation_observer.Wait();
3679 } 3662 }
3680 3663
3681 // Check that postMessage can be sent from a subframe on a cross-process opener 3664 // Check that postMessage can be sent from a subframe on a cross-process opener
3682 // tab, and that its event.source points to a valid proxy. 3665 // tab, and that its event.source points to a valid proxy.
3683 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 3666 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
3684 PostMessageWithSubframeOnOpenerChain) { 3667 PostMessageWithSubframeOnOpenerChain) {
3685 GURL main_url(embedded_test_server()->GetURL( 3668 GURL main_url(embedded_test_server()->GetURL(
3686 "a.com", "/frame_tree/page_with_post_message_frames.html")); 3669 "a.com", "/frame_tree/page_with_post_message_frames.html"));
3687 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 3670 EXPECT_TRUE(NavigateToURL(shell(), main_url));
3688 3671
3689 // It is safe to obtain the root frame tree node here, as it doesn't change. 3672 // It is safe to obtain the root frame tree node here, as it doesn't change.
3690 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 3673 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
3691 3674
3692 ASSERT_EQ(2U, root->child_count()); 3675 ASSERT_EQ(2U, root->child_count());
3693 3676
3694 // Verify the initial state of the world. First frame should be same-site; 3677 // Verify the initial state of the world. First frame should be same-site;
3695 // second frame should be cross-site. 3678 // second frame should be cross-site.
3696 EXPECT_EQ( 3679 EXPECT_EQ(
3697 " Site A ------------ proxies for B\n" 3680 " Site A ------------ proxies for B\n"
3698 " |--Site A ------- proxies for B\n" 3681 " |--Site A ------- proxies for B\n"
3699 " +--Site B ------- proxies for A\n" 3682 " +--Site B ------- proxies for A\n"
3700 "Where A = http://a.com/\n" 3683 "Where A = http://a.com/\n"
3701 " B = http://foo.com/", 3684 " B = http://foo.com/",
3702 DepictFrameTree(root)); 3685 DepictFrameTree(root));
3703 3686
3704 // Open a popup from the first subframe (so that popup's window.opener points 3687 // Open a popup from the first subframe (so that popup's window.opener points
3705 // to the subframe) and navigate it to bar.com. 3688 // to the subframe) and navigate it to bar.com.
3706 ShellAddedObserver new_shell_observer; 3689 ShellAddedObserver new_shell_observer;
3707 EXPECT_TRUE(ExecuteScript(root->child_at(0)->current_frame_host(), 3690 EXPECT_TRUE(ExecuteScript(root->child_at(0), "openPopup('about:blank');"));
3708 "openPopup('about:blank');"));
3709 Shell* popup = new_shell_observer.GetShell(); 3691 Shell* popup = new_shell_observer.GetShell();
3710 GURL popup_url( 3692 GURL popup_url(
3711 embedded_test_server()->GetURL("bar.com", "/post_message.html")); 3693 embedded_test_server()->GetURL("bar.com", "/post_message.html"));
3712 EXPECT_TRUE(NavigateToURL(popup, popup_url)); 3694 EXPECT_TRUE(NavigateToURL(popup, popup_url));
3713 3695
3714 // From the popup, open another popup for baz.com. This will be used to 3696 // From the popup, open another popup for baz.com. This will be used to
3715 // check that the whole opener chain is processed when creating proxies and 3697 // check that the whole opener chain is processed when creating proxies and
3716 // not just an immediate opener. 3698 // not just an immediate opener.
3717 ShellAddedObserver new_shell_observer2; 3699 ShellAddedObserver new_shell_observer2;
3718 EXPECT_TRUE( 3700 EXPECT_TRUE(ExecuteScript(popup, "openPopup('about:blank');"));
3719 ExecuteScript(popup->web_contents(), "openPopup('about:blank');"));
3720 Shell* popup2 = new_shell_observer2.GetShell(); 3701 Shell* popup2 = new_shell_observer2.GetShell();
3721 GURL popup2_url( 3702 GURL popup2_url(
3722 embedded_test_server()->GetURL("baz.com", "/post_message.html")); 3703 embedded_test_server()->GetURL("baz.com", "/post_message.html"));
3723 EXPECT_TRUE(NavigateToURL(popup2, popup2_url)); 3704 EXPECT_TRUE(NavigateToURL(popup2, popup2_url));
3724 3705
3725 // Ensure that we've created proxies for SiteInstances of both popups (C, D) 3706 // Ensure that we've created proxies for SiteInstances of both popups (C, D)
3726 // in the main window's frame tree. 3707 // in the main window's frame tree.
3727 EXPECT_EQ( 3708 EXPECT_EQ(
3728 " Site A ------------ proxies for B C D\n" 3709 " Site A ------------ proxies for B C D\n"
3729 " |--Site A ------- proxies for B C D\n" 3710 " |--Site A ------- proxies for B C D\n"
(...skipping 22 matching lines...) Expand all
3752 // Send a message from first subframe on main page to the first popup and 3733 // Send a message from first subframe on main page to the first popup and
3753 // wait for a reply back. The reply verifies that the proxy for the opener 3734 // wait for a reply back. The reply verifies that the proxy for the opener
3754 // tab's subframe is targeted properly. 3735 // tab's subframe is targeted properly.
3755 PostMessageAndWaitForReply(root->child_at(0), "postToPopup('subframe-msg')", 3736 PostMessageAndWaitForReply(root->child_at(0), "postToPopup('subframe-msg')",
3756 "\"done-subframe1\""); 3737 "\"done-subframe1\"");
3757 3738
3758 // Send a postMessage from the popup to window.opener and ensure that it 3739 // Send a postMessage from the popup to window.opener and ensure that it
3759 // reaches subframe1. This verifies that the subframe opener information 3740 // reaches subframe1. This verifies that the subframe opener information
3760 // propagated to the popup's RenderFrame. Wait for subframe1 to send a reply 3741 // propagated to the popup's RenderFrame. Wait for subframe1 to send a reply
3761 // message to the popup. 3742 // message to the popup.
3762 EXPECT_TRUE(ExecuteScript(popup->web_contents(), "window.name = 'popup';")); 3743 EXPECT_TRUE(ExecuteScript(popup, "window.name = 'popup';"));
3763 PostMessageAndWaitForReply(popup_root, "postToOpener('subframe-msg', '*')", 3744 PostMessageAndWaitForReply(popup_root, "postToOpener('subframe-msg', '*')",
3764 "\"done-popup\""); 3745 "\"done-popup\"");
3765 3746
3766 // Second a postMessage from popup2 to window.opener.opener, which should 3747 // Second a postMessage from popup2 to window.opener.opener, which should
3767 // resolve to subframe1. This tests opener chains of length greater than 1. 3748 // resolve to subframe1. This tests opener chains of length greater than 1.
3768 // As before, subframe1 will send a reply to popup2. 3749 // As before, subframe1 will send a reply to popup2.
3769 FrameTreeNode* popup2_root = 3750 FrameTreeNode* popup2_root =
3770 static_cast<WebContentsImpl*>(popup2->web_contents()) 3751 static_cast<WebContentsImpl*>(popup2->web_contents())
3771 ->GetFrameTree() 3752 ->GetFrameTree()
3772 ->root(); 3753 ->root();
3773 EXPECT_TRUE(ExecuteScript(popup2->web_contents(), "window.name = 'popup2';")); 3754 EXPECT_TRUE(ExecuteScript(popup2, "window.name = 'popup2';"));
3774 PostMessageAndWaitForReply(popup2_root, 3755 PostMessageAndWaitForReply(popup2_root,
3775 "postToOpenerOfOpener('subframe-msg', '*')", 3756 "postToOpenerOfOpener('subframe-msg', '*')",
3776 "\"done-popup2\""); 3757 "\"done-popup2\"");
3777 3758
3778 // Verify the total number of received messages for each subframe: 3759 // Verify the total number of received messages for each subframe:
3779 // - 3 for first subframe (two from first popup, one from second popup) 3760 // - 3 for first subframe (two from first popup, one from second popup)
3780 // - 2 for popup (both from first subframe) 3761 // - 2 for popup (both from first subframe)
3781 // - 1 for popup2 (reply from first subframe) 3762 // - 1 for popup2 (reply from first subframe)
3782 // - 0 for other frames 3763 // - 0 for other frames
3783 EXPECT_EQ(0, GetReceivedMessages(root)); 3764 EXPECT_EQ(0, GetReceivedMessages(root));
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
3819 " +--Site D ------- proxies for A B C\n" 3800 " +--Site D ------- proxies for A B C\n"
3820 "Where A = http://a.com/\n" 3801 "Where A = http://a.com/\n"
3821 " B = http://b.com/\n" 3802 " B = http://b.com/\n"
3822 " C = http://c.com/\n" 3803 " C = http://c.com/\n"
3823 " D = http://d.com/", 3804 " D = http://d.com/",
3824 DepictFrameTree(root)); 3805 DepictFrameTree(root));
3825 3806
3826 // Check that each subframe sees itself at correct index in parent.frames. 3807 // Check that each subframe sees itself at correct index in parent.frames.
3827 bool success = false; 3808 bool success = false;
3828 EXPECT_TRUE(ExecuteScriptAndExtractBool( 3809 EXPECT_TRUE(ExecuteScriptAndExtractBool(
3829 child0->current_frame_host(), 3810 child0,
3830 "window.domAutomationController.send(window === parent.frames[0]);", 3811 "window.domAutomationController.send(window === parent.frames[0]);",
3831 &success)); 3812 &success));
3832 EXPECT_TRUE(success); 3813 EXPECT_TRUE(success);
3833 3814
3834 success = false; 3815 success = false;
3835 EXPECT_TRUE(ExecuteScriptAndExtractBool( 3816 EXPECT_TRUE(ExecuteScriptAndExtractBool(
3836 child1->current_frame_host(), 3817 child1,
3837 "window.domAutomationController.send(window === parent.frames[1]);", 3818 "window.domAutomationController.send(window === parent.frames[1]);",
3838 &success)); 3819 &success));
3839 EXPECT_TRUE(success); 3820 EXPECT_TRUE(success);
3840 3821
3841 success = false; 3822 success = false;
3842 EXPECT_TRUE(ExecuteScriptAndExtractBool( 3823 EXPECT_TRUE(ExecuteScriptAndExtractBool(
3843 child2->current_frame_host(), 3824 child2,
3844 "window.domAutomationController.send(window === parent.frames[2]);", 3825 "window.domAutomationController.send(window === parent.frames[2]);",
3845 &success)); 3826 &success));
3846 EXPECT_TRUE(success); 3827 EXPECT_TRUE(success);
3847 3828
3848 // Send a postMessage from B to parent.frames[1], which should go to C, and 3829 // Send a postMessage from B to parent.frames[1], which should go to C, and
3849 // wait for reply. 3830 // wait for reply.
3850 PostMessageAndWaitForReply(child0, "postToSibling('subframe-msg', 1)", 3831 PostMessageAndWaitForReply(child0, "postToSibling('subframe-msg', 1)",
3851 "\"done-1-1-name\""); 3832 "\"done-1-1-name\"");
3852 3833
3853 // Send a postMessage from C to parent.frames[2], which should go to D, and 3834 // Send a postMessage from C to parent.frames[2], which should go to D, and
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
3929 NavigateToURL(shell(), main_url); 3910 NavigateToURL(shell(), main_url);
3930 3911
3931 // It is safe to obtain the root frame tree node here, as it doesn't change. 3912 // It is safe to obtain the root frame tree node here, as it doesn't change.
3932 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 3913 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
3933 3914
3934 // Navigate first child cross-site. 3915 // Navigate first child cross-site.
3935 GURL frame_url(embedded_test_server()->GetURL("b.com", "/title1.html")); 3916 GURL frame_url(embedded_test_server()->GetURL("b.com", "/title1.html"));
3936 NavigateFrameToURL(root->child_at(0), frame_url); 3917 NavigateFrameToURL(root->child_at(0), frame_url);
3937 3918
3938 // Open a popup from the first child. 3919 // Open a popup from the first child.
3939 Shell* new_shell = OpenPopup(root->child_at(0)->current_frame_host(), 3920 Shell* new_shell =
3940 GURL(url::kAboutBlankURL), ""); 3921 OpenPopup(root->child_at(0), GURL(url::kAboutBlankURL), "");
3941 EXPECT_TRUE(new_shell); 3922 EXPECT_TRUE(new_shell);
3942 3923
3943 // Check that the popup's opener is correct on both the browser and renderer 3924 // Check that the popup's opener is correct on both the browser and renderer
3944 // sides. 3925 // sides.
3945 FrameTreeNode* popup_root = 3926 FrameTreeNode* popup_root =
3946 static_cast<WebContentsImpl*>(new_shell->web_contents()) 3927 static_cast<WebContentsImpl*>(new_shell->web_contents())
3947 ->GetFrameTree() 3928 ->GetFrameTree()
3948 ->root(); 3929 ->root();
3949 EXPECT_EQ(root->child_at(0), popup_root->opener()); 3930 EXPECT_EQ(root->child_at(0), popup_root->opener());
3950 3931
3951 std::string opener_url; 3932 std::string opener_url;
3952 EXPECT_TRUE(ExecuteScriptAndExtractString( 3933 EXPECT_TRUE(ExecuteScriptAndExtractString(
3953 popup_root->current_frame_host(), 3934 popup_root,
3954 "window.domAutomationController.send(window.opener.location.href);", 3935 "window.domAutomationController.send(window.opener.location.href);",
3955 &opener_url)); 3936 &opener_url));
3956 EXPECT_EQ(frame_url.spec(), opener_url); 3937 EXPECT_EQ(frame_url.spec(), opener_url);
3957 3938
3958 // Now try the same with a cross-site popup and make sure it ends up in a new 3939 // Now try the same with a cross-site popup and make sure it ends up in a new
3959 // process and with a correct opener. 3940 // process and with a correct opener.
3960 GURL popup_url(embedded_test_server()->GetURL("c.com", "/title2.html")); 3941 GURL popup_url(embedded_test_server()->GetURL("c.com", "/title2.html"));
3961 Shell* cross_site_popup = 3942 Shell* cross_site_popup = OpenPopup(root->child_at(0), popup_url, "");
3962 OpenPopup(root->child_at(0)->current_frame_host(), popup_url, "");
3963 EXPECT_TRUE(cross_site_popup); 3943 EXPECT_TRUE(cross_site_popup);
3964 3944
3965 FrameTreeNode* cross_site_popup_root = 3945 FrameTreeNode* cross_site_popup_root =
3966 static_cast<WebContentsImpl*>(cross_site_popup->web_contents()) 3946 static_cast<WebContentsImpl*>(cross_site_popup->web_contents())
3967 ->GetFrameTree() 3947 ->GetFrameTree()
3968 ->root(); 3948 ->root();
3969 EXPECT_EQ(cross_site_popup_root->current_url(), popup_url); 3949 EXPECT_EQ(cross_site_popup_root->current_url(), popup_url);
3970 3950
3971 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), 3951 EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
3972 cross_site_popup->web_contents()->GetSiteInstance()); 3952 cross_site_popup->web_contents()->GetSiteInstance());
3973 EXPECT_NE(root->child_at(0)->current_frame_host()->GetSiteInstance(), 3953 EXPECT_NE(root->child_at(0)->current_frame_host()->GetSiteInstance(),
3974 cross_site_popup->web_contents()->GetSiteInstance()); 3954 cross_site_popup->web_contents()->GetSiteInstance());
3975 3955
3976 EXPECT_EQ(root->child_at(0), cross_site_popup_root->opener()); 3956 EXPECT_EQ(root->child_at(0), cross_site_popup_root->opener());
3977 3957
3978 // Ensure the popup's window.opener points to the right subframe. Note that 3958 // Ensure the popup's window.opener points to the right subframe. Note that
3979 // we can't check the opener's location as above since it's cross-origin. 3959 // we can't check the opener's location as above since it's cross-origin.
3980 bool success = false; 3960 bool success = false;
3981 EXPECT_TRUE(ExecuteScriptAndExtractBool( 3961 EXPECT_TRUE(ExecuteScriptAndExtractBool(
3982 cross_site_popup_root->current_frame_host(), 3962 cross_site_popup_root,
3983 "window.domAutomationController.send(" 3963 "window.domAutomationController.send("
3984 " window.opener === window.opener.top.frames[0]);", 3964 " window.opener === window.opener.top.frames[0]);",
3985 &success)); 3965 &success));
3986 EXPECT_TRUE(success); 3966 EXPECT_TRUE(success);
3987 } 3967 }
3988 3968
3989 // Test that cross-process popups can't be navigated to disallowed URLs by 3969 // Test that cross-process popups can't be navigated to disallowed URLs by
3990 // their opener. This ensures that proper URL validation is performed when 3970 // their opener. This ensures that proper URL validation is performed when
3991 // RenderFrameProxyHosts are navigated. See https://crbug.com/595339. 3971 // RenderFrameProxyHosts are navigated. See https://crbug.com/595339.
3992 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, NavigatePopupToIllegalURL) { 3972 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, NavigatePopupToIllegalURL) {
3993 GURL main_url(embedded_test_server()->GetURL("a.com", "/title1.html")); 3973 GURL main_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
3994 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 3974 EXPECT_TRUE(NavigateToURL(shell(), main_url));
3995 3975
3996 // Open a cross-site popup. 3976 // Open a cross-site popup.
3997 GURL popup_url(embedded_test_server()->GetURL("b.com", "/title2.html")); 3977 GURL popup_url(embedded_test_server()->GetURL("b.com", "/title2.html"));
3998 Shell* popup = OpenPopup(shell()->web_contents(), popup_url, "foo"); 3978 Shell* popup = OpenPopup(shell(), popup_url, "foo");
3999 EXPECT_TRUE(popup); 3979 EXPECT_TRUE(popup);
4000 EXPECT_NE(popup->web_contents()->GetSiteInstance(), 3980 EXPECT_NE(popup->web_contents()->GetSiteInstance(),
4001 shell()->web_contents()->GetSiteInstance()); 3981 shell()->web_contents()->GetSiteInstance());
4002 3982
4003 // From the opener, navigate the popup to a file:/// URL. This should be 3983 // From the opener, navigate the popup to a file:/// URL. This should be
4004 // disallowed and result in an about:blank navigation. 3984 // disallowed and result in an about:blank navigation.
4005 GURL file_url("file:///"); 3985 GURL file_url("file:///");
4006 NavigateNamedFrame(shell()->web_contents(), file_url, "foo"); 3986 NavigateNamedFrame(shell(), file_url, "foo");
4007 EXPECT_TRUE(WaitForLoadStop(popup->web_contents())); 3987 EXPECT_TRUE(WaitForLoadStop(popup->web_contents()));
4008 EXPECT_EQ(GURL(url::kAboutBlankURL), 3988 EXPECT_EQ(GURL(url::kAboutBlankURL),
4009 popup->web_contents()->GetLastCommittedURL()); 3989 popup->web_contents()->GetLastCommittedURL());
4010 3990
4011 // Navigate popup back to a cross-site URL. 3991 // Navigate popup back to a cross-site URL.
4012 EXPECT_TRUE(NavigateToURL(popup, popup_url)); 3992 EXPECT_TRUE(NavigateToURL(popup, popup_url));
4013 EXPECT_NE(popup->web_contents()->GetSiteInstance(), 3993 EXPECT_NE(popup->web_contents()->GetSiteInstance(),
4014 shell()->web_contents()->GetSiteInstance()); 3994 shell()->web_contents()->GetSiteInstance());
4015 3995
4016 // Now try the same test with a chrome:// URL. 3996 // Now try the same test with a chrome:// URL.
4017 GURL chrome_url(std::string(kChromeUIScheme) + "://" + 3997 GURL chrome_url(std::string(kChromeUIScheme) + "://" +
4018 std::string(kChromeUIGpuHost)); 3998 std::string(kChromeUIGpuHost));
4019 NavigateNamedFrame(shell()->web_contents(), chrome_url, "foo"); 3999 NavigateNamedFrame(shell(), chrome_url, "foo");
4020 EXPECT_TRUE(WaitForLoadStop(popup->web_contents())); 4000 EXPECT_TRUE(WaitForLoadStop(popup->web_contents()));
4021 EXPECT_EQ(GURL(url::kAboutBlankURL), 4001 EXPECT_EQ(GURL(url::kAboutBlankURL),
4022 popup->web_contents()->GetLastCommittedURL()); 4002 popup->web_contents()->GetLastCommittedURL());
4023 } 4003 }
4024 4004
4025 // Verify that named frames are discoverable from their opener's ancestors. 4005 // Verify that named frames are discoverable from their opener's ancestors.
4026 // See https://crbug.com/511474. 4006 // See https://crbug.com/511474.
4027 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 4007 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
4028 DiscoverNamedFrameFromAncestorOfOpener) { 4008 DiscoverNamedFrameFromAncestorOfOpener) {
4029 GURL main_url( 4009 GURL main_url(
4030 embedded_test_server()->GetURL("a.com", "/site_per_process_main.html")); 4010 embedded_test_server()->GetURL("a.com", "/site_per_process_main.html"));
4031 NavigateToURL(shell(), main_url); 4011 NavigateToURL(shell(), main_url);
4032 4012
4033 // It is safe to obtain the root frame tree node here, as it doesn't change. 4013 // It is safe to obtain the root frame tree node here, as it doesn't change.
4034 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 4014 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
4035 4015
4036 // Navigate first child cross-site. 4016 // Navigate first child cross-site.
4037 GURL frame_url(embedded_test_server()->GetURL("b.com", "/title1.html")); 4017 GURL frame_url(embedded_test_server()->GetURL("b.com", "/title1.html"));
4038 NavigateFrameToURL(root->child_at(0), frame_url); 4018 NavigateFrameToURL(root->child_at(0), frame_url);
4039 4019
4040 // Open a popup named "foo" from the first child. 4020 // Open a popup named "foo" from the first child.
4041 Shell* foo_shell = OpenPopup(root->child_at(0)->current_frame_host(), 4021 Shell* foo_shell =
4042 GURL(url::kAboutBlankURL), "foo"); 4022 OpenPopup(root->child_at(0), GURL(url::kAboutBlankURL), "foo");
4043 EXPECT_TRUE(foo_shell); 4023 EXPECT_TRUE(foo_shell);
4044 4024
4045 // Check that a proxy was created for the "foo" popup in a.com. 4025 // Check that a proxy was created for the "foo" popup in a.com.
4046 FrameTreeNode* foo_root = 4026 FrameTreeNode* foo_root =
4047 static_cast<WebContentsImpl*>(foo_shell->web_contents()) 4027 static_cast<WebContentsImpl*>(foo_shell->web_contents())
4048 ->GetFrameTree() 4028 ->GetFrameTree()
4049 ->root(); 4029 ->root();
4050 SiteInstance* site_instance_a = root->current_frame_host()->GetSiteInstance(); 4030 SiteInstance* site_instance_a = root->current_frame_host()->GetSiteInstance();
4051 RenderFrameProxyHost* popup_rfph_for_a = 4031 RenderFrameProxyHost* popup_rfph_for_a =
4052 foo_root->render_manager()->GetRenderFrameProxyHost(site_instance_a); 4032 foo_root->render_manager()->GetRenderFrameProxyHost(site_instance_a);
4053 EXPECT_TRUE(popup_rfph_for_a); 4033 EXPECT_TRUE(popup_rfph_for_a);
4054 4034
4055 // Verify that the main frame can find the "foo" popup by name. If 4035 // Verify that the main frame can find the "foo" popup by name. If
4056 // window.open targets the correct frame, the "foo" popup's current URL 4036 // window.open targets the correct frame, the "foo" popup's current URL
4057 // should be updated to |named_frame_url|. 4037 // should be updated to |named_frame_url|.
4058 GURL named_frame_url(embedded_test_server()->GetURL("c.com", "/title2.html")); 4038 GURL named_frame_url(embedded_test_server()->GetURL("c.com", "/title2.html"));
4059 NavigateNamedFrame(shell()->web_contents(), named_frame_url, "foo"); 4039 NavigateNamedFrame(shell(), named_frame_url, "foo");
4060 EXPECT_TRUE(WaitForLoadStop(foo_shell->web_contents())); 4040 EXPECT_TRUE(WaitForLoadStop(foo_shell->web_contents()));
4061 EXPECT_EQ(named_frame_url, foo_root->current_url()); 4041 EXPECT_EQ(named_frame_url, foo_root->current_url());
4062 4042
4063 // Navigate the popup cross-site and ensure it's still reachable via 4043 // Navigate the popup cross-site and ensure it's still reachable via
4064 // window.open from the main frame. 4044 // window.open from the main frame.
4065 GURL d_url(embedded_test_server()->GetURL("d.com", "/title3.html")); 4045 GURL d_url(embedded_test_server()->GetURL("d.com", "/title3.html"));
4066 NavigateToURL(foo_shell, d_url); 4046 NavigateToURL(foo_shell, d_url);
4067 EXPECT_EQ(d_url, foo_root->current_url()); 4047 EXPECT_EQ(d_url, foo_root->current_url());
4068 NavigateNamedFrame(shell()->web_contents(), named_frame_url, "foo"); 4048 NavigateNamedFrame(shell(), named_frame_url, "foo");
4069 EXPECT_TRUE(WaitForLoadStop(foo_shell->web_contents())); 4049 EXPECT_TRUE(WaitForLoadStop(foo_shell->web_contents()));
4070 EXPECT_EQ(named_frame_url, foo_root->current_url()); 4050 EXPECT_EQ(named_frame_url, foo_root->current_url());
4071 } 4051 }
4072 4052
4073 // Similar to DiscoverNamedFrameFromAncestorOfOpener, but check that if a 4053 // Similar to DiscoverNamedFrameFromAncestorOfOpener, but check that if a
4074 // window is created without a name and acquires window.name later, it will 4054 // window is created without a name and acquires window.name later, it will
4075 // still be discoverable from its opener's ancestors. Also, instead of using 4055 // still be discoverable from its opener's ancestors. Also, instead of using
4076 // an opener's ancestor, this test uses a popup with same origin as that 4056 // an opener's ancestor, this test uses a popup with same origin as that
4077 // ancestor. See https://crbug.com/511474. 4057 // ancestor. See https://crbug.com/511474.
4078 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 4058 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
4079 DiscoverFrameAfterSettingWindowName) { 4059 DiscoverFrameAfterSettingWindowName) {
4080 GURL main_url( 4060 GURL main_url(
4081 embedded_test_server()->GetURL("a.com", "/site_per_process_main.html")); 4061 embedded_test_server()->GetURL("a.com", "/site_per_process_main.html"));
4082 NavigateToURL(shell(), main_url); 4062 NavigateToURL(shell(), main_url);
4083 4063
4084 // It is safe to obtain the root frame tree node here, as it doesn't change. 4064 // It is safe to obtain the root frame tree node here, as it doesn't change.
4085 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 4065 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
4086 4066
4087 // Open a same-site popup from the main frame. 4067 // Open a same-site popup from the main frame.
4088 GURL a_com_url(embedded_test_server()->GetURL("a.com", "/title3.html")); 4068 GURL a_com_url(embedded_test_server()->GetURL("a.com", "/title3.html"));
4089 Shell* a_com_shell = 4069 Shell* a_com_shell = OpenPopup(root->child_at(0), a_com_url, "");
4090 OpenPopup(root->child_at(0)->current_frame_host(), a_com_url, "");
4091 EXPECT_TRUE(a_com_shell); 4070 EXPECT_TRUE(a_com_shell);
4092 4071
4093 // Navigate first child on main frame cross-site. 4072 // Navigate first child on main frame cross-site.
4094 GURL frame_url(embedded_test_server()->GetURL("b.com", "/title1.html")); 4073 GURL frame_url(embedded_test_server()->GetURL("b.com", "/title1.html"));
4095 NavigateFrameToURL(root->child_at(0), frame_url); 4074 NavigateFrameToURL(root->child_at(0), frame_url);
4096 4075
4097 // Open an unnamed popup from the first child frame. 4076 // Open an unnamed popup from the first child frame.
4098 Shell* foo_shell = OpenPopup(root->child_at(0)->current_frame_host(), 4077 Shell* foo_shell =
4099 GURL(url::kAboutBlankURL), ""); 4078 OpenPopup(root->child_at(0), GURL(url::kAboutBlankURL), "");
4100 EXPECT_TRUE(foo_shell); 4079 EXPECT_TRUE(foo_shell);
4101 4080
4102 // There should be no proxy created for the "foo" popup in a.com, since 4081 // There should be no proxy created for the "foo" popup in a.com, since
4103 // there's no way for the two a.com frames to access it yet. 4082 // there's no way for the two a.com frames to access it yet.
4104 FrameTreeNode* foo_root = 4083 FrameTreeNode* foo_root =
4105 static_cast<WebContentsImpl*>(foo_shell->web_contents()) 4084 static_cast<WebContentsImpl*>(foo_shell->web_contents())
4106 ->GetFrameTree() 4085 ->GetFrameTree()
4107 ->root(); 4086 ->root();
4108 SiteInstance* site_instance_a = root->current_frame_host()->GetSiteInstance(); 4087 SiteInstance* site_instance_a = root->current_frame_host()->GetSiteInstance();
4109 EXPECT_FALSE( 4088 EXPECT_FALSE(
4110 foo_root->render_manager()->GetRenderFrameProxyHost(site_instance_a)); 4089 foo_root->render_manager()->GetRenderFrameProxyHost(site_instance_a));
4111 4090
4112 // Set window.name in the popup's frame. 4091 // Set window.name in the popup's frame.
4113 EXPECT_TRUE(ExecuteScript(foo_shell->web_contents(), "window.name = 'foo'")); 4092 EXPECT_TRUE(ExecuteScript(foo_shell, "window.name = 'foo'"));
4114 4093
4115 // A proxy for the popup should now exist in a.com. 4094 // A proxy for the popup should now exist in a.com.
4116 EXPECT_TRUE( 4095 EXPECT_TRUE(
4117 foo_root->render_manager()->GetRenderFrameProxyHost(site_instance_a)); 4096 foo_root->render_manager()->GetRenderFrameProxyHost(site_instance_a));
4118 4097
4119 // Verify that the a.com popup can now find the "foo" popup by name. 4098 // Verify that the a.com popup can now find the "foo" popup by name.
4120 GURL named_frame_url(embedded_test_server()->GetURL("c.com", "/title2.html")); 4099 GURL named_frame_url(embedded_test_server()->GetURL("c.com", "/title2.html"));
4121 NavigateNamedFrame(a_com_shell->web_contents(), named_frame_url, "foo"); 4100 NavigateNamedFrame(a_com_shell, named_frame_url, "foo");
4122 EXPECT_TRUE(WaitForLoadStop(foo_shell->web_contents())); 4101 EXPECT_TRUE(WaitForLoadStop(foo_shell->web_contents()));
4123 EXPECT_EQ(named_frame_url, foo_root->current_url()); 4102 EXPECT_EQ(named_frame_url, foo_root->current_url());
4124 } 4103 }
4125 4104
4126 // Check that frame opener updates work with subframes. Set up a window with a 4105 // Check that frame opener updates work with subframes. Set up a window with a
4127 // popup and update openers for the popup's main frame and subframe to 4106 // popup and update openers for the popup's main frame and subframe to
4128 // subframes on first window, as follows: 4107 // subframes on first window, as follows:
4129 // 4108 //
4130 // foo +---- bar 4109 // foo +---- bar
4131 // / \ | / \ . 4110 // / \ | / \ .
4132 // bar foo <-+ bar foo 4111 // bar foo <-+ bar foo
4133 // ^ | 4112 // ^ |
4134 // +--------------------+ 4113 // +--------------------+
4135 // 4114 //
4136 // The sites are carefully set up so that both opener updates are cross-process 4115 // The sites are carefully set up so that both opener updates are cross-process
4137 // but still allowed by Blink's navigation checks. 4116 // but still allowed by Blink's navigation checks.
4138 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, UpdateSubframeOpener) { 4117 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, UpdateSubframeOpener) {
4139 GURL main_url = embedded_test_server()->GetURL( 4118 GURL main_url = embedded_test_server()->GetURL(
4140 "foo.com", "/frame_tree/page_with_two_frames.html"); 4119 "foo.com", "/frame_tree/page_with_two_frames.html");
4141 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 4120 EXPECT_TRUE(NavigateToURL(shell(), main_url));
4142 4121
4143 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 4122 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
4144 EXPECT_EQ(2U, root->child_count()); 4123 EXPECT_EQ(2U, root->child_count());
4145 4124
4146 // From the top frame, open a popup and navigate it to a cross-site page with 4125 // From the top frame, open a popup and navigate it to a cross-site page with
4147 // two subframes. 4126 // two subframes.
4148 Shell* popup_shell = 4127 Shell* popup_shell = OpenPopup(shell(), GURL(url::kAboutBlankURL), "popup");
4149 OpenPopup(shell()->web_contents(), GURL(url::kAboutBlankURL), "popup");
4150 EXPECT_TRUE(popup_shell); 4128 EXPECT_TRUE(popup_shell);
4151 GURL popup_url(embedded_test_server()->GetURL( 4129 GURL popup_url(embedded_test_server()->GetURL(
4152 "bar.com", "/frame_tree/page_with_post_message_frames.html")); 4130 "bar.com", "/frame_tree/page_with_post_message_frames.html"));
4153 NavigateToURL(popup_shell, popup_url); 4131 NavigateToURL(popup_shell, popup_url);
4154 4132
4155 FrameTreeNode* popup_root = 4133 FrameTreeNode* popup_root =
4156 static_cast<WebContentsImpl*>(popup_shell->web_contents()) 4134 static_cast<WebContentsImpl*>(popup_shell->web_contents())
4157 ->GetFrameTree() 4135 ->GetFrameTree()
4158 ->root(); 4136 ->root();
4159 EXPECT_EQ(2U, popup_root->child_count()); 4137 EXPECT_EQ(2U, popup_root->child_count());
4160 4138
4161 // Popup's opener should point to main frame to start with. 4139 // Popup's opener should point to main frame to start with.
4162 EXPECT_EQ(root, popup_root->opener()); 4140 EXPECT_EQ(root, popup_root->opener());
4163 4141
4164 // Update the popup's opener to the second subframe on the main page (which 4142 // Update the popup's opener to the second subframe on the main page (which
4165 // is same-origin with the top frame, i.e., foo.com). 4143 // is same-origin with the top frame, i.e., foo.com).
4166 bool success = false; 4144 bool success = false;
4167 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4145 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4168 root->child_at(1)->current_frame_host(), 4146 root->child_at(1),
4169 "window.domAutomationController.send(!!window.open('','popup'));", 4147 "window.domAutomationController.send(!!window.open('','popup'));",
4170 &success)); 4148 &success));
4171 EXPECT_TRUE(success); 4149 EXPECT_TRUE(success);
4172 4150
4173 // Check that updated opener propagated to the browser process and the 4151 // Check that updated opener propagated to the browser process and the
4174 // popup's bar.com process. 4152 // popup's bar.com process.
4175 EXPECT_EQ(root->child_at(1), popup_root->opener()); 4153 EXPECT_EQ(root->child_at(1), popup_root->opener());
4176 4154
4177 success = false; 4155 success = false;
4178 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4156 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4179 popup_shell->web_contents(), 4157 popup_shell,
4180 "window.domAutomationController.send(" 4158 "window.domAutomationController.send("
4181 " window.opener === window.opener.parent.frames['frame2']);", 4159 " window.opener === window.opener.parent.frames['frame2']);",
4182 &success)); 4160 &success));
4183 EXPECT_TRUE(success); 4161 EXPECT_TRUE(success);
4184 4162
4185 // Now update opener on the popup's second subframe (foo.com) to the main 4163 // Now update opener on the popup's second subframe (foo.com) to the main
4186 // page's first subframe (bar.com). 4164 // page's first subframe (bar.com).
4187 success = false; 4165 success = false;
4188 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4166 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4189 root->child_at(0)->current_frame_host(), 4167 root->child_at(0),
4190 "window.domAutomationController.send(!!window.open('','subframe2'));", 4168 "window.domAutomationController.send(!!window.open('','subframe2'));",
4191 &success)); 4169 &success));
4192 EXPECT_TRUE(success); 4170 EXPECT_TRUE(success);
4193 4171
4194 // Check that updated opener propagated to the browser process and the 4172 // Check that updated opener propagated to the browser process and the
4195 // foo.com process. 4173 // foo.com process.
4196 EXPECT_EQ(root->child_at(0), popup_root->child_at(1)->opener()); 4174 EXPECT_EQ(root->child_at(0), popup_root->child_at(1)->opener());
4197 4175
4198 success = false; 4176 success = false;
4199 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4177 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4200 popup_root->child_at(1)->current_frame_host(), 4178 popup_root->child_at(1),
4201 "window.domAutomationController.send(" 4179 "window.domAutomationController.send("
4202 " window.opener === window.opener.parent.frames['frame1']);", 4180 " window.opener === window.opener.parent.frames['frame1']);",
4203 &success)); 4181 &success));
4204 EXPECT_TRUE(success); 4182 EXPECT_TRUE(success);
4205 } 4183 }
4206 4184
4207 // Check that when a subframe navigates to a new SiteInstance, the new 4185 // Check that when a subframe navigates to a new SiteInstance, the new
4208 // SiteInstance will get a proxy for the opener of subframe's parent. I.e., 4186 // SiteInstance will get a proxy for the opener of subframe's parent. I.e.,
4209 // accessing parent.opener from the subframe should still work after a 4187 // accessing parent.opener from the subframe should still work after a
4210 // cross-process navigation. 4188 // cross-process navigation.
4211 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 4189 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
4212 NavigatingSubframePreservesOpenerInParent) { 4190 NavigatingSubframePreservesOpenerInParent) {
4213 GURL main_url = embedded_test_server()->GetURL("a.com", "/post_message.html"); 4191 GURL main_url = embedded_test_server()->GetURL("a.com", "/post_message.html");
4214 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 4192 EXPECT_TRUE(NavigateToURL(shell(), main_url));
4215 4193
4216 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 4194 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
4217 4195
4218 // Open a popup with a cross-site page that has a subframe. 4196 // Open a popup with a cross-site page that has a subframe.
4219 GURL popup_url(embedded_test_server()->GetURL( 4197 GURL popup_url(embedded_test_server()->GetURL(
4220 "b.com", "/cross_site_iframe_factory.html?b(b)")); 4198 "b.com", "/cross_site_iframe_factory.html?b(b)"));
4221 Shell* popup_shell = OpenPopup(shell()->web_contents(), popup_url, "popup"); 4199 Shell* popup_shell = OpenPopup(shell(), popup_url, "popup");
4222 EXPECT_TRUE(popup_shell); 4200 EXPECT_TRUE(popup_shell);
4223 FrameTreeNode* popup_root = 4201 FrameTreeNode* popup_root =
4224 static_cast<WebContentsImpl*>(popup_shell->web_contents()) 4202 static_cast<WebContentsImpl*>(popup_shell->web_contents())
4225 ->GetFrameTree() 4203 ->GetFrameTree()
4226 ->root(); 4204 ->root();
4227 EXPECT_EQ(1U, popup_root->child_count()); 4205 EXPECT_EQ(1U, popup_root->child_count());
4228 4206
4229 // Check that the popup's opener is correct in the browser process. 4207 // Check that the popup's opener is correct in the browser process.
4230 EXPECT_EQ(root, popup_root->opener()); 4208 EXPECT_EQ(root, popup_root->opener());
4231 4209
4232 // Navigate popup's subframe to another site. 4210 // Navigate popup's subframe to another site.
4233 GURL frame_url(embedded_test_server()->GetURL("c.com", "/post_message.html")); 4211 GURL frame_url(embedded_test_server()->GetURL("c.com", "/post_message.html"));
4234 NavigateFrameToURL(popup_root->child_at(0), frame_url); 4212 NavigateFrameToURL(popup_root->child_at(0), frame_url);
4235 4213
4236 // Check that the new subframe process still sees correct opener for its 4214 // Check that the new subframe process still sees correct opener for its
4237 // parent by sending a postMessage to subframe's parent.opener. 4215 // parent by sending a postMessage to subframe's parent.opener.
4238 bool success = false; 4216 bool success = false;
4239 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4217 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4240 popup_root->child_at(0)->current_frame_host(), 4218 popup_root->child_at(0),
4241 "window.domAutomationController.send(!!parent.opener);", &success)); 4219 "window.domAutomationController.send(!!parent.opener);", &success));
4242 EXPECT_TRUE(success); 4220 EXPECT_TRUE(success);
4243 4221
4244 base::string16 expected_title = base::ASCIIToUTF16("msg"); 4222 base::string16 expected_title = base::ASCIIToUTF16("msg");
4245 TitleWatcher title_watcher(shell()->web_contents(), expected_title); 4223 TitleWatcher title_watcher(shell()->web_contents(), expected_title);
4246 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4224 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4247 popup_root->child_at(0)->current_frame_host(), 4225 popup_root->child_at(0),
4248 "window.domAutomationController.send(postToOpenerOfParent('msg','*'));", 4226 "window.domAutomationController.send(postToOpenerOfParent('msg','*'));",
4249 &success)); 4227 &success));
4250 EXPECT_TRUE(success); 4228 EXPECT_TRUE(success);
4251 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 4229 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
4252 } 4230 }
4253 4231
4254 // Check that if a subframe has an opener, that opener is preserved when the 4232 // Check that if a subframe has an opener, that opener is preserved when the
4255 // subframe navigates cross-site. 4233 // subframe navigates cross-site.
4256 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, NavigateSubframeWithOpener) { 4234 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, NavigateSubframeWithOpener) {
4257 GURL main_url(embedded_test_server()->GetURL( 4235 GURL main_url(embedded_test_server()->GetURL(
4258 "foo.com", "/frame_tree/page_with_two_frames.html")); 4236 "foo.com", "/frame_tree/page_with_two_frames.html"));
4259 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 4237 EXPECT_TRUE(NavigateToURL(shell(), main_url));
4260 4238
4261 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 4239 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
4262 EXPECT_EQ( 4240 EXPECT_EQ(
4263 " Site A ------------ proxies for B\n" 4241 " Site A ------------ proxies for B\n"
4264 " |--Site B ------- proxies for A\n" 4242 " |--Site B ------- proxies for A\n"
4265 " +--Site A ------- proxies for B\n" 4243 " +--Site A ------- proxies for B\n"
4266 "Where A = http://foo.com/\n" 4244 "Where A = http://foo.com/\n"
4267 " B = http://bar.com/", 4245 " B = http://bar.com/",
4268 DepictFrameTree(root)); 4246 DepictFrameTree(root));
4269 4247
4270 // Update the first (cross-site) subframe's opener to root frame. 4248 // Update the first (cross-site) subframe's opener to root frame.
4271 bool success = false; 4249 bool success = false;
4272 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4250 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4273 root->current_frame_host(), 4251 root, "window.domAutomationController.send(!!window.open('','frame1'));",
4274 "window.domAutomationController.send(!!window.open('','frame1'));",
4275 &success)); 4252 &success));
4276 EXPECT_TRUE(success); 4253 EXPECT_TRUE(success);
4277 4254
4278 // Check that updated opener propagated to the browser process and subframe's 4255 // Check that updated opener propagated to the browser process and subframe's
4279 // process. 4256 // process.
4280 EXPECT_EQ(root, root->child_at(0)->opener()); 4257 EXPECT_EQ(root, root->child_at(0)->opener());
4281 4258
4282 success = false; 4259 success = false;
4283 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4260 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4284 root->child_at(0)->current_frame_host(), 4261 root->child_at(0),
4285 "window.domAutomationController.send(window.opener === window.parent);", 4262 "window.domAutomationController.send(window.opener === window.parent);",
4286 &success)); 4263 &success));
4287 EXPECT_TRUE(success); 4264 EXPECT_TRUE(success);
4288 4265
4289 // Navigate the subframe with opener to another site. 4266 // Navigate the subframe with opener to another site.
4290 GURL frame_url(embedded_test_server()->GetURL("baz.com", "/title1.html")); 4267 GURL frame_url(embedded_test_server()->GetURL("baz.com", "/title1.html"));
4291 NavigateFrameToURL(root->child_at(0), frame_url); 4268 NavigateFrameToURL(root->child_at(0), frame_url);
4292 4269
4293 // Check that the subframe still sees correct opener in its new process. 4270 // Check that the subframe still sees correct opener in its new process.
4294 success = false; 4271 success = false;
4295 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4272 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4296 root->child_at(0)->current_frame_host(), 4273 root->child_at(0),
4297 "window.domAutomationController.send(window.opener === window.parent);", 4274 "window.domAutomationController.send(window.opener === window.parent);",
4298 &success)); 4275 &success));
4299 EXPECT_TRUE(success); 4276 EXPECT_TRUE(success);
4300 4277
4301 // Navigate second subframe to a new site. Check that the proxy that's 4278 // Navigate second subframe to a new site. Check that the proxy that's
4302 // created for the first subframe in the new SiteInstance has correct opener. 4279 // created for the first subframe in the new SiteInstance has correct opener.
4303 GURL frame2_url(embedded_test_server()->GetURL("qux.com", "/title1.html")); 4280 GURL frame2_url(embedded_test_server()->GetURL("qux.com", "/title1.html"));
4304 NavigateFrameToURL(root->child_at(1), frame2_url); 4281 NavigateFrameToURL(root->child_at(1), frame2_url);
4305 4282
4306 success = false; 4283 success = false;
4307 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4284 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4308 root->child_at(1)->current_frame_host(), 4285 root->child_at(1),
4309 "window.domAutomationController.send(" 4286 "window.domAutomationController.send("
4310 " parent.frames['frame1'].opener === parent);", 4287 " parent.frames['frame1'].opener === parent);",
4311 &success)); 4288 &success));
4312 EXPECT_TRUE(success); 4289 EXPECT_TRUE(success);
4313 } 4290 }
4314 4291
4315 // Check that if a subframe has an opener, that opener is preserved when a new 4292 // Check that if a subframe has an opener, that opener is preserved when a new
4316 // RenderFrameProxy is created for that subframe in another renderer process. 4293 // RenderFrameProxy is created for that subframe in another renderer process.
4317 // Similar to NavigateSubframeWithOpener, but this test verifies the subframe 4294 // Similar to NavigateSubframeWithOpener, but this test verifies the subframe
4318 // opener plumbing for FrameMsg_NewFrameProxy, whereas 4295 // opener plumbing for FrameMsg_NewFrameProxy, whereas
4319 // NavigateSubframeWithOpener targets FrameMsg_NewFrame. 4296 // NavigateSubframeWithOpener targets FrameMsg_NewFrame.
4320 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 4297 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
4321 NewRenderFrameProxyPreservesOpener) { 4298 NewRenderFrameProxyPreservesOpener) {
4322 GURL main_url( 4299 GURL main_url(
4323 embedded_test_server()->GetURL("foo.com", "/post_message.html")); 4300 embedded_test_server()->GetURL("foo.com", "/post_message.html"));
4324 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 4301 EXPECT_TRUE(NavigateToURL(shell(), main_url));
4325 4302
4326 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 4303 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
4327 4304
4328 // Open a popup with a cross-site page that has two subframes. 4305 // Open a popup with a cross-site page that has two subframes.
4329 GURL popup_url(embedded_test_server()->GetURL( 4306 GURL popup_url(embedded_test_server()->GetURL(
4330 "bar.com", "/frame_tree/page_with_post_message_frames.html")); 4307 "bar.com", "/frame_tree/page_with_post_message_frames.html"));
4331 Shell* popup_shell = OpenPopup(shell()->web_contents(), popup_url, "popup"); 4308 Shell* popup_shell = OpenPopup(shell(), popup_url, "popup");
4332 EXPECT_TRUE(popup_shell); 4309 EXPECT_TRUE(popup_shell);
4333 FrameTreeNode* popup_root = 4310 FrameTreeNode* popup_root =
4334 static_cast<WebContentsImpl*>(popup_shell->web_contents()) 4311 static_cast<WebContentsImpl*>(popup_shell->web_contents())
4335 ->GetFrameTree() 4312 ->GetFrameTree()
4336 ->root(); 4313 ->root();
4337 EXPECT_EQ( 4314 EXPECT_EQ(
4338 " Site A ------------ proxies for B\n" 4315 " Site A ------------ proxies for B\n"
4339 " |--Site A ------- proxies for B\n" 4316 " |--Site A ------- proxies for B\n"
4340 " +--Site B ------- proxies for A\n" 4317 " +--Site B ------- proxies for A\n"
4341 "Where A = http://bar.com/\n" 4318 "Where A = http://bar.com/\n"
4342 " B = http://foo.com/", 4319 " B = http://foo.com/",
4343 DepictFrameTree(popup_root)); 4320 DepictFrameTree(popup_root));
4344 4321
4345 // Update the popup's second subframe's opener to root frame. This is 4322 // Update the popup's second subframe's opener to root frame. This is
4346 // allowed because that subframe is in the same foo.com SiteInstance as the 4323 // allowed because that subframe is in the same foo.com SiteInstance as the
4347 // root frame. 4324 // root frame.
4348 bool success = false; 4325 bool success = false;
4349 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4326 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4350 root->current_frame_host(), 4327 root,
4351 "window.domAutomationController.send(!!window.open('','subframe2'));", 4328 "window.domAutomationController.send(!!window.open('','subframe2'));",
4352 &success)); 4329 &success));
4353 EXPECT_TRUE(success); 4330 EXPECT_TRUE(success);
4354 4331
4355 // Check that the opener update propagated to the browser process and bar.com 4332 // Check that the opener update propagated to the browser process and bar.com
4356 // process. 4333 // process.
4357 EXPECT_EQ(root, popup_root->child_at(1)->opener()); 4334 EXPECT_EQ(root, popup_root->child_at(1)->opener());
4358 success = false; 4335 success = false;
4359 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4336 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4360 popup_root->child_at(0)->current_frame_host(), 4337 popup_root->child_at(0),
4361 "window.domAutomationController.send(" 4338 "window.domAutomationController.send("
4362 " parent.frames['subframe2'].opener && " 4339 " parent.frames['subframe2'].opener && "
4363 " parent.frames['subframe2'].opener === parent.opener);", 4340 " parent.frames['subframe2'].opener === parent.opener);",
4364 &success)); 4341 &success));
4365 EXPECT_TRUE(success); 4342 EXPECT_TRUE(success);
4366 4343
4367 // Navigate the popup's first subframe to another site. 4344 // Navigate the popup's first subframe to another site.
4368 GURL frame_url( 4345 GURL frame_url(
4369 embedded_test_server()->GetURL("baz.com", "/post_message.html")); 4346 embedded_test_server()->GetURL("baz.com", "/post_message.html"));
4370 NavigateFrameToURL(popup_root->child_at(0), frame_url); 4347 NavigateFrameToURL(popup_root->child_at(0), frame_url);
4371 4348
4372 // Check that the second subframe's opener is still correct in the first 4349 // Check that the second subframe's opener is still correct in the first
4373 // subframe's new process. Verify it both in JS and with a postMessage. 4350 // subframe's new process. Verify it both in JS and with a postMessage.
4374 success = false; 4351 success = false;
4375 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4352 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4376 popup_root->child_at(0)->current_frame_host(), 4353 popup_root->child_at(0),
4377 "window.domAutomationController.send(" 4354 "window.domAutomationController.send("
4378 " parent.frames['subframe2'].opener && " 4355 " parent.frames['subframe2'].opener && "
4379 " parent.frames['subframe2'].opener === parent.opener);", 4356 " parent.frames['subframe2'].opener === parent.opener);",
4380 &success)); 4357 &success));
4381 EXPECT_TRUE(success); 4358 EXPECT_TRUE(success);
4382 4359
4383 base::string16 expected_title = base::ASCIIToUTF16("msg"); 4360 base::string16 expected_title = base::ASCIIToUTF16("msg");
4384 TitleWatcher title_watcher(shell()->web_contents(), expected_title); 4361 TitleWatcher title_watcher(shell()->web_contents(), expected_title);
4385 EXPECT_TRUE(ExecuteScriptAndExtractBool( 4362 EXPECT_TRUE(ExecuteScriptAndExtractBool(
4386 popup_root->child_at(0)->current_frame_host(), 4363 popup_root->child_at(0),
4387 "window.domAutomationController.send(" 4364 "window.domAutomationController.send("
4388 " postToOpenerOfSibling('subframe2', 'msg', '*'));", 4365 " postToOpenerOfSibling('subframe2', 'msg', '*'));",
4389 &success)); 4366 &success));
4390 EXPECT_TRUE(success); 4367 EXPECT_TRUE(success);
4391 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 4368 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
4392 } 4369 }
4393 4370
4394 // Test for https://crbug.com/515302. Perform two navigations, A->B->A, and 4371 // Test for https://crbug.com/515302. Perform two navigations, A->B->A, and
4395 // drop the SwapOut ACK from the A->B navigation, so that the second B->A 4372 // drop the SwapOut ACK from the A->B navigation, so that the second B->A
4396 // navigation is initiated before the first page receives the SwapOut ACK. 4373 // navigation is initiated before the first page receives the SwapOut ACK.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
4467 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 4444 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
4468 ReusePendingDeleteRenderViewHostForSubframe) { 4445 ReusePendingDeleteRenderViewHostForSubframe) {
4469 GURL main_url(embedded_test_server()->GetURL("a.com", "/title1.html")); 4446 GURL main_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
4470 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 4447 EXPECT_TRUE(NavigateToURL(shell(), main_url));
4471 4448
4472 std::string script = 4449 std::string script =
4473 "window.onunload = function() { " 4450 "window.onunload = function() { "
4474 " var start = Date.now();" 4451 " var start = Date.now();"
4475 " while (Date.now() - start < 1000);" 4452 " while (Date.now() - start < 1000);"
4476 "}"; 4453 "}";
4477 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), script)); 4454 EXPECT_TRUE(ExecuteScript(shell(), script));
4478 4455
4479 // Navigating cross-site with an iframe to the original site shouldn't crash. 4456 // Navigating cross-site with an iframe to the original site shouldn't crash.
4480 GURL second_url(embedded_test_server()->GetURL( 4457 GURL second_url(embedded_test_server()->GetURL(
4481 "b.com", "/cross_site_iframe_factory.html?b(a)")); 4458 "b.com", "/cross_site_iframe_factory.html?b(a)"));
4482 EXPECT_TRUE(NavigateToURL(shell(), second_url)); 4459 EXPECT_TRUE(NavigateToURL(shell(), second_url));
4483 4460
4484 // If the subframe is created while the main frame is pending deletion, then 4461 // If the subframe is created while the main frame is pending deletion, then
4485 // the RVH will be reused. The main frame should've been swapped with a 4462 // the RVH will be reused. The main frame should've been swapped with a
4486 // proxy despite being the last active frame in the progress (see 4463 // proxy despite being the last active frame in the progress (see
4487 // https://crbug.com/568836), and this proxy should also be reused by the new 4464 // https://crbug.com/568836), and this proxy should also be reused by the new
(...skipping 18 matching lines...) Expand all
4506 EXPECT_EQ( 4483 EXPECT_EQ(
4507 " Site A ------------ proxies for B\n" 4484 " Site A ------------ proxies for B\n"
4508 " +--Site B ------- proxies for A\n" 4485 " +--Site B ------- proxies for A\n"
4509 "Where A = http://a.com/\n" 4486 "Where A = http://a.com/\n"
4510 " B = http://b.com/", 4487 " B = http://b.com/",
4511 DepictFrameTree(root)); 4488 DepictFrameTree(root));
4512 4489
4513 // Focus the main frame's text field. The return value "input-focus" 4490 // Focus the main frame's text field. The return value "input-focus"
4514 // indicates that the focus event was fired correctly. 4491 // indicates that the focus event was fired correctly.
4515 std::string result; 4492 std::string result;
4516 EXPECT_TRUE(ExecuteScriptAndExtractString(shell()->web_contents(), 4493 EXPECT_TRUE(
4517 "focusInputField()", &result)); 4494 ExecuteScriptAndExtractString(shell(), "focusInputField()", &result));
4518 EXPECT_EQ(result, "input-focus"); 4495 EXPECT_EQ(result, "input-focus");
4519 4496
4520 // The main frame should be focused. 4497 // The main frame should be focused.
4521 EXPECT_EQ(root, root->frame_tree()->GetFocusedFrame()); 4498 EXPECT_EQ(root, root->frame_tree()->GetFocusedFrame());
4522 4499
4523 DOMMessageQueue msg_queue; 4500 DOMMessageQueue msg_queue;
4524 4501
4525 // Click on the cross-process subframe. 4502 // Click on the cross-process subframe.
4526 SimulateMouseClick( 4503 SimulateMouseClick(
4527 root->child_at(0)->current_frame_host()->GetRenderWidgetHost(), 1, 1); 4504 root->child_at(0)->current_frame_host()->GetRenderWidgetHost(), 1, 1);
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
4657 const char kSetupFocusEvents[] = 4634 const char kSetupFocusEvents[] =
4658 "window.addEventListener('focus', function() {" 4635 "window.addEventListener('focus', function() {"
4659 " domAutomationController.setAutomationId(0);" 4636 " domAutomationController.setAutomationId(0);"
4660 " domAutomationController.send('%s-got-focus');" 4637 " domAutomationController.send('%s-got-focus');"
4661 "});" 4638 "});"
4662 "window.addEventListener('blur', function() {" 4639 "window.addEventListener('blur', function() {"
4663 " domAutomationController.setAutomationId(0);" 4640 " domAutomationController.setAutomationId(0);"
4664 " domAutomationController.send('%s-lost-focus');" 4641 " domAutomationController.send('%s-lost-focus');"
4665 "});"; 4642 "});";
4666 std::string script = base::StringPrintf(kSetupFocusEvents, "main", "main"); 4643 std::string script = base::StringPrintf(kSetupFocusEvents, "main", "main");
4667 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), script)); 4644 EXPECT_TRUE(ExecuteScript(shell(), script));
4668 script = base::StringPrintf(kSetupFocusEvents, "child1", "child1"); 4645 script = base::StringPrintf(kSetupFocusEvents, "child1", "child1");
4669 EXPECT_TRUE(ExecuteScript(child1->current_frame_host(), script)); 4646 EXPECT_TRUE(ExecuteScript(child1, script));
4670 script = base::StringPrintf(kSetupFocusEvents, "child2", "child2"); 4647 script = base::StringPrintf(kSetupFocusEvents, "child2", "child2");
4671 EXPECT_TRUE(ExecuteScript(child2->current_frame_host(), script)); 4648 EXPECT_TRUE(ExecuteScript(child2, script));
4672 4649
4673 // Execute window.focus on the B subframe from the A main frame. 4650 // Execute window.focus on the B subframe from the A main frame.
4674 EXPECT_TRUE(ExecuteScript(root->current_frame_host(), "frames[0].focus()")); 4651 EXPECT_TRUE(ExecuteScript(root, "frames[0].focus()"));
4675 4652
4676 // Helper to wait for two specified messages to arrive on the specified 4653 // Helper to wait for two specified messages to arrive on the specified
4677 // DOMMessageQueue, assuming that the two messages can arrive in any order. 4654 // DOMMessageQueue, assuming that the two messages can arrive in any order.
4678 auto wait_for_two_messages = [](DOMMessageQueue* msg_queue, 4655 auto wait_for_two_messages = [](DOMMessageQueue* msg_queue,
4679 const std::string& msg1, 4656 const std::string& msg1,
4680 const std::string& msg2) { 4657 const std::string& msg2) {
4681 bool msg1_received = false; 4658 bool msg1_received = false;
4682 bool msg2_received = false; 4659 bool msg2_received = false;
4683 std::string status; 4660 std::string status;
4684 while (msg_queue->WaitForMessage(&status)) { 4661 while (msg_queue->WaitForMessage(&status)) {
4685 if (status == msg1) 4662 if (status == msg1)
4686 msg1_received = true; 4663 msg1_received = true;
4687 if (status == msg2) 4664 if (status == msg2)
4688 msg2_received = true; 4665 msg2_received = true;
4689 if (msg1_received && msg2_received) 4666 if (msg1_received && msg2_received)
4690 break; 4667 break;
4691 } 4668 }
4692 }; 4669 };
4693 4670
4694 // Process A should fire a blur event, and process B should fire a focus 4671 // Process A should fire a blur event, and process B should fire a focus
4695 // event. Wait for both events. 4672 // event. Wait for both events.
4696 wait_for_two_messages(&msg_queue, "\"main-lost-focus\"", 4673 wait_for_two_messages(&msg_queue, "\"main-lost-focus\"",
4697 "\"child1-got-focus\""); 4674 "\"child1-got-focus\"");
4698 4675
4699 // The B subframe should now be focused in the browser process. 4676 // The B subframe should now be focused in the browser process.
4700 EXPECT_EQ(child1, root->frame_tree()->GetFocusedFrame()); 4677 EXPECT_EQ(child1, root->frame_tree()->GetFocusedFrame());
4701 4678
4702 // Now, execute window.focus on the C subframe from A main frame. This 4679 // Now, execute window.focus on the C subframe from A main frame. This
4703 // checks that we can shift focus from one remote frame to another. 4680 // checks that we can shift focus from one remote frame to another.
4704 EXPECT_TRUE(ExecuteScript(root->current_frame_host(), "frames[1].focus()")); 4681 EXPECT_TRUE(ExecuteScript(root, "frames[1].focus()"));
4705 4682
4706 // Wait for the two subframes (B and C) to fire blur and focus events. 4683 // Wait for the two subframes (B and C) to fire blur and focus events.
4707 wait_for_two_messages(&msg_queue, "\"child1-lost-focus\"", 4684 wait_for_two_messages(&msg_queue, "\"child1-lost-focus\"",
4708 "\"child2-got-focus\""); 4685 "\"child2-got-focus\"");
4709 4686
4710 // The C subframe should now be focused. 4687 // The C subframe should now be focused.
4711 EXPECT_EQ(child2, root->frame_tree()->GetFocusedFrame()); 4688 EXPECT_EQ(child2, root->frame_tree()->GetFocusedFrame());
4712 4689
4713 // window.focus the main frame from the C subframe. 4690 // window.focus the main frame from the C subframe.
4714 EXPECT_TRUE(ExecuteScript(child2->current_frame_host(), "parent.focus()")); 4691 EXPECT_TRUE(ExecuteScript(child2, "parent.focus()"));
4715 4692
4716 // Wait for the C subframe to blur and main frame to focus. 4693 // Wait for the C subframe to blur and main frame to focus.
4717 wait_for_two_messages(&msg_queue, "\"child2-lost-focus\"", 4694 wait_for_two_messages(&msg_queue, "\"child2-lost-focus\"",
4718 "\"main-got-focus\""); 4695 "\"main-got-focus\"");
4719 4696
4720 // The main frame should now be focused. 4697 // The main frame should now be focused.
4721 EXPECT_EQ(root, root->frame_tree()->GetFocusedFrame()); 4698 EXPECT_EQ(root, root->frame_tree()->GetFocusedFrame());
4722 } 4699 }
4723 4700
4724 // There are no cursors on Android. 4701 // There are no cursors on Android.
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
4803 // Tests that we are using the correct RenderFrameProxy when navigating an 4780 // Tests that we are using the correct RenderFrameProxy when navigating an
4804 // opener window. 4781 // opener window.
4805 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, OpenerSetLocation) { 4782 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, OpenerSetLocation) {
4806 // Navigate the main window. 4783 // Navigate the main window.
4807 GURL main_url(embedded_test_server()->GetURL("/title1.html")); 4784 GURL main_url(embedded_test_server()->GetURL("/title1.html"));
4808 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 4785 EXPECT_TRUE(NavigateToURL(shell(), main_url));
4809 EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), main_url); 4786 EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), main_url);
4810 4787
4811 // Load cross-site page into a new window. 4788 // Load cross-site page into a new window.
4812 GURL cross_url = embedded_test_server()->GetURL("foo.com", "/title1.html"); 4789 GURL cross_url = embedded_test_server()->GetURL("foo.com", "/title1.html");
4813 Shell* popup = OpenPopup(shell()->web_contents(), cross_url, ""); 4790 Shell* popup = OpenPopup(shell(), cross_url, "");
4814 EXPECT_EQ(popup->web_contents()->GetLastCommittedURL(), cross_url); 4791 EXPECT_EQ(popup->web_contents()->GetLastCommittedURL(), cross_url);
4815 4792
4816 // Use new window to navigate main window. 4793 // Use new window to navigate main window.
4817 std::string script = 4794 std::string script =
4818 "window.opener.location.href = '" + cross_url.spec() + "'"; 4795 "window.opener.location.href = '" + cross_url.spec() + "'";
4819 EXPECT_TRUE(ExecuteScript(popup->web_contents(), script)); 4796 EXPECT_TRUE(ExecuteScript(popup, script));
4820 EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); 4797 EXPECT_TRUE(WaitForLoadStop(shell()->web_contents()));
4821 EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), cross_url); 4798 EXPECT_EQ(shell()->web_contents()->GetLastCommittedURL(), cross_url);
4822 } 4799 }
4823 4800
4824 // Ensure that a cross-process subframe with a touch-handler can receive touch 4801 // Ensure that a cross-process subframe with a touch-handler can receive touch
4825 // events. 4802 // events.
4826 #if defined(USE_AURA) 4803 #if defined(USE_AURA)
4827 // Browser process hit testing is not implemented on Android, and this test 4804 // Browser process hit testing is not implemented on Android, and this test
4828 // requires Aura for RenderWidgetHostViewAura::OnTouchEvent(). 4805 // requires Aura for RenderWidgetHostViewAura::OnTouchEvent().
4829 // https://crbug.com/491334 4806 // https://crbug.com/491334
(...skipping 23 matching lines...) Expand all
4853 gfx::Point child_center(150, 150); 4830 gfx::Point child_center(150, 150);
4854 auto rwhv = static_cast<RenderWidgetHostViewAura*>( 4831 auto rwhv = static_cast<RenderWidgetHostViewAura*>(
4855 contents->GetRenderWidgetHostView()); 4832 contents->GetRenderWidgetHostView());
4856 ui::TouchEvent touch_event(ui::ET_TOUCH_PRESSED, child_center, 0, 0, 4833 ui::TouchEvent touch_event(ui::ET_TOUCH_PRESSED, child_center, 0, 0,
4857 ui::EventTimeForNow(), 30.f, 30.f, 0.f, 0.f); 4834 ui::EventTimeForNow(), 30.f, 30.f, 0.f, 0.f);
4858 rwhv->OnTouchEvent(&touch_event); 4835 rwhv->OnTouchEvent(&touch_event);
4859 4836
4860 // Verify touch handler in subframe was invoked 4837 // Verify touch handler in subframe was invoked
4861 std::string result; 4838 std::string result;
4862 EXPECT_TRUE(ExecuteScriptAndExtractString( 4839 EXPECT_TRUE(ExecuteScriptAndExtractString(
4863 root->child_at(0)->current_frame_host(), 4840 root->child_at(0),
4864 "window.domAutomationController.send(getLastTouchEvent());", &result)); 4841 "window.domAutomationController.send(getLastTouchEvent());", &result));
4865 EXPECT_EQ("touchstart", result); 4842 EXPECT_EQ("touchstart", result);
4866 } 4843 }
4867 4844
4868 namespace { 4845 namespace {
4869 4846
4870 // Declared here to be close to the SubframeGestureEventRouting test. 4847 // Declared here to be close to the SubframeGestureEventRouting test.
4871 void OnSyntheticGestureCompleted(scoped_refptr<MessageLoopRunner> runner, 4848 void OnSyntheticGestureCompleted(scoped_refptr<MessageLoopRunner> runner,
4872 SyntheticGesture::Result result) { 4849 SyntheticGesture::Result result) {
4873 EXPECT_EQ(SyntheticGesture::GESTURE_FINISHED, result); 4850 EXPECT_EQ(SyntheticGesture::GESTURE_FINISHED, result);
(...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after
5450 // the script command that changes it, we need to wait for it to change 5427 // the script command that changes it, we need to wait for it to change
5451 // before attempting to create the popup widget again. 5428 // before attempting to create the popup widget again.
5452 gfx::Rect last_b_node_bounds_rect = 5429 gfx::Rect last_b_node_bounds_rect =
5453 b_node->current_frame_host()->GetView()->GetViewBounds(); 5430 b_node->current_frame_host()->GetView()->GetViewBounds();
5454 5431
5455 std::string script = 5432 std::string script =
5456 "var iframe = document.querySelector('iframe');" 5433 "var iframe = document.querySelector('iframe');"
5457 "iframe.style.position = 'absolute';" 5434 "iframe.style.position = 'absolute';"
5458 "iframe.style.left = 150;" 5435 "iframe.style.left = 150;"
5459 "iframe.style.top = 150;"; 5436 "iframe.style.top = 150;";
5460 EXPECT_TRUE(ExecuteScript(root->current_frame_host(), script)); 5437 EXPECT_TRUE(ExecuteScript(root, script));
5461 5438
5462 filter->Reset(); 5439 filter->Reset();
5463 5440
5464 // Busy loop to wait for b_node's screen rect to get updated. There 5441 // Busy loop to wait for b_node's screen rect to get updated. There
5465 // doesn't seem to be any better way to find out when this happens. 5442 // doesn't seem to be any better way to find out when this happens.
5466 while (last_b_node_bounds_rect.x() == 5443 while (last_b_node_bounds_rect.x() ==
5467 b_node->current_frame_host()->GetView()->GetViewBounds().x() && 5444 b_node->current_frame_host()->GetView()->GetViewBounds().x() &&
5468 last_b_node_bounds_rect.y() == 5445 last_b_node_bounds_rect.y() ==
5469 b_node->current_frame_host()->GetView()->GetViewBounds().y()) { 5446 b_node->current_frame_host()->GetView()->GetViewBounds().y()) {
5470 base::RunLoop run_loop; 5447 base::RunLoop run_loop;
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
5511 static_cast<WebContentsImpl*>(contents)->GetFrameTree()->root(); 5488 static_cast<WebContentsImpl*>(contents)->GetFrameTree()->root();
5512 EXPECT_EQ(2U, root->child_count()); 5489 EXPECT_EQ(2U, root->child_count());
5513 5490
5514 // Navigate the first child frame to 'about:blank' (which is a 5491 // Navigate the first child frame to 'about:blank' (which is a
5515 // remote-to-local transition), and then detach it. 5492 // remote-to-local transition), and then detach it.
5516 FrameDeletedObserver observer(root->child_at(0)); 5493 FrameDeletedObserver observer(root->child_at(0));
5517 std::string script = 5494 std::string script =
5518 "var f = document.querySelector('iframe');" 5495 "var f = document.querySelector('iframe');"
5519 "f.contentWindow.location.href = 'about:blank';" 5496 "f.contentWindow.location.href = 'about:blank';"
5520 "setTimeout(function() { document.body.removeChild(f); }, 0);"; 5497 "setTimeout(function() { document.body.removeChild(f); }, 0);";
5521 EXPECT_TRUE(ExecuteScript(root->current_frame_host(), script)); 5498 EXPECT_TRUE(ExecuteScript(root, script));
5522 observer.Wait(); 5499 observer.Wait();
5523 EXPECT_EQ(1U, root->child_count()); 5500 EXPECT_EQ(1U, root->child_count());
5524 5501
5525 // Make sure the main frame renderer does not crash and ignores the 5502 // Make sure the main frame renderer does not crash and ignores the
5526 // navigation to the frame that's already been deleted. 5503 // navigation to the frame that's already been deleted.
5527 int child_count = 0; 5504 int child_count = 0;
5528 EXPECT_TRUE(ExecuteScriptAndExtractInt( 5505 EXPECT_TRUE(ExecuteScriptAndExtractInt(
5529 root->current_frame_host(), 5506 root, "domAutomationController.send(frames.length)", &child_count));
5530 "domAutomationController.send(frames.length)",
5531 &child_count));
5532 EXPECT_EQ(1, child_count); 5507 EXPECT_EQ(1, child_count);
5533 } 5508 }
5534 5509
5535 // Test for a variation of https://crbug.com/526304, where a child frame does a 5510 // Test for a variation of https://crbug.com/526304, where a child frame does a
5536 // remote-to-local navigation, and the parent frame removes that child frame 5511 // remote-to-local navigation, and the parent frame removes that child frame
5537 // after the provisional local frame is created and starts to navigate, but 5512 // after the provisional local frame is created and starts to navigate, but
5538 // before it commits. 5513 // before it commits.
5539 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 5514 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
5540 NavigateProxyAndDetachBeforeCommit) { 5515 NavigateProxyAndDetachBeforeCommit) {
5541 GURL main_url(embedded_test_server()->GetURL( 5516 GURL main_url(embedded_test_server()->GetURL(
(...skipping 11 matching lines...) Expand all
5553 GURL same_site_url(embedded_test_server()->GetURL("a.com", "/title1.html")); 5528 GURL same_site_url(embedded_test_server()->GetURL("a.com", "/title1.html"));
5554 NavigationController::LoadURLParams params(same_site_url); 5529 NavigationController::LoadURLParams params(same_site_url);
5555 params.transition_type = ui::PAGE_TRANSITION_LINK; 5530 params.transition_type = ui::PAGE_TRANSITION_LINK;
5556 params.frame_tree_node_id = child->frame_tree_node_id(); 5531 params.frame_tree_node_id = child->frame_tree_node_id();
5557 child->navigator()->GetController()->LoadURLWithParams(params); 5532 child->navigator()->GetController()->LoadURLWithParams(params);
5558 5533
5559 // Tell parent to remove the first child. This should happen after the 5534 // Tell parent to remove the first child. This should happen after the
5560 // previous navigation starts but before it commits. 5535 // previous navigation starts but before it commits.
5561 FrameDeletedObserver observer(child); 5536 FrameDeletedObserver observer(child);
5562 EXPECT_TRUE(ExecuteScript( 5537 EXPECT_TRUE(ExecuteScript(
5563 root->current_frame_host(), 5538 root, "document.body.removeChild(document.querySelector('iframe'));"));
5564 "document.body.removeChild(document.querySelector('iframe'));"));
5565 observer.Wait(); 5539 observer.Wait();
5566 EXPECT_EQ(1U, root->child_count()); 5540 EXPECT_EQ(1U, root->child_count());
5567 5541
5568 // Make sure the a.com renderer does not crash. 5542 // Make sure the a.com renderer does not crash.
5569 int child_count = 0; 5543 int child_count = 0;
5570 EXPECT_TRUE(ExecuteScriptAndExtractInt( 5544 EXPECT_TRUE(ExecuteScriptAndExtractInt(
5571 root->current_frame_host(), 5545 root, "domAutomationController.send(frames.length)", &child_count));
5572 "domAutomationController.send(frames.length)",
5573 &child_count));
5574 EXPECT_EQ(1, child_count); 5546 EXPECT_EQ(1, child_count);
5575 } 5547 }
5576 5548
5577 // Similar to NavigateProxyAndDetachBeforeCommit, but uses a synchronous 5549 // Similar to NavigateProxyAndDetachBeforeCommit, but uses a synchronous
5578 // navigation to about:blank and the parent removes the child frame in a load 5550 // navigation to about:blank and the parent removes the child frame in a load
5579 // event handler for the subframe. 5551 // event handler for the subframe.
5580 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, NavigateAboutBlankAndDetach) { 5552 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, NavigateAboutBlankAndDetach) {
5581 GURL main_url( 5553 GURL main_url(
5582 embedded_test_server()->GetURL("a.com", "/remove_frame_on_load.html")); 5554 embedded_test_server()->GetURL("a.com", "/remove_frame_on_load.html"));
5583 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 5555 EXPECT_TRUE(NavigateToURL(shell(), main_url));
5584 5556
5585 WebContents* contents = shell()->web_contents(); 5557 WebContents* contents = shell()->web_contents();
5586 FrameTreeNode* root = 5558 FrameTreeNode* root =
5587 static_cast<WebContentsImpl*>(contents)->GetFrameTree()->root(); 5559 static_cast<WebContentsImpl*>(contents)->GetFrameTree()->root();
5588 EXPECT_EQ(1U, root->child_count()); 5560 EXPECT_EQ(1U, root->child_count());
5589 FrameTreeNode* child = root->child_at(0); 5561 FrameTreeNode* child = root->child_at(0);
5590 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), 5562 EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
5591 child->current_frame_host()->GetSiteInstance()); 5563 child->current_frame_host()->GetSiteInstance());
5592 5564
5593 // Navigate the child frame to "about:blank" from the parent document. 5565 // Navigate the child frame to "about:blank" from the parent document.
5594 TestNavigationObserver observer(shell()->web_contents()); 5566 TestNavigationObserver observer(shell()->web_contents());
5595 EXPECT_TRUE( 5567 EXPECT_TRUE(ExecuteScript(
5596 ExecuteScript(root->current_frame_host(), 5568 root, base::StringPrintf("f.src = '%s'", url::kAboutBlankURL)));
5597 base::StringPrintf("f.src = '%s'", url::kAboutBlankURL)));
5598 observer.Wait(); 5569 observer.Wait();
5599 5570
5600 // Make sure the a.com renderer does not crash and the frame is removed. 5571 // Make sure the a.com renderer does not crash and the frame is removed.
5601 int child_count = 0; 5572 int child_count = 0;
5602 EXPECT_TRUE(ExecuteScriptAndExtractInt( 5573 EXPECT_TRUE(ExecuteScriptAndExtractInt(
5603 root->current_frame_host(), "domAutomationController.send(frames.length)", 5574 root, "domAutomationController.send(frames.length)", &child_count));
5604 &child_count));
5605 EXPECT_EQ(0, child_count); 5575 EXPECT_EQ(0, child_count);
5606 } 5576 }
5607 5577
5608 // Test for https://crbug.com/568670. In A-embed-B, simultaneously have B 5578 // Test for https://crbug.com/568670. In A-embed-B, simultaneously have B
5609 // create a new (local) child frame, and have A detach B's proxy. The child 5579 // create a new (local) child frame, and have A detach B's proxy. The child
5610 // frame creation sends an IPC to create a new proxy in A's process, and if 5580 // frame creation sends an IPC to create a new proxy in A's process, and if
5611 // that IPC arrives after the detach, the new frame's parent (a proxy) won't be 5581 // that IPC arrives after the detach, the new frame's parent (a proxy) won't be
5612 // available, and this shouldn't cause RenderFrameProxy::CreateFrameProxy to 5582 // available, and this shouldn't cause RenderFrameProxy::CreateFrameProxy to
5613 // crash. 5583 // crash.
5614 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 5584 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
(...skipping 17 matching lines...) Expand all
5632 root->render_manager()->current_frame_host()->GetProcess(); 5602 root->render_manager()->current_frame_host()->GetProcess();
5633 int new_routing_id = process_a->GetNextRoutingID(); 5603 int new_routing_id = process_a->GetNextRoutingID();
5634 int view_routing_id = 5604 int view_routing_id =
5635 root->frame_tree()->GetRenderViewHost(site_instance_a)->GetRoutingID(); 5605 root->frame_tree()->GetRenderViewHost(site_instance_a)->GetRoutingID();
5636 int parent_routing_id = 5606 int parent_routing_id =
5637 root->child_at(0)->render_manager()->GetProxyToParent()->GetRoutingID(); 5607 root->child_at(0)->render_manager()->GetProxyToParent()->GetRoutingID();
5638 5608
5639 // Tell main frame A to delete its subframe B. 5609 // Tell main frame A to delete its subframe B.
5640 FrameDeletedObserver observer(root->child_at(0)); 5610 FrameDeletedObserver observer(root->child_at(0));
5641 EXPECT_TRUE(ExecuteScript( 5611 EXPECT_TRUE(ExecuteScript(
5642 root->current_frame_host(), 5612 root, "document.body.removeChild(document.querySelector('iframe'));"));
5643 "document.body.removeChild(document.querySelector('iframe'));"));
5644 5613
5645 // Send the message to create a proxy for B's new child frame in A. This 5614 // Send the message to create a proxy for B's new child frame in A. This
5646 // used to crash, as parent_routing_id refers to a proxy that doesn't exist 5615 // used to crash, as parent_routing_id refers to a proxy that doesn't exist
5647 // anymore. 5616 // anymore.
5648 process_a->Send(new FrameMsg_NewFrameProxy( 5617 process_a->Send(new FrameMsg_NewFrameProxy(
5649 new_routing_id, view_routing_id, MSG_ROUTING_NONE, parent_routing_id, 5618 new_routing_id, view_routing_id, MSG_ROUTING_NONE, parent_routing_id,
5650 FrameReplicationState())); 5619 FrameReplicationState()));
5651 5620
5652 // Ensure the subframe is detached in the browser process. 5621 // Ensure the subframe is detached in the browser process.
5653 observer.Wait(); 5622 observer.Wait();
5654 EXPECT_EQ(0U, root->child_count()); 5623 EXPECT_EQ(0U, root->child_count());
5655 5624
5656 // Make sure process A did not crash. 5625 // Make sure process A did not crash.
5657 int child_count = 0; 5626 int child_count = 0;
5658 EXPECT_TRUE(ExecuteScriptAndExtractInt( 5627 EXPECT_TRUE(ExecuteScriptAndExtractInt(
5659 root->current_frame_host(), 5628 root, "domAutomationController.send(frames.length)", &child_count));
5660 "domAutomationController.send(frames.length)",
5661 &child_count));
5662 EXPECT_EQ(0, child_count); 5629 EXPECT_EQ(0, child_count);
5663 } 5630 }
5664 5631
5665 // This test ensures that the RenderFrame isn't leaked in the renderer process 5632 // This test ensures that the RenderFrame isn't leaked in the renderer process
5666 // if a pending cross-process navigation is cancelled. The test works by trying 5633 // if a pending cross-process navigation is cancelled. The test works by trying
5667 // to create a new RenderFrame with the same routing id. If there is an 5634 // to create a new RenderFrame with the same routing id. If there is an
5668 // entry with the same routing ID, a CHECK is hit and the process crashes. 5635 // entry with the same routing ID, a CHECK is hit and the process crashes.
5669 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 5636 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
5670 SubframePendingAndBackToSameSiteInstance) { 5637 SubframePendingAndBackToSameSiteInstance) {
5671 GURL main_url(embedded_test_server()->GetURL( 5638 GURL main_url(embedded_test_server()->GetURL(
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after
5823 EXPECT_FALSE(render_widget_host->is_hidden()); 5790 EXPECT_FALSE(render_widget_host->is_hidden());
5824 5791
5825 std::string show_script = 5792 std::string show_script =
5826 "document.querySelector('iframe').style.visibility = 'visible';"; 5793 "document.querySelector('iframe').style.visibility = 'visible';";
5827 std::string hide_script = 5794 std::string hide_script =
5828 "document.querySelector('iframe').style.visibility = 'hidden';"; 5795 "document.querySelector('iframe').style.visibility = 'hidden';";
5829 5796
5830 // Verify that hiding leads to a notification from RenderWidgetHost. 5797 // Verify that hiding leads to a notification from RenderWidgetHost.
5831 RenderWidgetHostVisibilityObserver hide_observer( 5798 RenderWidgetHostVisibilityObserver hide_observer(
5832 root->child_at(0)->current_frame_host()->GetRenderWidgetHost(), false); 5799 root->child_at(0)->current_frame_host()->GetRenderWidgetHost(), false);
5833 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), hide_script)); 5800 EXPECT_TRUE(ExecuteScript(shell(), hide_script));
5834 EXPECT_TRUE(hide_observer.WaitUntilSatisfied()); 5801 EXPECT_TRUE(hide_observer.WaitUntilSatisfied());
5835 5802
5836 // Verify showing leads to a notification as well. 5803 // Verify showing leads to a notification as well.
5837 RenderWidgetHostVisibilityObserver show_observer( 5804 RenderWidgetHostVisibilityObserver show_observer(
5838 root->child_at(0)->current_frame_host()->GetRenderWidgetHost(), true); 5805 root->child_at(0)->current_frame_host()->GetRenderWidgetHost(), true);
5839 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), show_script)); 5806 EXPECT_TRUE(ExecuteScript(shell(), show_script));
5840 EXPECT_TRUE(show_observer.WaitUntilSatisfied()); 5807 EXPECT_TRUE(show_observer.WaitUntilSatisfied());
5841 } 5808 }
5842 5809
5843 // Verify that sandbox flags inheritance works across multiple levels of 5810 // Verify that sandbox flags inheritance works across multiple levels of
5844 // frames. See https://crbug.com/576845. 5811 // frames. See https://crbug.com/576845.
5845 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, SandboxFlagsInheritance) { 5812 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, SandboxFlagsInheritance) {
5846 GURL main_url(embedded_test_server()->GetURL( 5813 GURL main_url(embedded_test_server()->GetURL(
5847 "a.com", "/cross_site_iframe_factory.html?a(a)")); 5814 "a.com", "/cross_site_iframe_factory.html?a(a)"));
5848 NavigateToURL(shell(), main_url); 5815 NavigateToURL(shell(), main_url);
5849 5816
5850 // It is safe to obtain the root frame tree node here, as it doesn't change. 5817 // It is safe to obtain the root frame tree node here, as it doesn't change.
5851 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 5818 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
5852 5819
5853 // Set sandbox flags for child frame. 5820 // Set sandbox flags for child frame.
5854 EXPECT_TRUE(ExecuteScript( 5821 EXPECT_TRUE(ExecuteScript(
5855 root->current_frame_host(), 5822 root, "document.querySelector('iframe').sandbox = 'allow-scripts';"));
5856 "document.querySelector('iframe').sandbox = 'allow-scripts';"));
5857 5823
5858 // Calculate expected flags. Note that "allow-scripts" resets both 5824 // Calculate expected flags. Note that "allow-scripts" resets both
5859 // WebSandboxFlags::Scripts and WebSandboxFlags::AutomaticFeatures bits per 5825 // WebSandboxFlags::Scripts and WebSandboxFlags::AutomaticFeatures bits per
5860 // blink::parseSandboxPolicy(). 5826 // blink::parseSandboxPolicy().
5861 blink::WebSandboxFlags expected_flags = 5827 blink::WebSandboxFlags expected_flags =
5862 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts & 5828 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts &
5863 ~blink::WebSandboxFlags::AutomaticFeatures; 5829 ~blink::WebSandboxFlags::AutomaticFeatures;
5864 EXPECT_EQ(expected_flags, root->child_at(0)->pending_sandbox_flags()); 5830 EXPECT_EQ(expected_flags, root->child_at(0)->pending_sandbox_flags());
5865 EXPECT_EQ(blink::WebSandboxFlags::None, 5831 EXPECT_EQ(blink::WebSandboxFlags::None,
5866 root->child_at(0)->effective_sandbox_flags()); 5832 root->child_at(0)->effective_sandbox_flags());
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
5898 SandboxFlagsNotInheritedBeforeNavigation) { 5864 SandboxFlagsNotInheritedBeforeNavigation) {
5899 GURL main_url(embedded_test_server()->GetURL( 5865 GURL main_url(embedded_test_server()->GetURL(
5900 "a.com", "/cross_site_iframe_factory.html?a(a)")); 5866 "a.com", "/cross_site_iframe_factory.html?a(a)"));
5901 NavigateToURL(shell(), main_url); 5867 NavigateToURL(shell(), main_url);
5902 5868
5903 // It is safe to obtain the root frame tree node here, as it doesn't change. 5869 // It is safe to obtain the root frame tree node here, as it doesn't change.
5904 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 5870 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
5905 5871
5906 // Set sandbox flags for child frame. 5872 // Set sandbox flags for child frame.
5907 EXPECT_TRUE(ExecuteScript( 5873 EXPECT_TRUE(ExecuteScript(
5908 root->current_frame_host(), 5874 root, "document.querySelector('iframe').sandbox = 'allow-scripts';"));
5909 "document.querySelector('iframe').sandbox = 'allow-scripts';"));
5910 5875
5911 // These flags should be pending but not take effect, since there's been no 5876 // These flags should be pending but not take effect, since there's been no
5912 // navigation. 5877 // navigation.
5913 blink::WebSandboxFlags expected_flags = 5878 blink::WebSandboxFlags expected_flags =
5914 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts & 5879 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts &
5915 ~blink::WebSandboxFlags::AutomaticFeatures; 5880 ~blink::WebSandboxFlags::AutomaticFeatures;
5916 FrameTreeNode* child = root->child_at(0); 5881 FrameTreeNode* child = root->child_at(0);
5917 EXPECT_EQ(expected_flags, child->pending_sandbox_flags()); 5882 EXPECT_EQ(expected_flags, child->pending_sandbox_flags());
5918 EXPECT_EQ(blink::WebSandboxFlags::None, child->effective_sandbox_flags()); 5883 EXPECT_EQ(blink::WebSandboxFlags::None, child->effective_sandbox_flags());
5919 5884
5920 // Add a new grandchild frame and navigate it cross-site. 5885 // Add a new grandchild frame and navigate it cross-site.
5921 RenderFrameHostCreatedObserver frame_observer(shell()->web_contents(), 1); 5886 RenderFrameHostCreatedObserver frame_observer(shell()->web_contents(), 1);
5922 EXPECT_TRUE(ExecuteScript( 5887 EXPECT_TRUE(ExecuteScript(
5923 child->current_frame_host(), 5888 child, "document.body.appendChild(document.createElement('iframe'));"));
5924 "document.body.appendChild(document.createElement('iframe'));"));
5925 frame_observer.Wait(); 5889 frame_observer.Wait();
5926 5890
5927 FrameTreeNode* grandchild = child->child_at(0); 5891 FrameTreeNode* grandchild = child->child_at(0);
5928 GURL frame_url(embedded_test_server()->GetURL("b.com", "/title1.html")); 5892 GURL frame_url(embedded_test_server()->GetURL("b.com", "/title1.html"));
5929 TestFrameNavigationObserver navigation_observer(grandchild); 5893 TestFrameNavigationObserver navigation_observer(grandchild);
5930 NavigateFrameToURL(grandchild, frame_url); 5894 NavigateFrameToURL(grandchild, frame_url);
5931 navigation_observer.Wait(); 5895 navigation_observer.Wait();
5932 5896
5933 // Since the update flags haven't yet taken effect in its parent, this 5897 // Since the update flags haven't yet taken effect in its parent, this
5934 // grandchild frame should not be sandboxed. 5898 // grandchild frame should not be sandboxed.
(...skipping 12 matching lines...) Expand all
5947 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 5911 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
5948 NewPopupInheritsSandboxFlagsFromOpener) { 5912 NewPopupInheritsSandboxFlagsFromOpener) {
5949 GURL main_url(embedded_test_server()->GetURL( 5913 GURL main_url(embedded_test_server()->GetURL(
5950 "a.com", "/cross_site_iframe_factory.html?a(a)")); 5914 "a.com", "/cross_site_iframe_factory.html?a(a)"));
5951 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 5915 EXPECT_TRUE(NavigateToURL(shell(), main_url));
5952 5916
5953 // It is safe to obtain the root frame tree node here, as it doesn't change. 5917 // It is safe to obtain the root frame tree node here, as it doesn't change.
5954 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 5918 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
5955 5919
5956 // Set sandbox flags for child frame. 5920 // Set sandbox flags for child frame.
5957 EXPECT_TRUE(ExecuteScript(root->current_frame_host(), 5921 EXPECT_TRUE(ExecuteScript(root,
5958 "document.querySelector('iframe').sandbox = " 5922 "document.querySelector('iframe').sandbox = "
5959 " 'allow-scripts allow-popups';")); 5923 " 'allow-scripts allow-popups';"));
5960 5924
5961 // Calculate expected flags. Note that "allow-scripts" resets both 5925 // Calculate expected flags. Note that "allow-scripts" resets both
5962 // WebSandboxFlags::Scripts and WebSandboxFlags::AutomaticFeatures bits per 5926 // WebSandboxFlags::Scripts and WebSandboxFlags::AutomaticFeatures bits per
5963 // blink::parseSandboxPolicy(). 5927 // blink::parseSandboxPolicy().
5964 blink::WebSandboxFlags expected_flags = 5928 blink::WebSandboxFlags expected_flags =
5965 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts & 5929 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts &
5966 ~blink::WebSandboxFlags::AutomaticFeatures & 5930 ~blink::WebSandboxFlags::AutomaticFeatures &
5967 ~blink::WebSandboxFlags::Popups; 5931 ~blink::WebSandboxFlags::Popups;
5968 EXPECT_EQ(expected_flags, root->child_at(0)->pending_sandbox_flags()); 5932 EXPECT_EQ(expected_flags, root->child_at(0)->pending_sandbox_flags());
5969 5933
5970 // Navigate child frame cross-site. The sandbox flags should take effect. 5934 // Navigate child frame cross-site. The sandbox flags should take effect.
5971 GURL frame_url(embedded_test_server()->GetURL("b.com", "/title1.html")); 5935 GURL frame_url(embedded_test_server()->GetURL("b.com", "/title1.html"));
5972 TestFrameNavigationObserver frame_observer(root->child_at(0)); 5936 TestFrameNavigationObserver frame_observer(root->child_at(0));
5973 NavigateFrameToURL(root->child_at(0), frame_url); 5937 NavigateFrameToURL(root->child_at(0), frame_url);
5974 frame_observer.Wait(); 5938 frame_observer.Wait();
5975 EXPECT_EQ(expected_flags, root->child_at(0)->effective_sandbox_flags()); 5939 EXPECT_EQ(expected_flags, root->child_at(0)->effective_sandbox_flags());
5976 5940
5977 // Verify that they've also taken effect on the renderer side. The sandboxed 5941 // Verify that they've also taken effect on the renderer side. The sandboxed
5978 // frame's origin should be unique. 5942 // frame's origin should be unique.
5979 EXPECT_EQ("null", GetDocumentOrigin(root->child_at(0))); 5943 EXPECT_EQ("null", GetDocumentOrigin(root->child_at(0)));
5980 5944
5981 // Open a popup named "foo" from the sandboxed child frame. 5945 // Open a popup named "foo" from the sandboxed child frame.
5982 Shell* foo_shell = OpenPopup(root->child_at(0)->current_frame_host(), 5946 Shell* foo_shell =
5983 GURL(url::kAboutBlankURL), "foo"); 5947 OpenPopup(root->child_at(0), GURL(url::kAboutBlankURL), "foo");
5984 EXPECT_TRUE(foo_shell); 5948 EXPECT_TRUE(foo_shell);
5985 5949
5986 FrameTreeNode* foo_root = 5950 FrameTreeNode* foo_root =
5987 static_cast<WebContentsImpl*>(foo_shell->web_contents()) 5951 static_cast<WebContentsImpl*>(foo_shell->web_contents())
5988 ->GetFrameTree() 5952 ->GetFrameTree()
5989 ->root(); 5953 ->root();
5990 5954
5991 // Check that the sandbox flags for new popup are correct in the browser 5955 // Check that the sandbox flags for new popup are correct in the browser
5992 // process. 5956 // process.
5993 EXPECT_EQ(expected_flags, foo_root->effective_sandbox_flags()); 5957 EXPECT_EQ(expected_flags, foo_root->effective_sandbox_flags());
5994 5958
5995 // The popup's origin should be unique, since it's sandboxed. 5959 // The popup's origin should be unique, since it's sandboxed.
5996 EXPECT_EQ("null", GetDocumentOrigin(foo_root)); 5960 EXPECT_EQ("null", GetDocumentOrigin(foo_root));
5997 5961
5998 // Navigate the popup cross-site. This should keep the unique origin and the 5962 // Navigate the popup cross-site. This should keep the unique origin and the
5999 // inherited sandbox flags. 5963 // inherited sandbox flags.
6000 GURL c_url(embedded_test_server()->GetURL("c.com", "/title1.html")); 5964 GURL c_url(embedded_test_server()->GetURL("c.com", "/title1.html"));
6001 TestFrameNavigationObserver popup_observer(foo_root); 5965 TestFrameNavigationObserver popup_observer(foo_root);
6002 EXPECT_TRUE(ExecuteScript(foo_root->current_frame_host(), 5966 EXPECT_TRUE(
6003 "location.href = '" + c_url.spec() + "';")); 5967 ExecuteScript(foo_root, "location.href = '" + c_url.spec() + "';"));
6004 popup_observer.Wait(); 5968 popup_observer.Wait();
6005 EXPECT_EQ(c_url, foo_shell->web_contents()->GetLastCommittedURL()); 5969 EXPECT_EQ(c_url, foo_shell->web_contents()->GetLastCommittedURL());
6006 5970
6007 // Confirm that the popup is still sandboxed, both on browser and renderer 5971 // Confirm that the popup is still sandboxed, both on browser and renderer
6008 // sides. 5972 // sides.
6009 EXPECT_EQ(expected_flags, foo_root->effective_sandbox_flags()); 5973 EXPECT_EQ(expected_flags, foo_root->effective_sandbox_flags());
6010 EXPECT_EQ("null", GetDocumentOrigin(foo_root)); 5974 EXPECT_EQ("null", GetDocumentOrigin(foo_root));
6011 } 5975 }
6012 5976
6013 // Verify that popups opened from frames sandboxed with the 5977 // Verify that popups opened from frames sandboxed with the
6014 // "allow-popups-to-escape-sandbox" directive do *not* inherit sandbox flags 5978 // "allow-popups-to-escape-sandbox" directive do *not* inherit sandbox flags
6015 // from their opener. 5979 // from their opener.
6016 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 5980 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
6017 OpenUnsandboxedPopupFromSandboxedFrame) { 5981 OpenUnsandboxedPopupFromSandboxedFrame) {
6018 GURL main_url(embedded_test_server()->GetURL( 5982 GURL main_url(embedded_test_server()->GetURL(
6019 "a.com", "/cross_site_iframe_factory.html?a(a)")); 5983 "a.com", "/cross_site_iframe_factory.html?a(a)"));
6020 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 5984 EXPECT_TRUE(NavigateToURL(shell(), main_url));
6021 5985
6022 // It is safe to obtain the root frame tree node here, as it doesn't change. 5986 // It is safe to obtain the root frame tree node here, as it doesn't change.
6023 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 5987 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
6024 5988
6025 // Set sandbox flags for child frame, specifying that popups opened from it 5989 // Set sandbox flags for child frame, specifying that popups opened from it
6026 // should not be sandboxed. 5990 // should not be sandboxed.
6027 EXPECT_TRUE(ExecuteScript( 5991 EXPECT_TRUE(ExecuteScript(
6028 root->current_frame_host(), 5992 root,
6029 "document.querySelector('iframe').sandbox = " 5993 "document.querySelector('iframe').sandbox = "
6030 " 'allow-scripts allow-popups allow-popups-to-escape-sandbox';")); 5994 " 'allow-scripts allow-popups allow-popups-to-escape-sandbox';"));
6031 5995
6032 // Set expected flags for the child frame. Note that "allow-scripts" resets 5996 // Set expected flags for the child frame. Note that "allow-scripts" resets
6033 // both WebSandboxFlags::Scripts and WebSandboxFlags::AutomaticFeatures bits 5997 // both WebSandboxFlags::Scripts and WebSandboxFlags::AutomaticFeatures bits
6034 // per blink::parseSandboxPolicy(). 5998 // per blink::parseSandboxPolicy().
6035 blink::WebSandboxFlags expected_flags = 5999 blink::WebSandboxFlags expected_flags =
6036 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts & 6000 blink::WebSandboxFlags::All & ~blink::WebSandboxFlags::Scripts &
6037 ~blink::WebSandboxFlags::AutomaticFeatures & 6001 ~blink::WebSandboxFlags::AutomaticFeatures &
6038 ~blink::WebSandboxFlags::Popups & 6002 ~blink::WebSandboxFlags::Popups &
6039 ~blink::WebSandboxFlags::PropagatesToAuxiliaryBrowsingContexts; 6003 ~blink::WebSandboxFlags::PropagatesToAuxiliaryBrowsingContexts;
6040 EXPECT_EQ(expected_flags, root->child_at(0)->pending_sandbox_flags()); 6004 EXPECT_EQ(expected_flags, root->child_at(0)->pending_sandbox_flags());
6041 6005
6042 // Navigate child frame cross-site. The sandbox flags should take effect. 6006 // Navigate child frame cross-site. The sandbox flags should take effect.
6043 GURL frame_url(embedded_test_server()->GetURL("b.com", "/title1.html")); 6007 GURL frame_url(embedded_test_server()->GetURL("b.com", "/title1.html"));
6044 TestFrameNavigationObserver frame_observer(root->child_at(0)); 6008 TestFrameNavigationObserver frame_observer(root->child_at(0));
6045 NavigateFrameToURL(root->child_at(0), frame_url); 6009 NavigateFrameToURL(root->child_at(0), frame_url);
6046 frame_observer.Wait(); 6010 frame_observer.Wait();
6047 EXPECT_EQ(expected_flags, root->child_at(0)->effective_sandbox_flags()); 6011 EXPECT_EQ(expected_flags, root->child_at(0)->effective_sandbox_flags());
6048 6012
6049 // Open a cross-site popup named "foo" from the child frame. 6013 // Open a cross-site popup named "foo" from the child frame.
6050 GURL b_url(embedded_test_server()->GetURL("c.com", "/title1.html")); 6014 GURL b_url(embedded_test_server()->GetURL("c.com", "/title1.html"));
6051 Shell* foo_shell = 6015 Shell* foo_shell = OpenPopup(root->child_at(0), b_url, "foo");
6052 OpenPopup(root->child_at(0)->current_frame_host(), b_url, "foo");
6053 EXPECT_TRUE(foo_shell); 6016 EXPECT_TRUE(foo_shell);
6054 6017
6055 FrameTreeNode* foo_root = 6018 FrameTreeNode* foo_root =
6056 static_cast<WebContentsImpl*>(foo_shell->web_contents()) 6019 static_cast<WebContentsImpl*>(foo_shell->web_contents())
6057 ->GetFrameTree() 6020 ->GetFrameTree()
6058 ->root(); 6021 ->root();
6059 6022
6060 // Check that the sandbox flags for new popup are correct in the browser 6023 // Check that the sandbox flags for new popup are correct in the browser
6061 // process. They should not have been inherited. 6024 // process. They should not have been inherited.
6062 EXPECT_EQ(blink::WebSandboxFlags::None, foo_root->effective_sandbox_flags()); 6025 EXPECT_EQ(blink::WebSandboxFlags::None, foo_root->effective_sandbox_flags());
6063 6026
6064 // The popup's origin should match |b_url|, since it's not sandboxed. 6027 // The popup's origin should match |b_url|, since it's not sandboxed.
6065 std::string popup_origin; 6028 std::string popup_origin;
6066 EXPECT_TRUE(ExecuteScriptAndExtractString( 6029 EXPECT_TRUE(ExecuteScriptAndExtractString(
6067 foo_root->current_frame_host(), 6030 foo_root, "domAutomationController.send(document.origin)",
6068 "domAutomationController.send(document.origin)",
6069 &popup_origin)); 6031 &popup_origin));
6070 EXPECT_EQ(b_url.GetOrigin().spec(), popup_origin + "/"); 6032 EXPECT_EQ(b_url.GetOrigin().spec(), popup_origin + "/");
6071 } 6033 }
6072 6034
6073 // Tests that the WebContents is notified when passive mixed content is 6035 // Tests that the WebContents is notified when passive mixed content is
6074 // displayed in an OOPIF. The test ignores cert errors so that an HTTPS 6036 // displayed in an OOPIF. The test ignores cert errors so that an HTTPS
6075 // iframe can be loaded from a site other than localhost (the 6037 // iframe can be loaded from a site other than localhost (the
6076 // EmbeddedTestServer serves a certificate that is valid for localhost). 6038 // EmbeddedTestServer serves a certificate that is valid for localhost).
6077 // This test crashes on Windows under Dr. Memory, see https://crbug.com/600942. 6039 // This test crashes on Windows under Dr. Memory, see https://crbug.com/600942.
6078 #if defined(OS_WIN) 6040 #if defined(OS_WIN)
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
6241 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, CrossSiteIframeDisplayNone) { 6203 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, CrossSiteIframeDisplayNone) {
6242 GURL main_url(embedded_test_server()->GetURL( 6204 GURL main_url(embedded_test_server()->GetURL(
6243 "a.com", "/cross_site_iframe_factory.html?a(b)")); 6205 "a.com", "/cross_site_iframe_factory.html?a(b)"));
6244 NavigateToURL(shell(), main_url); 6206 NavigateToURL(shell(), main_url);
6245 6207
6246 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 6208 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
6247 RenderWidgetHost* root_render_widget_host = 6209 RenderWidgetHost* root_render_widget_host =
6248 root->current_frame_host()->GetRenderWidgetHost(); 6210 root->current_frame_host()->GetRenderWidgetHost();
6249 6211
6250 // Set the iframe to display: none. 6212 // Set the iframe to display: none.
6251 EXPECT_TRUE( 6213 EXPECT_TRUE(ExecuteScript(
6252 ExecuteScript(shell()->web_contents(), 6214 shell(), "document.querySelector('iframe').style.display = 'none'"));
6253 "document.querySelector('iframe').style.display = 'none'"));
6254 6215
6255 // Waits until pending frames are done. 6216 // Waits until pending frames are done.
6256 std::unique_ptr<MainThreadFrameObserver> observer( 6217 std::unique_ptr<MainThreadFrameObserver> observer(
6257 new MainThreadFrameObserver(root_render_widget_host)); 6218 new MainThreadFrameObserver(root_render_widget_host));
6258 observer->Wait(); 6219 observer->Wait();
6259 6220
6260 // Force the renderer to generate a new frame. 6221 // Force the renderer to generate a new frame.
6261 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), 6222 EXPECT_TRUE(
6262 "document.body.style.background = 'black'")); 6223 ExecuteScript(shell(), "document.body.style.background = 'black'"));
6263 6224
6264 // Waits for the next frame. 6225 // Waits for the next frame.
6265 observer->Wait(); 6226 observer->Wait();
6266 } 6227 }
6267 6228
6268 // Test that a cross-origin iframe can be blocked by X-Frame-Options and CSP 6229 // Test that a cross-origin iframe can be blocked by X-Frame-Options and CSP
6269 // frame-ancestors. 6230 // frame-ancestors.
6270 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 6231 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
6271 CrossSiteIframeBlockedByXFrameOptionsOrCSP) { 6232 CrossSiteIframeBlockedByXFrameOptionsOrCSP) {
6272 GURL main_url(embedded_test_server()->GetURL( 6233 GURL main_url(embedded_test_server()->GetURL(
6273 "a.com", "/cross_site_iframe_factory.html?a(a)")); 6234 "a.com", "/cross_site_iframe_factory.html?a(a)"));
6274 NavigateToURL(shell(), main_url); 6235 NavigateToURL(shell(), main_url);
6275 6236
6276 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 6237 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
6277 6238
6278 // Add a load event handler for the iframe element. 6239 // Add a load event handler for the iframe element.
6279 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), 6240 EXPECT_TRUE(ExecuteScript(shell(),
6280 "document.querySelector('iframe').onload = " 6241 "document.querySelector('iframe').onload = "
6281 " function() { document.title = 'loaded'; };")); 6242 " function() { document.title = 'loaded'; };"));
6282 6243
6283 GURL blocked_urls[] = { 6244 GURL blocked_urls[] = {
6284 embedded_test_server()->GetURL("b.com", "/frame-ancestors-none.html"), 6245 embedded_test_server()->GetURL("b.com", "/frame-ancestors-none.html"),
6285 embedded_test_server()->GetURL("b.com", "/x-frame-options-deny.html") 6246 embedded_test_server()->GetURL("b.com", "/x-frame-options-deny.html")
6286 }; 6247 };
6287 6248
6288 for (size_t i = 0; i < arraysize(blocked_urls); ++i) { 6249 for (size_t i = 0; i < arraysize(blocked_urls); ++i) {
6289 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), 6250 EXPECT_TRUE(ExecuteScript(shell(), "document.title = 'not loaded';"));
6290 "document.title = 'not loaded';"));
6291 base::string16 expected_title(base::UTF8ToUTF16("loaded")); 6251 base::string16 expected_title(base::UTF8ToUTF16("loaded"));
6292 TitleWatcher title_watcher(shell()->web_contents(), expected_title); 6252 TitleWatcher title_watcher(shell()->web_contents(), expected_title);
6293 6253
6294 // Navigate the subframe to a blocked URL. 6254 // Navigate the subframe to a blocked URL.
6295 TestNavigationObserver load_observer(shell()->web_contents()); 6255 TestNavigationObserver load_observer(shell()->web_contents());
6296 EXPECT_TRUE(ExecuteScript( 6256 EXPECT_TRUE(ExecuteScript(shell(), "frames[0].location.href = '" +
6297 shell()->web_contents(), 6257 blocked_urls[i].spec() + "';"));
6298 "frames[0].location.href = '" + blocked_urls[i].spec() + "';"));
6299 load_observer.Wait(); 6258 load_observer.Wait();
6300 6259
6301 // The blocked frame's origin should become unique. 6260 // The blocked frame's origin should become unique.
6302 EXPECT_EQ("null", root->child_at(0)->current_origin().Serialize()); 6261 EXPECT_EQ("null", root->child_at(0)->current_origin().Serialize());
6303 6262
6304 // The blocked frame should still fire a load event in its parent's process. 6263 // The blocked frame should still fire a load event in its parent's process.
6305 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 6264 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
6306 6265
6307 // Check that the current RenderFrameHost has stopped loading. 6266 // Check that the current RenderFrameHost has stopped loading.
6308 EXPECT_FALSE(root->child_at(0)->current_frame_host()->is_loading()); 6267 EXPECT_FALSE(root->child_at(0)->current_frame_host()->is_loading());
6309 6268
6310 // The blocked navigation should behave like an empty 200 response. Make 6269 // The blocked navigation should behave like an empty 200 response. Make
6311 // sure that the frame's document.title is empty: this double-checks both 6270 // sure that the frame's document.title is empty: this double-checks both
6312 // that the blocked URL's contents wasn't loaded, and that the old page 6271 // that the blocked URL's contents wasn't loaded, and that the old page
6313 // isn't active anymore (both of these pages have non-empty titles). 6272 // isn't active anymore (both of these pages have non-empty titles).
6314 std::string frame_title; 6273 std::string frame_title;
6315 EXPECT_TRUE(ExecuteScriptAndExtractString( 6274 EXPECT_TRUE(ExecuteScriptAndExtractString(
6316 root->child_at(0)->current_frame_host(), 6275 root->child_at(0), "domAutomationController.send(document.title)",
6317 "domAutomationController.send(document.title)", &frame_title)); 6276 &frame_title));
6318 EXPECT_EQ("", frame_title); 6277 EXPECT_EQ("", frame_title);
6319 6278
6320 // Navigate the subframe to another cross-origin page and ensure that this 6279 // Navigate the subframe to another cross-origin page and ensure that this
6321 // navigation succeeds. Use a renderer-initiated navigation to test the 6280 // navigation succeeds. Use a renderer-initiated navigation to test the
6322 // transfer logic, which used to have some issues with this. 6281 // transfer logic, which used to have some issues with this.
6323 GURL c_url(embedded_test_server()->GetURL("c.com", "/title1.html")); 6282 GURL c_url(embedded_test_server()->GetURL("c.com", "/title1.html"));
6324 EXPECT_TRUE(NavigateIframeToURL(shell()->web_contents(), "child-0", c_url)); 6283 EXPECT_TRUE(NavigateIframeToURL(shell()->web_contents(), "child-0", c_url));
6325 EXPECT_EQ(c_url, root->child_at(0)->current_url()); 6284 EXPECT_EQ(c_url, root->child_at(0)->current_url());
6326 6285
6327 // When a page gets blocked due to XFO or CSP, it is sandboxed with the 6286 // When a page gets blocked due to XFO or CSP, it is sandboxed with the
(...skipping 22 matching lines...) Expand all
6350 GURL old_subframe_url( 6309 GURL old_subframe_url(
6351 embedded_test_server()->GetURL("b.com", "/title2.html")); 6310 embedded_test_server()->GetURL("b.com", "/title2.html"));
6352 EXPECT_FALSE(root->child_at(0)->HasSameOrigin(*root)); 6311 EXPECT_FALSE(root->child_at(0)->HasSameOrigin(*root));
6353 EXPECT_EQ(old_subframe_url, root->child_at(0)->current_url()); 6312 EXPECT_EQ(old_subframe_url, root->child_at(0)->current_url());
6354 const std::vector<ContentSecurityPolicyHeader>& root_csp = 6313 const std::vector<ContentSecurityPolicyHeader>& root_csp =
6355 root->current_replication_state().accumulated_csp_headers; 6314 root->current_replication_state().accumulated_csp_headers;
6356 EXPECT_EQ(1u, root_csp.size()); 6315 EXPECT_EQ(1u, root_csp.size());
6357 EXPECT_EQ("frame-src 'self' http://b.com:*", root_csp[0].header_value); 6316 EXPECT_EQ("frame-src 'self' http://b.com:*", root_csp[0].header_value);
6358 6317
6359 // Monitor subframe's load events via main frame's title. 6318 // Monitor subframe's load events via main frame's title.
6360 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), 6319 EXPECT_TRUE(ExecuteScript(shell(),
6361 "document.querySelector('iframe').onload = " 6320 "document.querySelector('iframe').onload = "
6362 " function() { document.title = 'loaded'; };")); 6321 " function() { document.title = 'loaded'; };"));
6363 EXPECT_TRUE( 6322 EXPECT_TRUE(ExecuteScript(shell(), "document.title = 'not loaded';"));
6364 ExecuteScript(shell()->web_contents(), "document.title = 'not loaded';"));
6365 base::string16 expected_title(base::UTF8ToUTF16("loaded")); 6323 base::string16 expected_title(base::UTF8ToUTF16("loaded"));
6366 TitleWatcher title_watcher(shell()->web_contents(), expected_title); 6324 TitleWatcher title_watcher(shell()->web_contents(), expected_title);
6367 6325
6368 // Try to navigate the subframe to a blocked URL. 6326 // Try to navigate the subframe to a blocked URL.
6369 TestNavigationObserver load_observer(shell()->web_contents()); 6327 TestNavigationObserver load_observer(shell()->web_contents());
6370 GURL blocked_url = embedded_test_server()->GetURL("c.com", "/title3.html"); 6328 GURL blocked_url = embedded_test_server()->GetURL("c.com", "/title3.html");
6371 EXPECT_TRUE( 6329 EXPECT_TRUE(ExecuteScript(root->child_at(0), "window.location.href = '" +
6372 ExecuteScript(root->child_at(0)->current_frame_host(), 6330 blocked_url.spec() + "';"));
6373 "window.location.href = '" + blocked_url.spec() + "';"));
6374 6331
6375 // The blocked frame should still fire a load event in its parent's process. 6332 // The blocked frame should still fire a load event in its parent's process.
6376 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 6333 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
6377 6334
6378 // Check that the current RenderFrameHost has stopped loading. 6335 // Check that the current RenderFrameHost has stopped loading.
6379 if (root->child_at(0)->current_frame_host()->is_loading()) { 6336 if (root->child_at(0)->current_frame_host()->is_loading()) {
6380 ADD_FAILURE() << "Blocked RenderFrameHost shouldn't be loading anything"; 6337 ADD_FAILURE() << "Blocked RenderFrameHost shouldn't be loading anything";
6381 load_observer.Wait(); 6338 load_observer.Wait();
6382 } 6339 }
6383 6340
6384 // The blocked frame should commit to |kBlockedURL| 6341 // The blocked frame should commit to |kBlockedURL|
6385 EXPECT_EQ(kBlockedURL, root->child_at(0)->current_url()); 6342 EXPECT_EQ(kBlockedURL, root->child_at(0)->current_url());
6386 6343
6387 std::string frame_title; 6344 std::string frame_title;
6388 EXPECT_TRUE(ExecuteScriptAndExtractString( 6345 EXPECT_TRUE(ExecuteScriptAndExtractString(
6389 root->child_at(0)->current_frame_host(), 6346 root->child_at(0), "domAutomationController.send(document.title)",
6390 "domAutomationController.send(document.title)", &frame_title)); 6347 &frame_title));
6391 EXPECT_EQ("", frame_title); 6348 EXPECT_EQ("", frame_title);
6392 6349
6393 // Navigate to a URL without CSP. 6350 // Navigate to a URL without CSP.
6394 EXPECT_TRUE(NavigateToURL( 6351 EXPECT_TRUE(NavigateToURL(
6395 shell(), embedded_test_server()->GetURL("a.com", "/title1.html"))); 6352 shell(), embedded_test_server()->GetURL("a.com", "/title1.html")));
6396 6353
6397 // Verify that the frame's CSP got correctly reset to an empty set. 6354 // Verify that the frame's CSP got correctly reset to an empty set.
6398 EXPECT_EQ(0u, 6355 EXPECT_EQ(0u,
6399 root->current_replication_state().accumulated_csp_headers.size()); 6356 root->current_replication_state().accumulated_csp_headers.size());
6400 } 6357 }
6401 6358
6402 // Test that a cross-origin frame's navigation can be blocked by CSP frame-src. 6359 // Test that a cross-origin frame's navigation can be blocked by CSP frame-src.
6403 // In this version of a test, CSP comes from a <meta> element added after the 6360 // In this version of a test, CSP comes from a <meta> element added after the
6404 // page has already loaded. 6361 // page has already loaded.
6405 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 6362 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
6406 CrossSiteIframeBlockedByParentCSPFromMeta) { 6363 CrossSiteIframeBlockedByParentCSPFromMeta) {
6407 GURL main_url(embedded_test_server()->GetURL( 6364 GURL main_url(embedded_test_server()->GetURL(
6408 "a.com", "/cross_site_iframe_factory.html?a(a)")); 6365 "a.com", "/cross_site_iframe_factory.html?a(a)"));
6409 EXPECT_TRUE(NavigateToURL(shell(), main_url)); 6366 EXPECT_TRUE(NavigateToURL(shell(), main_url));
6410 6367
6411 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 6368 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
6412 6369
6413 // Navigate the subframe to a location we will disallow in the future. 6370 // Navigate the subframe to a location we will disallow in the future.
6414 GURL old_subframe_url( 6371 GURL old_subframe_url(
6415 embedded_test_server()->GetURL("b.com", "/title2.html")); 6372 embedded_test_server()->GetURL("b.com", "/title2.html"));
6416 NavigateFrameToURL(root->child_at(0), old_subframe_url); 6373 NavigateFrameToURL(root->child_at(0), old_subframe_url);
6417 6374
6418 // Add frame-src CSP via a new <meta> element. 6375 // Add frame-src CSP via a new <meta> element.
6419 EXPECT_TRUE(ExecuteScript( 6376 EXPECT_TRUE(ExecuteScript(
6420 shell()->web_contents(), 6377 shell(),
6421 "var meta = document.createElement('meta');" 6378 "var meta = document.createElement('meta');"
6422 "meta.httpEquiv = 'Content-Security-Policy';" 6379 "meta.httpEquiv = 'Content-Security-Policy';"
6423 "meta.content = 'frame-src https://a.com:*';" 6380 "meta.content = 'frame-src https://a.com:*';"
6424 "document.getElementsByTagName('head')[0].appendChild(meta);")); 6381 "document.getElementsByTagName('head')[0].appendChild(meta);"));
6425 6382
6426 // Sanity-check that the test page has the expected shape for testing. 6383 // Sanity-check that the test page has the expected shape for testing.
6427 // (the CSP should not have an effect on the already loaded frames). 6384 // (the CSP should not have an effect on the already loaded frames).
6428 EXPECT_FALSE(root->child_at(0)->HasSameOrigin(*root)); 6385 EXPECT_FALSE(root->child_at(0)->HasSameOrigin(*root));
6429 EXPECT_EQ(old_subframe_url, root->child_at(0)->current_url()); 6386 EXPECT_EQ(old_subframe_url, root->child_at(0)->current_url());
6430 const std::vector<ContentSecurityPolicyHeader>& root_csp = 6387 const std::vector<ContentSecurityPolicyHeader>& root_csp =
6431 root->current_replication_state().accumulated_csp_headers; 6388 root->current_replication_state().accumulated_csp_headers;
6432 EXPECT_EQ(1u, root_csp.size()); 6389 EXPECT_EQ(1u, root_csp.size());
6433 EXPECT_EQ("frame-src https://a.com:*", root_csp[0].header_value); 6390 EXPECT_EQ("frame-src https://a.com:*", root_csp[0].header_value);
6434 6391
6435 // Monitor subframe's load events via main frame's title. 6392 // Monitor subframe's load events via main frame's title.
6436 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), 6393 EXPECT_TRUE(ExecuteScript(shell(),
6437 "document.querySelector('iframe').onload = " 6394 "document.querySelector('iframe').onload = "
6438 " function() { document.title = 'loaded'; };")); 6395 " function() { document.title = 'loaded'; };"));
6439 EXPECT_TRUE( 6396 EXPECT_TRUE(ExecuteScript(shell(), "document.title = 'not loaded';"));
6440 ExecuteScript(shell()->web_contents(), "document.title = 'not loaded';"));
6441 base::string16 expected_title(base::UTF8ToUTF16("loaded")); 6397 base::string16 expected_title(base::UTF8ToUTF16("loaded"));
6442 TitleWatcher title_watcher(shell()->web_contents(), expected_title); 6398 TitleWatcher title_watcher(shell()->web_contents(), expected_title);
6443 6399
6444 // Try to navigate the subframe to a blocked URL. 6400 // Try to navigate the subframe to a blocked URL.
6445 TestNavigationObserver load_observer2(shell()->web_contents()); 6401 TestNavigationObserver load_observer2(shell()->web_contents());
6446 GURL blocked_url = embedded_test_server()->GetURL("c.com", "/title3.html"); 6402 GURL blocked_url = embedded_test_server()->GetURL("c.com", "/title3.html");
6447 EXPECT_TRUE( 6403 EXPECT_TRUE(ExecuteScript(root->child_at(0), "window.location.href = '" +
6448 ExecuteScript(root->child_at(0)->current_frame_host(), 6404 blocked_url.spec() + "';"));
6449 "window.location.href = '" + blocked_url.spec() + "';"));
6450 6405
6451 // The blocked frame should still fire a load event in its parent's process. 6406 // The blocked frame should still fire a load event in its parent's process.
6452 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 6407 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
6453 6408
6454 // Check that the current RenderFrameHost has stopped loading. 6409 // Check that the current RenderFrameHost has stopped loading.
6455 if (root->child_at(0)->current_frame_host()->is_loading()) { 6410 if (root->child_at(0)->current_frame_host()->is_loading()) {
6456 ADD_FAILURE() << "Blocked RenderFrameHost shouldn't be loading anything"; 6411 ADD_FAILURE() << "Blocked RenderFrameHost shouldn't be loading anything";
6457 load_observer2.Wait(); 6412 load_observer2.Wait();
6458 } 6413 }
6459 6414
6460 // The blocked frame should commit to |kBlockedURL| 6415 // The blocked frame should commit to |kBlockedURL|
6461 EXPECT_EQ(kBlockedURL, root->child_at(0)->current_url()); 6416 EXPECT_EQ(kBlockedURL, root->child_at(0)->current_url());
6462 6417
6463 std::string frame_title; 6418 std::string frame_title;
6464 EXPECT_TRUE(ExecuteScriptAndExtractString( 6419 EXPECT_TRUE(ExecuteScriptAndExtractString(
6465 root->child_at(0)->current_frame_host(), 6420 root->child_at(0), "domAutomationController.send(document.title)",
6466 "domAutomationController.send(document.title)", &frame_title)); 6421 &frame_title));
6467 EXPECT_EQ("", frame_title); 6422 EXPECT_EQ("", frame_title);
6468 } 6423 }
6469 6424
6470 // Test that a cross-origin frame's navigation can be blocked by CSP frame-src. 6425 // Test that a cross-origin frame's navigation can be blocked by CSP frame-src.
6471 // In this version of a test, CSP is inherited by srcdoc iframe from a parent 6426 // In this version of a test, CSP is inherited by srcdoc iframe from a parent
6472 // that declared CSP via HTTP headers. Cross-origin frame navigating to a 6427 // that declared CSP via HTTP headers. Cross-origin frame navigating to a
6473 // blocked location is a child of the srcdoc iframe. 6428 // blocked location is a child of the srcdoc iframe.
6474 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 6429 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
6475 CrossSiteIframeBlockedByCSPInheritedBySrcDocParent) { 6430 CrossSiteIframeBlockedByCSPInheritedBySrcDocParent) {
6476 GURL main_url( 6431 GURL main_url(
(...skipping 14 matching lines...) Expand all
6491 EXPECT_FALSE(srcdoc_frame->HasSameOrigin(*navigating_frame)); 6446 EXPECT_FALSE(srcdoc_frame->HasSameOrigin(*navigating_frame));
6492 EXPECT_EQ(old_subframe_url, navigating_frame->current_url()); 6447 EXPECT_EQ(old_subframe_url, navigating_frame->current_url());
6493 const std::vector<ContentSecurityPolicyHeader>& srcdoc_csp = 6448 const std::vector<ContentSecurityPolicyHeader>& srcdoc_csp =
6494 srcdoc_frame->current_replication_state().accumulated_csp_headers; 6449 srcdoc_frame->current_replication_state().accumulated_csp_headers;
6495 EXPECT_EQ(1u, srcdoc_csp.size()); 6450 EXPECT_EQ(1u, srcdoc_csp.size());
6496 EXPECT_EQ("frame-src 'self' http://b.com:*", srcdoc_csp[0].header_value); 6451 EXPECT_EQ("frame-src 'self' http://b.com:*", srcdoc_csp[0].header_value);
6497 6452
6498 // Monitor navigating_frame's load events via srcdoc_frame posting 6453 // Monitor navigating_frame's load events via srcdoc_frame posting
6499 // a message to the parent frame. 6454 // a message to the parent frame.
6500 EXPECT_TRUE( 6455 EXPECT_TRUE(
6501 ExecuteScript(root->current_frame_host(), 6456 ExecuteScript(root,
6502 "window.addEventListener('message', function(event) {" 6457 "window.addEventListener('message', function(event) {"
6503 " document.title = event.data;" 6458 " document.title = event.data;"
6504 "});")); 6459 "});"));
6505 EXPECT_TRUE(ExecuteScript( 6460 EXPECT_TRUE(ExecuteScript(
6506 srcdoc_frame->current_frame_host(), 6461 srcdoc_frame,
6507 "document.querySelector('iframe').onload = " 6462 "document.querySelector('iframe').onload = "
6508 " function() { window.top.postMessage('loaded', '*'); };")); 6463 " function() { window.top.postMessage('loaded', '*'); };"));
6509 EXPECT_TRUE( 6464 EXPECT_TRUE(ExecuteScript(shell(), "document.title = 'not loaded';"));
6510 ExecuteScript(shell()->web_contents(), "document.title = 'not loaded';"));
6511 base::string16 expected_title(base::UTF8ToUTF16("loaded")); 6465 base::string16 expected_title(base::UTF8ToUTF16("loaded"));
6512 TitleWatcher title_watcher(shell()->web_contents(), expected_title); 6466 TitleWatcher title_watcher(shell()->web_contents(), expected_title);
6513 6467
6514 // Try to navigate the subframe to a blocked URL. 6468 // Try to navigate the subframe to a blocked URL.
6515 TestNavigationObserver load_observer2(shell()->web_contents()); 6469 TestNavigationObserver load_observer2(shell()->web_contents());
6516 GURL blocked_url = embedded_test_server()->GetURL("c.com", "/title3.html"); 6470 GURL blocked_url = embedded_test_server()->GetURL("c.com", "/title3.html");
6517 EXPECT_TRUE( 6471 EXPECT_TRUE(ExecuteScript(navigating_frame, "window.location.href = '" +
6518 ExecuteScript(navigating_frame->current_frame_host(), 6472 blocked_url.spec() + "';"));
6519 "window.location.href = '" + blocked_url.spec() + "';"));
6520 6473
6521 // The blocked frame should still fire a load event in its parent's process. 6474 // The blocked frame should still fire a load event in its parent's process.
6522 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle()); 6475 EXPECT_EQ(expected_title, title_watcher.WaitAndGetTitle());
6523 6476
6524 // Check that the current RenderFrameHost has stopped loading. 6477 // Check that the current RenderFrameHost has stopped loading.
6525 if (navigating_frame->current_frame_host()->is_loading()) { 6478 if (navigating_frame->current_frame_host()->is_loading()) {
6526 ADD_FAILURE() << "Blocked RenderFrameHost shouldn't be loading anything"; 6479 ADD_FAILURE() << "Blocked RenderFrameHost shouldn't be loading anything";
6527 load_observer2.Wait(); 6480 load_observer2.Wait();
6528 } 6481 }
6529 6482
6530 // The blocked frame should commit to |kBlockedURL| 6483 // The blocked frame should commit to |kBlockedURL|
6531 EXPECT_EQ(kBlockedURL, navigating_frame->current_url()); 6484 EXPECT_EQ(kBlockedURL, navigating_frame->current_url());
6532 6485
6533 std::string frame_title; 6486 std::string frame_title;
6534 EXPECT_TRUE(ExecuteScriptAndExtractString( 6487 EXPECT_TRUE(ExecuteScriptAndExtractString(
6535 navigating_frame->current_frame_host(), 6488 navigating_frame, "domAutomationController.send(document.title)",
6536 "domAutomationController.send(document.title)", &frame_title)); 6489 &frame_title));
6537 EXPECT_EQ("", frame_title); 6490 EXPECT_EQ("", frame_title);
6538 6491
6539 // Navigate the subframe to a URL without CSP. 6492 // Navigate the subframe to a URL without CSP.
6540 NavigateFrameToURL(srcdoc_frame, 6493 NavigateFrameToURL(srcdoc_frame,
6541 embedded_test_server()->GetURL("a.com", "/title1.html")); 6494 embedded_test_server()->GetURL("a.com", "/title1.html"));
6542 6495
6543 // Verify that the frame's CSP got correctly reset to an empty set. 6496 // Verify that the frame's CSP got correctly reset to an empty set.
6544 EXPECT_EQ( 6497 EXPECT_EQ(
6545 0u, 6498 0u,
6546 srcdoc_frame->current_replication_state().accumulated_csp_headers.size()); 6499 srcdoc_frame->current_replication_state().accumulated_csp_headers.size());
6547 } 6500 }
6548 6501
6549 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, ScreenCoordinates) { 6502 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, ScreenCoordinates) {
6550 GURL main_url(embedded_test_server()->GetURL( 6503 GURL main_url(embedded_test_server()->GetURL(
6551 "a.com", "/cross_site_iframe_factory.html?a(b)")); 6504 "a.com", "/cross_site_iframe_factory.html?a(b)"));
6552 NavigateToURL(shell(), main_url); 6505 NavigateToURL(shell(), main_url);
6553 6506
6554 FrameTreeNode* root = web_contents()->GetFrameTree()->root(); 6507 FrameTreeNode* root = web_contents()->GetFrameTree()->root();
6555 FrameTreeNode* child = root->child_at(0); 6508 FrameTreeNode* child = root->child_at(0);
6556 6509
6557 const char* properties[] = {"screenX", "screenY", "outerWidth", 6510 const char* properties[] = {"screenX", "screenY", "outerWidth",
6558 "outerHeight"}; 6511 "outerHeight"};
6559 6512
6560 for (const char* property : properties) { 6513 for (const char* property : properties) {
6561 std::string script = "window.domAutomationController.send(window."; 6514 std::string script = "window.domAutomationController.send(window.";
6562 script += property; 6515 script += property;
6563 script += ");"; 6516 script += ");";
6564 int root_value = 1; 6517 int root_value = 1;
6565 int child_value = 2; 6518 int child_value = 2;
6566 EXPECT_TRUE(ExecuteScriptAndExtractInt(root->current_frame_host(), 6519 EXPECT_TRUE(ExecuteScriptAndExtractInt(root, script.c_str(), &root_value));
6567 script.c_str(), &root_value));
6568 6520
6569 EXPECT_TRUE(ExecuteScriptAndExtractInt(child->current_frame_host(), 6521 EXPECT_TRUE(
6570 script.c_str(), &child_value)); 6522 ExecuteScriptAndExtractInt(child, script.c_str(), &child_value));
6571 6523
6572 EXPECT_EQ(root_value, child_value); 6524 EXPECT_EQ(root_value, child_value);
6573 } 6525 }
6574 } 6526 }
6575 6527
6576 // Tests that the certificate store is updated during a cross-site 6528 // Tests that the certificate store is updated during a cross-site
6577 // redirect navigation. (See https://crbug.com/561754.) Ignores 6529 // redirect navigation. (See https://crbug.com/561754.) Ignores
6578 // certificate errors so that it can use the cross-site redirector to 6530 // certificate errors so that it can use the cross-site redirector to
6579 // redirect from HTTPS to HTTPS. 6531 // redirect from HTTPS to HTTPS.
6580 IN_PROC_BROWSER_TEST_F(SitePerProcessIgnoreCertErrorsBrowserTest, 6532 IN_PROC_BROWSER_TEST_F(SitePerProcessIgnoreCertErrorsBrowserTest,
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
6646 EXPECT_TRUE(rvh->is_swapped_out_); 6598 EXPECT_TRUE(rvh->is_swapped_out_);
6647 6599
6648 // Have the child frame navigate its parent to its SiteInstance. 6600 // Have the child frame navigate its parent to its SiteInstance.
6649 GURL b_url(embedded_test_server()->GetURL("b.com", "/title1.html")); 6601 GURL b_url(embedded_test_server()->GetURL("b.com", "/title1.html"));
6650 std::string script = base::StringPrintf( 6602 std::string script = base::StringPrintf(
6651 "window.domAutomationController.send(" 6603 "window.domAutomationController.send("
6652 "parent.location = '%s');", 6604 "parent.location = '%s');",
6653 b_url.spec().c_str()); 6605 b_url.spec().c_str());
6654 6606
6655 TestFrameNavigationObserver frame_observer(root); 6607 TestFrameNavigationObserver frame_observer(root);
6656 EXPECT_TRUE(ExecuteScript(root->child_at(0)->current_frame_host(), script)); 6608 EXPECT_TRUE(ExecuteScript(root->child_at(0), script));
6657 frame_observer.Wait(); 6609 frame_observer.Wait();
6658 EXPECT_EQ(b_url, root->current_url()); 6610 EXPECT_EQ(b_url, root->current_url());
6659 6611
6660 // Verify that the same RenderViewHost is preserved and that it is no longer 6612 // Verify that the same RenderViewHost is preserved and that it is no longer
6661 // in swapped out state. 6613 // in swapped out state.
6662 EXPECT_EQ(rvh, contents->GetFrameTree()->GetRenderViewHost( 6614 EXPECT_EQ(rvh, contents->GetFrameTree()->GetRenderViewHost(
6663 root->current_frame_host()->GetSiteInstance())); 6615 root->current_frame_host()->GetSiteInstance()));
6664 EXPECT_FALSE(rvh->is_swapped_out_); 6616 EXPECT_FALSE(rvh->is_swapped_out_);
6665 } 6617 }
6666 6618
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after
6887 EXPECT_EQ( 6839 EXPECT_EQ(
6888 " Site A ------------ proxies for B\n" 6840 " Site A ------------ proxies for B\n"
6889 " +--Site B ------- proxies for A\n" 6841 " +--Site B ------- proxies for A\n"
6890 " +--Site B -- proxies for A\n" 6842 " +--Site B -- proxies for A\n"
6891 "Where A = http://a.com/\n" 6843 "Where A = http://a.com/\n"
6892 " B = http://b.com/", 6844 " B = http://b.com/",
6893 DepictFrameTree(root)); 6845 DepictFrameTree(root));
6894 6846
6895 int child_count = 0; 6847 int child_count = 0;
6896 EXPECT_TRUE(ExecuteScriptAndExtractInt( 6848 EXPECT_TRUE(ExecuteScriptAndExtractInt(
6897 root->child_at(0)->current_frame_host(), 6849 root->child_at(0), "window.domAutomationController.send(frames.length);",
6898 "window.domAutomationController.send(frames.length);", &child_count)); 6850 &child_count));
6899 EXPECT_EQ(1, child_count); 6851 EXPECT_EQ(1, child_count);
6900 6852
6901 RenderFrameDeletedObserver deleted_observer( 6853 RenderFrameDeletedObserver deleted_observer(
6902 root->child_at(0)->child_at(0)->current_frame_host()); 6854 root->child_at(0)->child_at(0)->current_frame_host());
6903 6855
6904 // Add an unload handler to the grandchild that causes it to be synchronously 6856 // Add an unload handler to the grandchild that causes it to be synchronously
6905 // detached, then navigate it. 6857 // detached, then navigate it.
6906 EXPECT_TRUE(ExecuteScript( 6858 EXPECT_TRUE(ExecuteScript(
6907 root->child_at(0)->child_at(0)->current_frame_host(), 6859 root->child_at(0)->child_at(0),
6908 "window.onunload=function(e){\n" 6860 "window.onunload=function(e){\n"
6909 " window.parent.document.getElementById('child-0').remove();\n" 6861 " window.parent.document.getElementById('child-0').remove();\n"
6910 "};\n")); 6862 "};\n"));
6911 std::string script = 6863 std::string script =
6912 std::string("window.document.getElementById('child-0').src = \"") + 6864 std::string("window.document.getElementById('child-0').src = \"") +
6913 embedded_test_server() 6865 embedded_test_server()
6914 ->GetURL("c.com", "/cross_site_iframe_factory.html?c") 6866 ->GetURL("c.com", "/cross_site_iframe_factory.html?c")
6915 .spec() + 6867 .spec() +
6916 "\""; 6868 "\"";
6917 EXPECT_TRUE( 6869 EXPECT_TRUE(ExecuteScript(root->child_at(0), script.c_str()));
6918 ExecuteScript(root->child_at(0)->current_frame_host(), script.c_str()));
6919 6870
6920 deleted_observer.WaitUntilDeleted(); 6871 deleted_observer.WaitUntilDeleted();
6921 6872
6922 EXPECT_TRUE(ExecuteScriptAndExtractInt( 6873 EXPECT_TRUE(ExecuteScriptAndExtractInt(
6923 root->child_at(0)->current_frame_host(), 6874 root->child_at(0), "window.domAutomationController.send(frames.length);",
6924 "window.domAutomationController.send(frames.length);", &child_count)); 6875 &child_count));
6925 EXPECT_EQ(0, child_count); 6876 EXPECT_EQ(0, child_count);
6926 6877
6927 EXPECT_EQ( 6878 EXPECT_EQ(
6928 " Site A ------------ proxies for B\n" 6879 " Site A ------------ proxies for B\n"
6929 " +--Site B ------- proxies for A\n" 6880 " +--Site B ------- proxies for A\n"
6930 "Where A = http://a.com/\n" 6881 "Where A = http://a.com/\n"
6931 " B = http://b.com/", 6882 " B = http://b.com/",
6932 DepictFrameTree(root)); 6883 DepictFrameTree(root));
6933 } 6884 }
6934 6885
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
7009 RenderProcessHost* process1 = child1->current_frame_host()->GetProcess(); 6960 RenderProcessHost* process1 = child1->current_frame_host()->GetProcess();
7010 RenderProcessHost* process2 = child2->current_frame_host()->GetProcess(); 6961 RenderProcessHost* process2 = child2->current_frame_host()->GetProcess();
7011 6962
7012 // Call window.open simultaneously in both subframes to create two popups. 6963 // Call window.open simultaneously in both subframes to create two popups.
7013 // Wait for and then drop both ViewHostMsg_ShowView messages. This will 6964 // Wait for and then drop both ViewHostMsg_ShowView messages. This will
7014 // ensure that both CreateNewWindow calls happen before either 6965 // ensure that both CreateNewWindow calls happen before either
7015 // ShowCreatedWindow call. 6966 // ShowCreatedWindow call.
7016 scoped_refptr<PendingWidgetMessageFilter> filter1 = 6967 scoped_refptr<PendingWidgetMessageFilter> filter1 =
7017 new PendingWidgetMessageFilter(); 6968 new PendingWidgetMessageFilter();
7018 process1->AddFilter(filter1.get()); 6969 process1->AddFilter(filter1.get());
7019 EXPECT_TRUE(ExecuteScript(child1->current_frame_host(), "window.open();")); 6970 EXPECT_TRUE(ExecuteScript(child1, "window.open();"));
7020 filter1->Wait(); 6971 filter1->Wait();
7021 6972
7022 scoped_refptr<PendingWidgetMessageFilter> filter2 = 6973 scoped_refptr<PendingWidgetMessageFilter> filter2 =
7023 new PendingWidgetMessageFilter(); 6974 new PendingWidgetMessageFilter();
7024 process2->AddFilter(filter2.get()); 6975 process2->AddFilter(filter2.get());
7025 EXPECT_TRUE(ExecuteScript(child2->current_frame_host(), "window.open();")); 6976 EXPECT_TRUE(ExecuteScript(child2, "window.open();"));
7026 filter2->Wait(); 6977 filter2->Wait();
7027 6978
7028 // At this point, we should have two pending WebContents. 6979 // At this point, we should have two pending WebContents.
7029 EXPECT_TRUE( 6980 EXPECT_TRUE(
7030 ContainsKey(web_contents()->pending_contents_, 6981 ContainsKey(web_contents()->pending_contents_,
7031 std::make_pair(process1->GetID(), filter1->routing_id()))); 6982 std::make_pair(process1->GetID(), filter1->routing_id())));
7032 EXPECT_TRUE( 6983 EXPECT_TRUE(
7033 ContainsKey(web_contents()->pending_contents_, 6984 ContainsKey(web_contents()->pending_contents_,
7034 std::make_pair(process2->GetID(), filter2->routing_id()))); 6985 std::make_pair(process2->GetID(), filter2->routing_id())));
7035 6986
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
7075 "b.com", "/site_isolation/page-with-select.html")); 7026 "b.com", "/site_isolation/page-with-select.html"));
7076 NavigateFrameToURL(child2, embedded_test_server()->GetURL( 7027 NavigateFrameToURL(child2, embedded_test_server()->GetURL(
7077 "c.com", "/site_isolation/page-with-select.html")); 7028 "c.com", "/site_isolation/page-with-select.html"));
7078 7029
7079 // Open both <select> menus. This creates a popup widget in both processes. 7030 // Open both <select> menus. This creates a popup widget in both processes.
7080 // Wait for and then drop the ViewHostMsg_ShowWidget messages, so that both 7031 // Wait for and then drop the ViewHostMsg_ShowWidget messages, so that both
7081 // widgets are left in pending-but-not-shown state. 7032 // widgets are left in pending-but-not-shown state.
7082 scoped_refptr<PendingWidgetMessageFilter> filter1 = 7033 scoped_refptr<PendingWidgetMessageFilter> filter1 =
7083 new PendingWidgetMessageFilter(); 7034 new PendingWidgetMessageFilter();
7084 process1->AddFilter(filter1.get()); 7035 process1->AddFilter(filter1.get());
7085 EXPECT_TRUE(ExecuteScript(child1->current_frame_host(), "openSelectMenu();")); 7036 EXPECT_TRUE(ExecuteScript(child1, "openSelectMenu();"));
7086 filter1->Wait(); 7037 filter1->Wait();
7087 7038
7088 scoped_refptr<PendingWidgetMessageFilter> filter2 = 7039 scoped_refptr<PendingWidgetMessageFilter> filter2 =
7089 new PendingWidgetMessageFilter(); 7040 new PendingWidgetMessageFilter();
7090 process2->AddFilter(filter2.get()); 7041 process2->AddFilter(filter2.get());
7091 EXPECT_TRUE(ExecuteScript(child2->current_frame_host(), "openSelectMenu();")); 7042 EXPECT_TRUE(ExecuteScript(child2, "openSelectMenu();"));
7092 filter2->Wait(); 7043 filter2->Wait();
7093 7044
7094 // At this point, we should have two pending widgets. 7045 // At this point, we should have two pending widgets.
7095 EXPECT_TRUE( 7046 EXPECT_TRUE(
7096 ContainsKey(web_contents()->pending_widget_views_, 7047 ContainsKey(web_contents()->pending_widget_views_,
7097 std::make_pair(process1->GetID(), filter1->routing_id()))); 7048 std::make_pair(process1->GetID(), filter1->routing_id())));
7098 EXPECT_TRUE( 7049 EXPECT_TRUE(
7099 ContainsKey(web_contents()->pending_widget_views_, 7050 ContainsKey(web_contents()->pending_widget_views_,
7100 std::make_pair(process2->GetID(), filter2->routing_id()))); 7051 std::make_pair(process2->GetID(), filter2->routing_id())));
7101 7052
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
7137 EXPECT_TRUE(NavigateToURL(shell(), url_1)); 7088 EXPECT_TRUE(NavigateToURL(shell(), url_1));
7138 7089
7139 WebContentsImpl* contents = web_contents(); 7090 WebContentsImpl* contents = web_contents();
7140 FrameTreeNode* root = contents->GetFrameTree()->root(); 7091 FrameTreeNode* root = contents->GetFrameTree()->root();
7141 7092
7142 // Helper to check if a frame is allowed to go fullscreen on the renderer 7093 // Helper to check if a frame is allowed to go fullscreen on the renderer
7143 // side. 7094 // side.
7144 auto is_fullscreen_allowed = [](FrameTreeNode* ftn) { 7095 auto is_fullscreen_allowed = [](FrameTreeNode* ftn) {
7145 bool fullscreen_allowed = false; 7096 bool fullscreen_allowed = false;
7146 EXPECT_TRUE(ExecuteScriptAndExtractBool( 7097 EXPECT_TRUE(ExecuteScriptAndExtractBool(
7147 ftn->current_frame_host(), 7098 ftn,
7148 "window.domAutomationController.send(document.webkitFullscreenEnabled)", 7099 "window.domAutomationController.send(document.webkitFullscreenEnabled)",
7149 &fullscreen_allowed)); 7100 &fullscreen_allowed));
7150 return fullscreen_allowed; 7101 return fullscreen_allowed;
7151 }; 7102 };
7152 7103
7153 EXPECT_TRUE(is_fullscreen_allowed(root)); 7104 EXPECT_TRUE(is_fullscreen_allowed(root));
7154 EXPECT_TRUE(is_fullscreen_allowed(root->child_at(0))); 7105 EXPECT_TRUE(is_fullscreen_allowed(root->child_at(0)));
7155 EXPECT_TRUE(root->child_at(0)->frame_owner_properties().allowFullscreen); 7106 EXPECT_TRUE(root->child_at(0)->frame_owner_properties().allowFullscreen);
7156 7107
7157 // Now navigate to a page with two <iframe>'s, both without allowFullscreen. 7108 // Now navigate to a page with two <iframe>'s, both without allowFullscreen.
7158 GURL url_2(embedded_test_server()->GetURL( 7109 GURL url_2(embedded_test_server()->GetURL(
7159 "a.com", "/cross_site_iframe_factory.html?a(b,c)")); 7110 "a.com", "/cross_site_iframe_factory.html?a(b,c)"));
7160 EXPECT_TRUE(NavigateToURL(shell(), url_2)); 7111 EXPECT_TRUE(NavigateToURL(shell(), url_2));
7161 EXPECT_FALSE(root->child_at(0)->frame_owner_properties().allowFullscreen); 7112 EXPECT_FALSE(root->child_at(0)->frame_owner_properties().allowFullscreen);
7162 EXPECT_FALSE(root->child_at(1)->frame_owner_properties().allowFullscreen); 7113 EXPECT_FALSE(root->child_at(1)->frame_owner_properties().allowFullscreen);
7163 7114
7164 EXPECT_TRUE(is_fullscreen_allowed(root)); 7115 EXPECT_TRUE(is_fullscreen_allowed(root));
7165 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(0))); 7116 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(0)));
7166 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(1))); 7117 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(1)));
7167 7118
7168 // Dynamically enable fullscreen for first subframe and check that the 7119 // Dynamically enable fullscreen for first subframe and check that the
7169 // fullscreen property was updated on the FrameTreeNode. 7120 // fullscreen property was updated on the FrameTreeNode.
7170 EXPECT_TRUE(ExecuteScript( 7121 EXPECT_TRUE(ExecuteScript(
7171 root->current_frame_host(), 7122 root, "document.getElementById('child-0').allowFullscreen='true'"));
7172 "document.getElementById('child-0').allowFullscreen='true'"));
7173 EXPECT_TRUE(root->child_at(0)->frame_owner_properties().allowFullscreen); 7123 EXPECT_TRUE(root->child_at(0)->frame_owner_properties().allowFullscreen);
7174 7124
7175 // Check that the first subframe is now allowed to go fullscreen. Other 7125 // Check that the first subframe is now allowed to go fullscreen. Other
7176 // frames shouldn't be affected. 7126 // frames shouldn't be affected.
7177 EXPECT_TRUE(is_fullscreen_allowed(root)); 7127 EXPECT_TRUE(is_fullscreen_allowed(root));
7178 EXPECT_TRUE(is_fullscreen_allowed(root->child_at(0))); 7128 EXPECT_TRUE(is_fullscreen_allowed(root->child_at(0)));
7179 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(1))); 7129 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(1)));
7180 7130
7181 // Now navigate to a page with two levels of nesting. 7131 // Now navigate to a page with two levels of nesting.
7182 GURL url_3(embedded_test_server()->GetURL( 7132 GURL url_3(embedded_test_server()->GetURL(
7183 "a.com", "/cross_site_iframe_factory.html?a(b(c))")); 7133 "a.com", "/cross_site_iframe_factory.html?a(b(c))"));
7184 EXPECT_TRUE(NavigateToURL(shell(), url_3)); 7134 EXPECT_TRUE(NavigateToURL(shell(), url_3));
7185 7135
7186 EXPECT_TRUE(is_fullscreen_allowed(root)); 7136 EXPECT_TRUE(is_fullscreen_allowed(root));
7187 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(0))); 7137 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(0)));
7188 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(0)->child_at(0))); 7138 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(0)->child_at(0)));
7189 7139
7190 // Dynamically enable fullscreen for bottom subframe. 7140 // Dynamically enable fullscreen for bottom subframe.
7191 EXPECT_TRUE(ExecuteScript( 7141 EXPECT_TRUE(ExecuteScript(
7192 root->child_at(0)->current_frame_host(), 7142 root->child_at(0),
7193 "document.getElementById('child-0').allowFullscreen='true'")); 7143 "document.getElementById('child-0').allowFullscreen='true'"));
7194 7144
7195 // This still shouldn't allow the bottom child to go fullscreen, since the 7145 // This still shouldn't allow the bottom child to go fullscreen, since the
7196 // top frame hasn't allowed fullscreen for the middle frame. 7146 // top frame hasn't allowed fullscreen for the middle frame.
7197 EXPECT_TRUE(is_fullscreen_allowed(root)); 7147 EXPECT_TRUE(is_fullscreen_allowed(root));
7198 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(0))); 7148 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(0)));
7199 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(0)->child_at(0))); 7149 EXPECT_FALSE(is_fullscreen_allowed(root->child_at(0)->child_at(0)));
7200 7150
7201 // Now allow fullscreen for the middle frame. 7151 // Now allow fullscreen for the middle frame.
7202 EXPECT_TRUE(ExecuteScript( 7152 EXPECT_TRUE(ExecuteScript(
7203 root->current_frame_host(), 7153 root, "document.getElementById('child-0').allowFullscreen='true'"));
7204 "document.getElementById('child-0').allowFullscreen='true'"));
7205 7154
7206 // All frames should be allowed to go fullscreen now. 7155 // All frames should be allowed to go fullscreen now.
7207 EXPECT_TRUE(is_fullscreen_allowed(root)); 7156 EXPECT_TRUE(is_fullscreen_allowed(root));
7208 EXPECT_TRUE(is_fullscreen_allowed(root->child_at(0))); 7157 EXPECT_TRUE(is_fullscreen_allowed(root->child_at(0)));
7209 EXPECT_TRUE(is_fullscreen_allowed(root->child_at(0)->child_at(0))); 7158 EXPECT_TRUE(is_fullscreen_allowed(root->child_at(0)->child_at(0)));
7210 7159
7211 // Cross-site navigation should preserve the fullscreen flags. 7160 // Cross-site navigation should preserve the fullscreen flags.
7212 NavigateFrameToURL(root->child_at(0)->child_at(0), 7161 NavigateFrameToURL(root->child_at(0)->child_at(0),
7213 embedded_test_server()->GetURL("d.com", "/title1.html")); 7162 embedded_test_server()->GetURL("d.com", "/title1.html"));
7214 EXPECT_TRUE(is_fullscreen_allowed(root->child_at(0)->child_at(0))); 7163 EXPECT_TRUE(is_fullscreen_allowed(root->child_at(0)->child_at(0)));
7215 } 7164 }
7216 7165
7217 } // namespace content 7166 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698