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

Side by Side Diff: content/browser/frame_host/navigation_controller_impl_browsertest.cc

Issue 1157373002: Revert of Fix the commit type for out-of-process iframes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/command_line.h" 6 #include "base/command_line.h"
7 #include "base/strings/stringprintf.h" 7 #include "base/strings/stringprintf.h"
8 #include "content/browser/frame_host/frame_navigation_entry.h" 8 #include "content/browser/frame_host/frame_navigation_entry.h"
9 #include "content/browser/frame_host/frame_tree.h" 9 #include "content/browser/frame_host/frame_tree.h"
10 #include "content/browser/frame_host/navigation_controller_impl.h" 10 #include "content/browser/frame_host/navigation_controller_impl.h"
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 void Wait() { 367 void Wait() {
368 message_loop_runner_->Run(); 368 message_loop_runner_->Run();
369 } 369 }
370 370
371 ui::PageTransition transition_type() const { 371 ui::PageTransition transition_type() const {
372 return transition_type_; 372 return transition_type_;
373 } 373 }
374 374
375 private: 375 private:
376 void RenderFrameCreated(RenderFrameHost* render_frame_host) override { 376 void RenderFrameCreated(RenderFrameHost* render_frame_host) override {
377 // If this object was created with a specified tree frame node, there
378 // shouldn't be any frames being created.
379 DCHECK_EQ(0, frame_tree_node_id_);
377 RenderFrameHostImpl* rfh = 380 RenderFrameHostImpl* rfh =
378 static_cast<RenderFrameHostImpl*>(render_frame_host); 381 static_cast<RenderFrameHostImpl*>(render_frame_host);
379 382 frame_tree_node_id_ = rfh->frame_tree_node()->frame_tree_node_id();
380 // Don't pay attention to swapped out RenderFrameHosts in the main frame.
381 // TODO(nasko): Remove once swappedout:// is gone.
382 // See https://crbug.com/357747.
383 if (!RenderFrameHostImpl::IsRFHStateActive(rfh->rfh_state())) {
384 DLOG(INFO) << "Skipping swapped out RFH: "
385 << rfh->GetSiteInstance()->GetSiteURL();
386 return;
387 }
388
389 // If this object was not created with a specified frame tree node, then use
390 // the first created active RenderFrameHost. Once a node is selected, there
391 // shouldn't be any other frames being created.
392 int frame_tree_node_id = rfh->frame_tree_node()->frame_tree_node_id();
393 DCHECK(frame_tree_node_id_ == 0 ||
394 frame_tree_node_id_ == frame_tree_node_id);
395 frame_tree_node_id_ = frame_tree_node_id;
396 } 383 }
397 384
398 void DidCommitProvisionalLoadForFrame( 385 void DidCommitProvisionalLoadForFrame(
399 RenderFrameHost* render_frame_host, 386 RenderFrameHost* render_frame_host,
400 const GURL& url, 387 const GURL& url,
401 ui::PageTransition transition_type) override { 388 ui::PageTransition transition_type) override {
402 DCHECK_NE(0, frame_tree_node_id_); 389 DCHECK_NE(0, frame_tree_node_id_);
403 RenderFrameHostImpl* rfh = 390 RenderFrameHostImpl* rfh =
404 static_cast<RenderFrameHostImpl*>(render_frame_host); 391 static_cast<RenderFrameHostImpl*>(render_frame_host);
405 if (rfh->frame_tree_node()->frame_tree_node_id() != frame_tree_node_id_) 392 if (rfh->frame_tree_node()->frame_tree_node_id() != frame_tree_node_id_)
(...skipping 569 matching lines...) Expand 10 before | Expand all | Expand 10 after
975 ASSERT_EQ(2U, params.size()); 962 ASSERT_EQ(2U, params.size());
976 ASSERT_EQ(2U, details.size()); 963 ASSERT_EQ(2U, details.size());
977 EXPECT_EQ(ui::PAGE_TRANSITION_LINK, params[0].transition); 964 EXPECT_EQ(ui::PAGE_TRANSITION_LINK, params[0].transition);
978 EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, details[0].type); 965 EXPECT_EQ(NAVIGATION_TYPE_NEW_PAGE, details[0].type);
979 EXPECT_EQ(ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_CLIENT_REDIRECT, 966 EXPECT_EQ(ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_CLIENT_REDIRECT,
980 params[1].transition); 967 params[1].transition);
981 EXPECT_EQ(NAVIGATION_TYPE_EXISTING_PAGE, details[1].type); 968 EXPECT_EQ(NAVIGATION_TYPE_EXISTING_PAGE, details[1].type);
982 } 969 }
983 } 970 }
984 971
985 // Verify the tree of FrameNavigationEntries after initial about:blank commits
986 // in subframes, which should not count as real committed loads.
987 IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
988 FrameNavigationEntry_BlankAutoSubframe) {
989 GURL main_url(embedded_test_server()->GetURL(
990 "/navigation_controller/simple_page_1.html"));
991 NavigateToURL(shell(), main_url);
992 const NavigationControllerImpl& controller =
993 static_cast<const NavigationControllerImpl&>(
994 shell()->web_contents()->GetController());
995 FrameTreeNode* root =
996 static_cast<WebContentsImpl*>(shell()->web_contents())->
997 GetFrameTree()->root();
998
999 // 1. Create a iframe with no URL.
1000 {
1001 LoadCommittedCapturer capturer(shell()->web_contents());
1002 std::string script = "var iframe = document.createElement('iframe');"
1003 "document.body.appendChild(iframe);";
1004 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
1005 capturer.Wait();
1006 EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
1007 }
1008
1009 // Check last committed NavigationEntry.
1010 EXPECT_EQ(1, controller.GetEntryCount());
1011 NavigationEntryImpl* entry = controller.GetLastCommittedEntry();
1012 EXPECT_EQ(main_url, entry->GetURL());
1013 FrameNavigationEntry* root_entry = entry->root_node()->frame_entry.get();
1014 EXPECT_EQ(main_url, root_entry->url());
1015
1016 // Verify no subframe entries are created.
1017 EXPECT_EQ(0U, entry->root_node()->children.size());
1018 EXPECT_FALSE(controller.HasCommittedRealLoad(root->child_at(0)));
1019
1020 // 2. Create another iframe with an about:blank URL.
1021 {
1022 LoadCommittedCapturer capturer(shell()->web_contents());
1023 std::string script = "var iframe = document.createElement('iframe');"
1024 "iframe.src = 'about:blank';"
1025 "document.body.appendChild(iframe);";
1026 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
1027 capturer.Wait();
1028 EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
1029 }
1030
1031 // Check last committed NavigationEntry.
1032 EXPECT_EQ(1, controller.GetEntryCount());
1033 EXPECT_EQ(entry, controller.GetLastCommittedEntry());
1034
1035 // Verify no subframe entries are created.
1036 EXPECT_EQ(0U, entry->root_node()->children.size());
1037 EXPECT_FALSE(controller.HasCommittedRealLoad(root->child_at(1)));
1038
1039 // 3. A real same-site navigation in the first iframe should be AUTO.
1040 GURL frame_url(embedded_test_server()->GetURL(
1041 "/navigation_controller/simple_page_1.html"));
1042 {
1043 LoadCommittedCapturer capturer(root->child_at(0));
1044 std::string script = "var frames = document.getElementsByTagName('iframe');"
1045 "frames[0].src = '" + frame_url.spec() + "';";
1046 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
1047 capturer.Wait();
1048 EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
1049 }
1050
1051 // Check last committed NavigationEntry.
1052 EXPECT_EQ(1, controller.GetEntryCount());
1053 EXPECT_EQ(entry, controller.GetLastCommittedEntry());
1054
1055 // Verify subframe entries if we're in --site-per-process mode.
1056 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1057 switches::kSitePerProcess)) {
1058 // The entry should now have one subframe FrameNavigationEntry.
1059 ASSERT_EQ(1U, entry->root_node()->children.size());
1060 FrameNavigationEntry* frame_entry =
1061 entry->root_node()->children[0]->frame_entry.get();
1062 EXPECT_EQ(frame_url, frame_entry->url());
1063 EXPECT_TRUE(controller.HasCommittedRealLoad(root->child_at(0)));
1064 EXPECT_FALSE(controller.HasCommittedRealLoad(root->child_at(1)));
1065 } else {
1066 // There are no subframe FrameNavigationEntries by default.
1067 EXPECT_EQ(0U, entry->root_node()->children.size());
1068 }
1069
1070 // 4. A real cross-site navigation in the second iframe should be AUTO.
1071 GURL foo_url(embedded_test_server()->GetURL(
1072 "foo.com", "/navigation_controller/simple_page_2.html"));
1073 {
1074 LoadCommittedCapturer capturer(root->child_at(1));
1075 std::string script = "var frames = document.getElementsByTagName('iframe');"
1076 "frames[1].src = '" + foo_url.spec() + "';";
1077 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
1078 capturer.Wait();
1079 EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
1080 }
1081
1082 // Check last committed NavigationEntry.
1083 EXPECT_EQ(1, controller.GetEntryCount());
1084 EXPECT_EQ(entry, controller.GetLastCommittedEntry());
1085
1086 // Verify subframe entries if we're in --site-per-process mode.
1087 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1088 switches::kSitePerProcess)) {
1089 // The entry should now have two subframe FrameNavigationEntries.
1090 ASSERT_EQ(2U, entry->root_node()->children.size());
1091 FrameNavigationEntry* frame_entry =
1092 entry->root_node()->children[1]->frame_entry.get();
1093 EXPECT_EQ(foo_url, frame_entry->url());
1094 EXPECT_TRUE(controller.HasCommittedRealLoad(root->child_at(1)));
1095 } else {
1096 // There are no subframe FrameNavigationEntries by default.
1097 EXPECT_EQ(0U, entry->root_node()->children.size());
1098 }
1099
1100 // Check the end result of the frame tree.
1101 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1102 switches::kSitePerProcess)) {
1103 FrameTreeVisualizer visualizer;
1104 EXPECT_EQ(
1105 " Site A ------------ proxies for B\n"
1106 " |--Site A ------- proxies for B\n"
1107 " +--Site B ------- proxies for A\n"
1108 "Where A = http://127.0.0.1/\n"
1109 " B = http://foo.com/",
1110 visualizer.DepictFrameTree(root));
1111 }
1112 }
1113
1114 // Verify the tree of FrameNavigationEntries after NAVIGATION_TYPE_AUTO_SUBFRAME 972 // Verify the tree of FrameNavigationEntries after NAVIGATION_TYPE_AUTO_SUBFRAME
1115 // commits. 973 // commits.
974 // TODO(creis): Test cross-site iframes.
1116 // TODO(creis): Test updating entries for history auto subframe navigations. 975 // TODO(creis): Test updating entries for history auto subframe navigations.
1117 IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, 976 IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
1118 FrameNavigationEntry_AutoSubframe) { 977 FrameNavigationEntry_AutoSubframe) {
1119 GURL main_url(embedded_test_server()->GetURL( 978 GURL main_url(embedded_test_server()->GetURL(
1120 "/navigation_controller/simple_page_1.html")); 979 "/navigation_controller/simple_page_1.html"));
1121 NavigateToURL(shell(), main_url); 980 NavigateToURL(shell(), main_url);
1122 const NavigationControllerImpl& controller = 981 const NavigationControllerImpl& controller =
1123 static_cast<const NavigationControllerImpl&>( 982 static_cast<const NavigationControllerImpl&>(
1124 shell()->web_contents()->GetController()); 983 shell()->web_contents()->GetController());
1125 FrameTreeNode* root = 984 FrameTreeNode* root =
1126 static_cast<WebContentsImpl*>(shell()->web_contents())-> 985 static_cast<WebContentsImpl*>(shell()->web_contents())->
1127 GetFrameTree()->root(); 986 GetFrameTree()->root();
1128 987
1129 // 1. Create a same-site iframe. 988 // Create an iframe.
1130 GURL frame_url(embedded_test_server()->GetURL( 989 GURL frame_url(embedded_test_server()->GetURL(
1131 "/navigation_controller/simple_page_2.html")); 990 "/navigation_controller/simple_page_2.html"));
1132 { 991 {
1133 LoadCommittedCapturer capturer(shell()->web_contents()); 992 LoadCommittedCapturer capturer(shell()->web_contents());
1134 std::string script = "var iframe = document.createElement('iframe');" 993 std::string script = "var iframe = document.createElement('iframe');"
1135 "iframe.src = '" + frame_url.spec() + "';" 994 "iframe.src = '" + frame_url.spec() + "';"
1136 "document.body.appendChild(iframe);"; 995 "document.body.appendChild(iframe);";
1137 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script)); 996 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
1138 capturer.Wait(); 997 capturer.Wait();
1139 EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type()); 998 EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
1140 } 999 }
1141 1000
1142 // Check last committed NavigationEntry. 1001 // Check last committed NavigationEntry.
1143 EXPECT_EQ(1, controller.GetEntryCount()); 1002 EXPECT_EQ(1, controller.GetEntryCount());
1144 NavigationEntryImpl* entry = controller.GetLastCommittedEntry(); 1003 NavigationEntryImpl* entry = controller.GetLastCommittedEntry();
1145 EXPECT_EQ(main_url, entry->GetURL()); 1004 EXPECT_EQ(main_url, entry->GetURL());
1146 FrameNavigationEntry* root_entry = entry->root_node()->frame_entry.get(); 1005 FrameNavigationEntry* root_entry = entry->root_node()->frame_entry.get();
1147 EXPECT_EQ(main_url, root_entry->url()); 1006 EXPECT_EQ(main_url, root_entry->url());
1148 EXPECT_FALSE(controller.GetPendingEntry());
1149 1007
1150 // Verify subframe entries if we're in --site-per-process mode. 1008 // Verify subframe entries if we're in --site-per-process mode.
1151 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 1009 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1152 switches::kSitePerProcess)) { 1010 switches::kSitePerProcess)) {
1153 // The entry should now have a subframe FrameNavigationEntry. 1011 // The entry should now have a subframe FrameNavigationEntry.
1154 ASSERT_EQ(1U, entry->root_node()->children.size()); 1012 ASSERT_EQ(1U, entry->root_node()->children.size());
1155 FrameNavigationEntry* frame_entry = 1013 FrameNavigationEntry* frame_entry =
1156 entry->root_node()->children[0]->frame_entry.get(); 1014 entry->root_node()->children[0]->frame_entry.get();
1157 EXPECT_EQ(frame_url, frame_entry->url()); 1015 EXPECT_EQ(frame_url, frame_entry->url());
1158 EXPECT_TRUE(controller.HasCommittedRealLoad(root->child_at(0)));
1159 } else { 1016 } else {
1160 // There are no subframe FrameNavigationEntries by default. 1017 // There are no subframe FrameNavigationEntries by default.
1161 EXPECT_EQ(0U, entry->root_node()->children.size()); 1018 EXPECT_EQ(0U, entry->root_node()->children.size());
1162 } 1019 }
1163 1020
1164 // 2. Create a second, initially cross-site iframe. 1021 // Create a second iframe.
1165 GURL foo_url(embedded_test_server()->GetURL(
1166 "foo.com", "/navigation_controller/simple_page_1.html"));
1167 { 1022 {
1168 LoadCommittedCapturer capturer(shell()->web_contents()); 1023 LoadCommittedCapturer capturer(shell()->web_contents());
1169 std::string script = "var iframe = document.createElement('iframe');" 1024 std::string script = "var iframe = document.createElement('iframe');"
1170 "iframe.src = '" + foo_url.spec() + "';" 1025 "iframe.src = '" + frame_url.spec() + "';"
1171 "document.body.appendChild(iframe);"; 1026 "document.body.appendChild(iframe);";
1172 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script)); 1027 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
1173 capturer.Wait(); 1028 capturer.Wait();
1174 EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type()); 1029 EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
1175 } 1030 }
1176 1031
1177 // The last committed NavigationEntry shouldn't have changed. 1032 // The last committed NavigationEntry shouldn't have changed.
1178 EXPECT_EQ(1, controller.GetEntryCount()); 1033 EXPECT_EQ(1, controller.GetEntryCount());
1179 entry = controller.GetLastCommittedEntry(); 1034 entry = controller.GetLastCommittedEntry();
1180 EXPECT_EQ(main_url, entry->GetURL()); 1035 EXPECT_EQ(main_url, entry->GetURL());
1181 root_entry = entry->root_node()->frame_entry.get(); 1036 root_entry = entry->root_node()->frame_entry.get();
1182 EXPECT_EQ(main_url, root_entry->url()); 1037 EXPECT_EQ(main_url, root_entry->url());
1183 EXPECT_FALSE(controller.GetPendingEntry());
1184 1038
1185 // Verify subframe entries if we're in --site-per-process mode. 1039 // Verify subframe entries if we're in --site-per-process mode.
1186 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 1040 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1187 switches::kSitePerProcess)) { 1041 switches::kSitePerProcess)) {
1188 // The entry should now have 2 subframe FrameNavigationEntries. 1042 // The entry should now have 2 subframe FrameNavigationEntries.
1189 ASSERT_EQ(2U, entry->root_node()->children.size()); 1043 ASSERT_EQ(2U, entry->root_node()->children.size());
1190 FrameNavigationEntry* frame_entry = 1044 FrameNavigationEntry* frame_entry =
1191 entry->root_node()->children[1]->frame_entry.get(); 1045 entry->root_node()->children[1]->frame_entry.get();
1192 EXPECT_EQ(foo_url, frame_entry->url()); 1046 EXPECT_EQ(frame_url, frame_entry->url());
1193 EXPECT_TRUE(controller.HasCommittedRealLoad(root->child_at(1)));
1194 } else { 1047 } else {
1195 // There are no subframe FrameNavigationEntries by default. 1048 // There are no subframe FrameNavigationEntries by default.
1196 EXPECT_EQ(0U, entry->root_node()->children.size()); 1049 EXPECT_EQ(0U, entry->root_node()->children.size());
1197 } 1050 }
1198 1051
1199 // 3. Create a nested iframe in the second subframe. 1052 // Create a nested iframe in the second subframe.
1200 { 1053 {
1201 LoadCommittedCapturer capturer(shell()->web_contents()); 1054 LoadCommittedCapturer capturer(shell()->web_contents());
1202 std::string script = "var iframe = document.createElement('iframe');" 1055 std::string script = "var iframe = document.createElement('iframe');"
1203 "iframe.src = '" + foo_url.spec() + "';" 1056 "iframe.src = '" + frame_url.spec() + "';"
1204 "document.body.appendChild(iframe);"; 1057 "document.body.appendChild(iframe);";
1205 EXPECT_TRUE(content::ExecuteScript(root->child_at(1)->current_frame_host(), 1058 EXPECT_TRUE(content::ExecuteScript(root->child_at(1)->current_frame_host(),
1206 script)); 1059 script));
1207 capturer.Wait(); 1060 capturer.Wait();
1208 EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type()); 1061 EXPECT_EQ(ui::PAGE_TRANSITION_AUTO_SUBFRAME, capturer.transition_type());
1209 } 1062 }
1210 1063
1211 // The last committed NavigationEntry shouldn't have changed. 1064 // The last committed NavigationEntry shouldn't have changed.
1212 EXPECT_EQ(1, controller.GetEntryCount()); 1065 EXPECT_EQ(1, controller.GetEntryCount());
1213 entry = controller.GetLastCommittedEntry(); 1066 entry = controller.GetLastCommittedEntry();
1214 EXPECT_EQ(main_url, entry->GetURL()); 1067 EXPECT_EQ(main_url, entry->GetURL());
1215 root_entry = entry->root_node()->frame_entry.get(); 1068 root_entry = entry->root_node()->frame_entry.get();
1216 EXPECT_EQ(main_url, root_entry->url()); 1069 EXPECT_EQ(main_url, root_entry->url());
1217 1070
1218 // Verify subframe entries if we're in --site-per-process mode. 1071 // Verify subframe entries if we're in --site-per-process mode.
1219 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 1072 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1220 switches::kSitePerProcess)) { 1073 switches::kSitePerProcess)) {
1221 // The entry should now have 2 subframe FrameNavigationEntries. 1074 // The entry should now have 2 subframe FrameNavigationEntries.
1222 ASSERT_EQ(2U, entry->root_node()->children.size()); 1075 ASSERT_EQ(2U, entry->root_node()->children.size());
1223 ASSERT_EQ(1U, entry->root_node()->children[1]->children.size()); 1076 ASSERT_EQ(1U, entry->root_node()->children[1]->children.size());
1224 FrameNavigationEntry* frame_entry = 1077 FrameNavigationEntry* frame_entry =
1225 entry->root_node()->children[1]->children[0]->frame_entry.get(); 1078 entry->root_node()->children[1]->children[0]->frame_entry.get();
1226 EXPECT_EQ(foo_url, frame_entry->url()); 1079 EXPECT_EQ(frame_url, frame_entry->url());
1227 } else { 1080 } else {
1228 // There are no subframe FrameNavigationEntries by default. 1081 // There are no subframe FrameNavigationEntries by default.
1229 EXPECT_EQ(0U, entry->root_node()->children.size()); 1082 EXPECT_EQ(0U, entry->root_node()->children.size());
1230 } 1083 }
1231
1232 // TODO(creis): Add tests for another subframe on B, and for a subframe on A
1233 // within it. Both are currently broken.
1234
1235 // Check the end result of the frame tree.
1236 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1237 switches::kSitePerProcess)) {
1238 FrameTreeVisualizer visualizer;
1239 EXPECT_EQ(
1240 " Site A ------------ proxies for B\n"
1241 " |--Site A ------- proxies for B\n"
1242 " +--Site B ------- proxies for A\n"
1243 " +--Site B -- proxies for A\n"
1244 "Where A = http://127.0.0.1/\n"
1245 " B = http://foo.com/",
1246 visualizer.DepictFrameTree(root));
1247 }
1248 } 1084 }
1249 1085
1250 // Verify the tree of FrameNavigationEntries after NAVIGATION_TYPE_NEW_SUBFRAME
1251 // commits.
1252 IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest,
1253 FrameNavigationEntry_NewSubframe) {
1254 GURL main_url(embedded_test_server()->GetURL(
1255 "/navigation_controller/simple_page_1.html"));
1256 NavigateToURL(shell(), main_url);
1257 FrameTreeNode* root =
1258 static_cast<WebContentsImpl*>(shell()->web_contents())->
1259 GetFrameTree()->root();
1260
1261 // 1. Create a same-site iframe.
1262 GURL frame_url(embedded_test_server()->GetURL(
1263 "/navigation_controller/simple_page_2.html"));
1264 {
1265 LoadCommittedCapturer capturer(shell()->web_contents());
1266 std::string script = "var iframe = document.createElement('iframe');"
1267 "iframe.src = '" + frame_url.spec() + "';"
1268 "document.body.appendChild(iframe);";
1269 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
1270 capturer.Wait();
1271 }
1272
1273 // 2. Navigate in the first subframe same-site.
1274 GURL frame_url2(embedded_test_server()->GetURL(
1275 "/navigation_controller/page_with_links.html"));
1276 {
1277 FrameNavigateParamsCapturer capturer(root->child_at(0));
1278 NavigateFrameToURL(root->child_at(0), frame_url2);
1279 capturer.Wait();
1280 EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME,
1281 capturer.params().transition);
1282 EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.details().type);
1283 }
1284
1285 // 3. Create a second, initially cross-site iframe.
1286 GURL foo_url(embedded_test_server()->GetURL(
1287 "foo.com", "/navigation_controller/simple_page_1.html"));
1288 {
1289 LoadCommittedCapturer capturer(shell()->web_contents());
1290 std::string script = "var iframe = document.createElement('iframe');"
1291 "iframe.src = '" + foo_url.spec() + "';"
1292 "document.body.appendChild(iframe);";
1293 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
1294 capturer.Wait();
1295 }
1296
1297 // 4. Navigate in the second subframe cross-site.
1298 GURL bar_url(embedded_test_server()->GetURL(
1299 "bar.com", "/navigation_controller/simple_page_1.html"));
1300 {
1301 FrameNavigateParamsCapturer capturer(root->child_at(1));
1302 std::string script = "var frames = document.getElementsByTagName('iframe');"
1303 "frames[1].src = '" + bar_url.spec() + "';";
1304 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script));
1305 capturer.Wait();
1306 EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME,
1307 capturer.params().transition);
1308 EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.details().type);
1309 }
1310
1311 // TODO(creis): Expand this test once we clone FrameNavigationEntries for
1312 // NEW_SUBFRAME navigations.
1313
1314 // Check the end result of the frame tree.
1315 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1316 switches::kSitePerProcess)) {
1317 FrameTreeVisualizer visualizer;
1318 EXPECT_EQ(
1319 " Site A ------------ proxies for B\n"
1320 " |--Site A ------- proxies for B\n"
1321 " +--Site B ------- proxies for A\n"
1322 "Where A = http://127.0.0.1/\n"
1323 " B = http://bar.com/",
1324 visualizer.DepictFrameTree(root));
1325 }
1326 }
1327
1328 namespace { 1086 namespace {
1329 1087
1330 class HttpThrottle : public ResourceThrottle { 1088 class HttpThrottle : public ResourceThrottle {
1331 public: 1089 public:
1332 // ResourceThrottle 1090 // ResourceThrottle
1333 void WillStartRequest(bool* defer) override { 1091 void WillStartRequest(bool* defer) override {
1334 *defer = true; 1092 *defer = true;
1335 } 1093 }
1336 1094
1337 const char* GetNameForLogging() const override { 1095 const char* GetNameForLogging() const override {
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
1672 // tricky. 1430 // tricky.
1673 EXPECT_EQ(nullptr, controller.GetPendingEntry()); 1431 EXPECT_EQ(nullptr, controller.GetPendingEntry());
1674 shell()->web_contents()->Stop(); 1432 shell()->web_contents()->Stop();
1675 watcher.Wait(); 1433 watcher.Wait();
1676 } 1434 }
1677 1435
1678 ResourceDispatcherHost::Get()->SetDelegate(nullptr); 1436 ResourceDispatcherHost::Get()->SetDelegate(nullptr);
1679 } 1437 }
1680 1438
1681 } // namespace content 1439 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/frame_host/navigation_controller_impl.cc ('k') | content/browser/frame_host/navigation_entry_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698