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

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

Issue 881413005: Fix flakyness in NavigateRemoteFrame browsertest. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 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
« no previous file with comments | « no previous file | content/renderer/render_frame_proxy.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 "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 265 matching lines...) Expand 10 before | Expand all | Expand 10 after
276 EXPECT_EQ(proxy_to_parent, child->render_manager()->GetProxyToParent()); 276 EXPECT_EQ(proxy_to_parent, child->render_manager()->GetProxyToParent());
277 EXPECT_TRUE(proxy_to_parent->cross_process_frame_connector()); 277 EXPECT_TRUE(proxy_to_parent->cross_process_frame_connector());
278 EXPECT_NE( 278 EXPECT_NE(
279 child->current_frame_host()->render_view_host()->GetView(), 279 child->current_frame_host()->render_view_host()->GetView(),
280 proxy_to_parent->cross_process_frame_connector()->get_view_for_testing()); 280 proxy_to_parent->cross_process_frame_connector()->get_view_for_testing());
281 EXPECT_TRUE(child->current_frame_host()->GetRenderWidgetHost()); 281 EXPECT_TRUE(child->current_frame_host()->GetRenderWidgetHost());
282 } 282 }
283 283
284 // Disabled for flaky crashing: crbug.com/446575 284 // Disabled for flaky crashing: crbug.com/446575
285 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, 285 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
286 DISABLED_NavigateRemoteFrame) { 286 NavigateRemoteFrame) {
287 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); 287 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html"));
288 NavigateToURL(shell(), main_url); 288 NavigateToURL(shell(), main_url);
289 289
290 // It is safe to obtain the root frame tree node here, as it doesn't change. 290 // It is safe to obtain the root frame tree node here, as it doesn't change.
291 FrameTreeNode* root = 291 FrameTreeNode* root =
292 static_cast<WebContentsImpl*>(shell()->web_contents())-> 292 static_cast<WebContentsImpl*>(shell()->web_contents())->
293 GetFrameTree()->root(); 293 GetFrameTree()->root();
294 294
295 TestNavigationObserver observer(shell()->web_contents()); 295 TestNavigationObserver observer(shell()->web_contents());
296 296
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 330
331 // Navigate back to the parent's origin and ensure we return to the 331 // Navigate back to the parent's origin and ensure we return to the
332 // parent's process. 332 // parent's process.
333 NavigateFrameToURL(child, http_url); 333 NavigateFrameToURL(child, http_url);
334 EXPECT_EQ(http_url, observer.last_navigation_url()); 334 EXPECT_EQ(http_url, observer.last_navigation_url());
335 EXPECT_TRUE(observer.last_navigation_succeeded()); 335 EXPECT_TRUE(observer.last_navigation_succeeded());
336 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(), 336 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(),
337 child->current_frame_host()->GetSiteInstance()); 337 child->current_frame_host()->GetSiteInstance());
338 } 338 }
339 339
340 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
341 NavigateRemoteFrameToBlankAndDataURLs) {
342 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html"));
343 NavigateToURL(shell(), main_url);
344
345 // It is safe to obtain the root frame tree node here, as it doesn't change.
346 FrameTreeNode* root =
347 static_cast<WebContentsImpl*>(shell()->web_contents())->
348 GetFrameTree()->root();
349
350 TestNavigationObserver observer(shell()->web_contents());
351
352 // Load same-site page into iframe.
353 FrameTreeNode* child = root->child_at(0);
354 GURL http_url(embedded_test_server()->GetURL("/title1.html"));
355 NavigateFrameToURL(child, http_url);
356 EXPECT_EQ(http_url, observer.last_navigation_url());
357 EXPECT_TRUE(observer.last_navigation_succeeded());
358
359 // Load cross-site page into iframe.
360 GURL url = embedded_test_server()->GetURL("foo.com", "/title2.html");
361 NavigateFrameToURL(root->child_at(0), url);
362 EXPECT_TRUE(observer.last_navigation_succeeded());
363 EXPECT_EQ(url, observer.last_navigation_url());
364 ASSERT_EQ(2U, root->child_count());
365 EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
366 root->child_at(0)->current_frame_host()->GetSiteInstance());
367
368 // Navigate iframe to a data URL. The navigation happens from a script in the
369 // parent frame, so the data URL should be committed in the same SiteInstance
370 // as the parent frame.
371 GURL data_url("data:text/html,dataurl");
372 NavigateIframeToURL(shell()->web_contents(), "test", data_url);
373 EXPECT_TRUE(observer.last_navigation_succeeded());
374 EXPECT_EQ(data_url, observer.last_navigation_url());
375
376 // Ensure that we have navigated using the top level process.
377 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(),
378 root->child_at(0)->current_frame_host()->GetSiteInstance());
379
380 // Load cross-site page into iframe.
381 url = embedded_test_server()->GetURL("bar.com", "/title2.html");
382 NavigateFrameToURL(root->child_at(0), url);
383 EXPECT_TRUE(observer.last_navigation_succeeded());
384 EXPECT_EQ(url, observer.last_navigation_url());
385 ASSERT_EQ(2U, root->child_count());
386 EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
387 root->child_at(0)->current_frame_host()->GetSiteInstance());
388
389 // Navigate iframe to about:blank. The navigation happens from a script in the
390 // parent frame, so it should be committed in the same SiteInstance as the
391 // parent frame.
392 GURL about_blank_url("about:blank");
393 NavigateIframeToURL(shell()->web_contents(), "test", about_blank_url);
394 EXPECT_TRUE(observer.last_navigation_succeeded());
395 EXPECT_EQ(about_blank_url, observer.last_navigation_url());
396
397 // Ensure that we have navigated using the top level process.
398 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(),
399 root->child_at(0)->current_frame_host()->GetSiteInstance());
400 }
401
340 // This test checks that killing a renderer process of a remote frame 402 // This test checks that killing a renderer process of a remote frame
341 // and then navigating some other frame to the same SiteInstance of the killed 403 // and then navigating some other frame to the same SiteInstance of the killed
342 // process works properly. 404 // process works properly.
343 // This can be illustrated as follows, 405 // This can be illustrated as follows,
344 // where 1/2/3 are FrameTreeNode-s and A/B are processes and B* is the killed 406 // where 1/2/3 are FrameTreeNode-s and A/B are processes and B* is the killed
345 // B process: 407 // B process:
346 // 408 //
347 // 1 A A A 409 // 1 A A A
348 // / \ -> / \ -> Kill B -> / \ -> Navigate 3 to B -> / \ . 410 // / \ -> / \ -> Kill B -> / \ -> Navigate 3 to B -> / \ .
349 // 2 3 B A B* A B* B 411 // 2 3 B A B* A B* B
(...skipping 827 matching lines...) Expand 10 before | Expand all | Expand 10 after
1177 1239
1178 // Check that the window.name seen by the frame matches the name attribute 1240 // Check that the window.name seen by the frame matches the name attribute
1179 // specified by its parent in the iframe tag. 1241 // specified by its parent in the iframe tag.
1180 std::string result; 1242 std::string result;
1181 EXPECT_TRUE(ExecuteScriptAndExtractString( 1243 EXPECT_TRUE(ExecuteScriptAndExtractString(
1182 root->child_at(0)->current_frame_host(), 1244 root->child_at(0)->current_frame_host(),
1183 "window.domAutomationController.send(window.name);", &result)); 1245 "window.domAutomationController.send(window.name);", &result));
1184 EXPECT_EQ(result, "3-1-name"); 1246 EXPECT_EQ(result, "3-1-name");
1185 } 1247 }
1186 1248
1187 // TODO(lfg): Merge the test below with NavigateRemoteFrame test.
1188 // TODO(lfg): Disabled because this triggers http://crbug.com/433012, and since
1189 // the renderer process crashes, it causes the title watcher to never return.
1190 // Alternatively, this could also be fixed if we could use NavigateIframeToURL
1191 // and classified the navigation as MANUAL_SUBFRAME (http://crbug.com/441863) or
1192 // if we waited for DidStopLoading (currently broken -- see comment in
1193 // NavigateIframeToURL).
1194 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
1195 DISABLED_NavigateRemoteToDataURL) {
1196 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html"));
1197 NavigateToURL(shell(), main_url);
1198
1199 // It is safe to obtain the root frame tree node here, as it doesn't change.
1200 FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
1201 ->GetFrameTree()
1202 ->root();
1203
1204 TestNavigationObserver observer(shell()->web_contents());
1205
1206 // Load cross-site page into iframe.
1207 GURL url = embedded_test_server()->GetURL("foo.com", "/title1.html");
1208 NavigateFrameToURL(root->child_at(0), url);
1209 EXPECT_TRUE(observer.last_navigation_succeeded());
1210 EXPECT_EQ(url, observer.last_navigation_url());
1211
1212 // Ensure that we have created a new process for the subframe.
1213 EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
1214 root->child_at(0)->current_frame_host()->GetSiteInstance());
1215
1216 // Navigate iframe to a data URL. The navigation happens from a script in the
1217 // parent frame, so the data URL should be committed in the same SiteInstance
1218 // as the parent frame.
1219 GURL data_url("data:text/html,dataurl");
1220 std::string script = base::StringPrintf(
1221 "setTimeout(function() {"
1222 "var iframe = document.getElementById('test');"
1223 "iframe.onload = function() { document.title = 'LOADED'; };"
1224 "iframe.src=\"%s\";"
1225 "},0);",
1226 data_url.spec().c_str());
1227 base::string16 passed_string(base::UTF8ToUTF16("LOADED"));
1228 TitleWatcher title_watcher(shell()->web_contents(), passed_string);
1229 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), script));
1230 EXPECT_EQ(title_watcher.WaitAndGetTitle(), passed_string);
1231 EXPECT_TRUE(observer.last_navigation_succeeded());
1232 EXPECT_EQ(data_url, observer.last_navigation_url());
1233
1234 // Ensure that we have navigated using the top level process.
1235 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(),
1236 root->child_at(0)->current_frame_host()->GetSiteInstance());
1237 }
1238
1239 // TODO(lfg): Merge the test below with NavigateRemoteFrame test.
1240 // Disabled due to the same reason as NavigateRemoteToDataURL.
1241 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest,
1242 DISABLED_NavigateRemoteToBlankURL) {
1243 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html"));
1244 NavigateToURL(shell(), main_url);
1245
1246 // It is safe to obtain the root frame tree node here, as it doesn't change.
1247 FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
1248 ->GetFrameTree()
1249 ->root();
1250
1251 TestNavigationObserver observer(shell()->web_contents());
1252
1253 // Load cross-site page into iframe.
1254 GURL url = embedded_test_server()->GetURL("foo.com", "/title1.html");
1255 NavigateFrameToURL(root->child_at(0), url);
1256 EXPECT_TRUE(observer.last_navigation_succeeded());
1257 EXPECT_EQ(url, observer.last_navigation_url());
1258
1259 // Ensure that we have created a new process for the subframe.
1260 EXPECT_NE(shell()->web_contents()->GetSiteInstance(),
1261 root->child_at(0)->current_frame_host()->GetSiteInstance());
1262
1263 // Navigate iframe to about:blank. The navigation happens from a script in the
1264 // parent frame, so it should be committed in the same SiteInstance as the
1265 // parent frame.
1266 GURL about_blank_url("about:blank");
1267 std::string script = base::StringPrintf(
1268 "setTimeout(function() {"
1269 "var iframe = document.getElementById('test');"
1270 "iframe.onload = function() { document.title = 'LOADED'; };"
1271 "iframe.src=\"%s\";"
1272 "},0);",
1273 about_blank_url.spec().c_str());
1274 base::string16 passed_string(base::UTF8ToUTF16("LOADED"));
1275 TitleWatcher title_watcher(shell()->web_contents(), passed_string);
1276 EXPECT_TRUE(ExecuteScript(shell()->web_contents(), script));
1277 EXPECT_EQ(title_watcher.WaitAndGetTitle(), passed_string);
1278 EXPECT_TRUE(observer.last_navigation_succeeded());
1279 EXPECT_EQ(about_blank_url, observer.last_navigation_url());
1280
1281 // Ensure that we have navigated using the top level process.
1282 EXPECT_EQ(shell()->web_contents()->GetSiteInstance(),
1283 root->child_at(0)->current_frame_host()->GetSiteInstance());
1284 }
1285
1286 // Ensure that navigating subframes in --site-per-process mode properly fires 1249 // Ensure that navigating subframes in --site-per-process mode properly fires
1287 // the DidStopLoading event on WebContentsObserver. 1250 // the DidStopLoading event on WebContentsObserver.
1288 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, CrossSiteDidStopLoading) { 1251 IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, CrossSiteDidStopLoading) {
1289 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); 1252 GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html"));
1290 NavigateToURL(shell(), main_url); 1253 NavigateToURL(shell(), main_url);
1291 1254
1292 // It is safe to obtain the root frame tree node here, as it doesn't change. 1255 // It is safe to obtain the root frame tree node here, as it doesn't change.
1293 FrameTreeNode* root = 1256 FrameTreeNode* root =
1294 static_cast<WebContentsImpl*>(shell()->web_contents())-> 1257 static_cast<WebContentsImpl*>(shell()->web_contents())->
1295 GetFrameTree()->root(); 1258 GetFrameTree()->root();
(...skipping 15 matching lines...) Expand all
1311 params.frame_tree_node_id = child->frame_tree_node_id(); 1274 params.frame_tree_node_id = child->frame_tree_node_id();
1312 child->navigator()->GetController()->LoadURLWithParams(params); 1275 child->navigator()->GetController()->LoadURLWithParams(params);
1313 nav_observer.Wait(); 1276 nav_observer.Wait();
1314 1277
1315 // Verify that the navigation succeeded and the expected URL was loaded. 1278 // Verify that the navigation succeeded and the expected URL was loaded.
1316 EXPECT_TRUE(observer.last_navigation_succeeded()); 1279 EXPECT_TRUE(observer.last_navigation_succeeded());
1317 EXPECT_EQ(url, observer.last_navigation_url()); 1280 EXPECT_EQ(url, observer.last_navigation_url());
1318 } 1281 }
1319 1282
1320 } // namespace content 1283 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | content/renderer/render_frame_proxy.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698