Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/site_per_process_browsertest.h" | 5 #include "content/browser/site_per_process_browsertest.h" |
| 6 | 6 |
| 7 #include "base/command_line.h" | 7 #include "base/command_line.h" |
| 8 #include "base/strings/stringprintf.h" | 8 #include "base/strings/stringprintf.h" |
| 9 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
| 10 #include "content/browser/frame_host/cross_process_frame_connector.h" | 10 #include "content/browser/frame_host/cross_process_frame_connector.h" |
| (...skipping 937 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 948 "window.domAutomationController.send(location.ancestorOrigins[0]);", | 948 "window.domAutomationController.send(location.ancestorOrigins[0]);", |
| 949 &result)); | 949 &result)); |
| 950 EXPECT_EQ(result + "/", foo_url.GetOrigin().spec()); | 950 EXPECT_EQ(result + "/", foo_url.GetOrigin().spec()); |
| 951 EXPECT_TRUE(ExecuteScriptAndExtractString( | 951 EXPECT_TRUE(ExecuteScriptAndExtractString( |
| 952 bottom_child->current_frame_host(), | 952 bottom_child->current_frame_host(), |
| 953 "window.domAutomationController.send(location.ancestorOrigins[1]);", | 953 "window.domAutomationController.send(location.ancestorOrigins[1]);", |
| 954 &result)); | 954 &result)); |
| 955 EXPECT_EQ(result + "/", main_url.GetOrigin().spec()); | 955 EXPECT_EQ(result + "/", main_url.GetOrigin().spec()); |
| 956 } | 956 } |
| 957 | 957 |
| 958 // Check that iframe sandbox flags are replicated correctly. | |
| 959 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, SandboxFlagsReplication) { | |
| 960 GURL main_url(embedded_test_server()->GetURL("/sandboxed_frames.html")); | |
| 961 EXPECT_TRUE(NavigateToURL(shell(), main_url)); | |
| 962 | |
| 963 // It is safe to obtain the root frame tree node here, as it doesn't change. | |
| 964 FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) | |
| 965 ->GetFrameTree() | |
| 966 ->root(); | |
| 967 | |
| 968 SitePerProcessWebContentsObserver observer(shell()->web_contents()); | |
| 969 | |
| 970 // Navigate the second (sandboxed) subframe to a cross-site page with a | |
| 971 // subframe. NavigateFrameToURL can't be used here because it doesn't | |
|
nasko
2015/01/20 23:26:49
I think it still can be used, but cannot be the co
alexmos
2015/01/21 02:10:43
Done.
| |
| 972 // guarantee that FrameTreeNodes will have been created for child frames when | |
| 973 // it returns. | |
| 974 RenderFrameHostCreatedObserver frame_observer(shell()->web_contents(), 4); | |
| 975 GURL foo_url( | |
| 976 embedded_test_server()->GetURL("foo.com", "/frame_tree/1-1.html")); | |
| 977 NavigationController::LoadURLParams params(foo_url); | |
| 978 params.transition_type = ui::PAGE_TRANSITION_LINK; | |
| 979 params.frame_tree_node_id = root->child_at(1)->frame_tree_node_id(); | |
| 980 root->child_at(1)->navigator()->GetController()->LoadURLWithParams(params); | |
| 981 frame_observer.Wait(); | |
| 982 | |
| 983 // We can't use a SitePerProcessWebContentsObserver to verify the URL here, | |
| 984 // since the frame has children that may have clobbered it in the observer. | |
| 985 EXPECT_EQ(foo_url, root->child_at(1)->current_url()); | |
| 986 | |
| 987 // Load cross-site page into subframe's subframe. | |
| 988 ASSERT_EQ(2U, root->child_at(1)->child_count()); | |
| 989 GURL bar_url(embedded_test_server()->GetURL("bar.com", "/title1.html")); | |
| 990 NavigateFrameToURL(root->child_at(1)->child_at(0), bar_url); | |
| 991 EXPECT_TRUE(observer.navigation_succeeded()); | |
| 992 EXPECT_EQ(bar_url, observer.navigation_url()); | |
| 993 | |
| 994 // Opening a popup in the sandboxed foo.com iframe should fail. | |
| 995 bool success = false; | |
| 996 EXPECT_TRUE( | |
| 997 ExecuteScriptAndExtractBool(root->child_at(1)->current_frame_host(), | |
| 998 "window.domAutomationController.send(" | |
| 999 "!window.open('data:text/html,dataurl'));", | |
| 1000 &success)); | |
| 1001 EXPECT_TRUE(success); | |
|
nasko
2015/01/20 23:26:49
Might be useful to install an observer monitoring
alexmos
2015/01/21 02:10:43
Good point. I added checks that Shell::windows().
nasko
2015/01/21 17:36:37
Yes, that is totally fine.
| |
| 1002 | |
| 1003 // Opening a popup in a frame whose parent is sandboxed should also fail. | |
| 1004 // Here, bar.com frame's sandboxed parent frame is a remote frame in | |
| 1005 // bar.com's process. | |
| 1006 success = false; | |
| 1007 EXPECT_TRUE(ExecuteScriptAndExtractBool( | |
| 1008 root->child_at(1)->child_at(0)->current_frame_host(), | |
| 1009 "window.domAutomationController.send(" | |
| 1010 "!window.open('data:text/html,dataurl'));", | |
| 1011 &success)); | |
| 1012 EXPECT_TRUE(success); | |
| 1013 | |
| 1014 // Same, but now try the case where bar.com frame's sandboxed parent is a | |
| 1015 // local frame in bar.com's process. | |
| 1016 success = false; | |
| 1017 EXPECT_TRUE(ExecuteScriptAndExtractBool( | |
| 1018 root->child_at(2)->child_at(0)->current_frame_host(), | |
| 1019 "window.domAutomationController.send(" | |
| 1020 "!window.open('data:text/html,dataurl'));", | |
| 1021 &success)); | |
| 1022 EXPECT_TRUE(success); | |
| 1023 | |
| 1024 // Check that foo.com frame's location.ancestorOrigins contains the correct | |
| 1025 // origin for the parent, which should be unaffected by sandboxing. | |
| 1026 int ancestor_origins_length = 0; | |
| 1027 EXPECT_TRUE(ExecuteScriptAndExtractInt( | |
| 1028 root->child_at(1)->current_frame_host(), | |
| 1029 "window.domAutomationController.send(location.ancestorOrigins.length);", | |
| 1030 &ancestor_origins_length)); | |
| 1031 EXPECT_EQ(1, ancestor_origins_length); | |
| 1032 std::string result; | |
| 1033 EXPECT_TRUE(ExecuteScriptAndExtractString( | |
| 1034 root->child_at(1)->current_frame_host(), | |
| 1035 "window.domAutomationController.send(location.ancestorOrigins[0]);", | |
| 1036 &result)); | |
| 1037 EXPECT_EQ(result + "/", main_url.GetOrigin().spec()); | |
| 1038 | |
| 1039 // Now check location.ancestorOrigins for the bar.com frame. The middle frame | |
| 1040 // (foo.com's) origin should be unique, since that frame is sandboxed, and | |
| 1041 // the top frame should match |main_url|. | |
| 1042 FrameTreeNode* bottom_child = root->child_at(1)->child_at(0); | |
| 1043 EXPECT_TRUE(ExecuteScriptAndExtractInt( | |
| 1044 bottom_child->current_frame_host(), | |
| 1045 "window.domAutomationController.send(location.ancestorOrigins.length);", | |
| 1046 &ancestor_origins_length)); | |
| 1047 EXPECT_EQ(2, ancestor_origins_length); | |
| 1048 EXPECT_TRUE(ExecuteScriptAndExtractString( | |
| 1049 bottom_child->current_frame_host(), | |
| 1050 "window.domAutomationController.send(location.ancestorOrigins[0]);", | |
| 1051 &result)); | |
| 1052 EXPECT_EQ(result, "null"); | |
| 1053 EXPECT_TRUE(ExecuteScriptAndExtractString( | |
| 1054 bottom_child->current_frame_host(), | |
| 1055 "window.domAutomationController.send(location.ancestorOrigins[1]);", | |
| 1056 &result)); | |
| 1057 EXPECT_EQ(result + "/", main_url.GetOrigin().spec()); | |
| 1058 } | |
| 1059 | |
| 958 // TODO(lfg): Merge the test below with NavigateRemoteFrame test. | 1060 // TODO(lfg): Merge the test below with NavigateRemoteFrame test. |
| 959 // TODO(lfg): Disabled because this triggers http://crbug.com/433012, and since | 1061 // TODO(lfg): Disabled because this triggers http://crbug.com/433012, and since |
| 960 // the renderer process crashes, it causes the title watcher to never return. | 1062 // the renderer process crashes, it causes the title watcher to never return. |
| 961 // Alternatively, this could also be fixed if we could use NavigateIframeToURL | 1063 // Alternatively, this could also be fixed if we could use NavigateIframeToURL |
| 962 // and classified the navigation as MANUAL_SUBFRAME (http://crbug.com/441863) or | 1064 // and classified the navigation as MANUAL_SUBFRAME (http://crbug.com/441863) or |
| 963 // if we waited for DidStopLoading (currently broken -- see comment in | 1065 // if we waited for DidStopLoading (currently broken -- see comment in |
| 964 // NavigateIframeToURL). | 1066 // NavigateIframeToURL). |
| 965 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, | 1067 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
| 966 DISABLED_NavigateRemoteToDataURL) { | 1068 DISABLED_NavigateRemoteToDataURL) { |
| 967 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); | 1069 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1082 params.frame_tree_node_id = child->frame_tree_node_id(); | 1184 params.frame_tree_node_id = child->frame_tree_node_id(); |
| 1083 child->navigator()->GetController()->LoadURLWithParams(params); | 1185 child->navigator()->GetController()->LoadURLWithParams(params); |
| 1084 nav_observer.Wait(); | 1186 nav_observer.Wait(); |
| 1085 | 1187 |
| 1086 // Verify that the navigation succeeded and the expected URL was loaded. | 1188 // Verify that the navigation succeeded and the expected URL was loaded. |
| 1087 EXPECT_TRUE(observer.navigation_succeeded()); | 1189 EXPECT_TRUE(observer.navigation_succeeded()); |
| 1088 EXPECT_EQ(url, observer.navigation_url()); | 1190 EXPECT_EQ(url, observer.navigation_url()); |
| 1089 } | 1191 } |
| 1090 | 1192 |
| 1091 } // namespace content | 1193 } // namespace content |
| OLD | NEW |