OLD | NEW |
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 796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
807 capturer.Wait(); | 807 capturer.Wait(); |
808 EXPECT_EQ(ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_FORWARD_BACK, | 808 EXPECT_EQ(ui::PAGE_TRANSITION_LINK | ui::PAGE_TRANSITION_FORWARD_BACK, |
809 capturer.params().transition); | 809 capturer.params().transition); |
810 EXPECT_EQ(NAVIGATION_TYPE_IN_PAGE, capturer.details().type); | 810 EXPECT_EQ(NAVIGATION_TYPE_IN_PAGE, capturer.details().type); |
811 EXPECT_TRUE(capturer.details().is_in_page); | 811 EXPECT_TRUE(capturer.details().is_in_page); |
812 } | 812 } |
813 } | 813 } |
814 | 814 |
815 // Verify that navigations for NAVIGATION_TYPE_NEW_SUBFRAME and | 815 // Verify that navigations for NAVIGATION_TYPE_NEW_SUBFRAME and |
816 // NAVIGATION_TYPE_AUTO_SUBFRAME are properly classified. | 816 // NAVIGATION_TYPE_AUTO_SUBFRAME are properly classified. |
817 // TODO(creis): Re-enable this test when https://crbug.com/498559 is fixed. | 817 IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, |
818 IN_PROC_BROWSER_TEST_F( | 818 NavigationTypeClassification_NewAndAutoSubframe) { |
819 NavigationControllerBrowserTest, | |
820 DISABLED_NavigationTypeClassification_NewAndAutoSubframe) { | |
821 GURL main_url(embedded_test_server()->GetURL( | 819 GURL main_url(embedded_test_server()->GetURL( |
822 "/navigation_controller/page_with_iframe.html")); | 820 "/navigation_controller/page_with_iframe.html")); |
823 NavigateToURL(shell(), main_url); | 821 NavigateToURL(shell(), main_url); |
824 | 822 |
825 // It is safe to obtain the root frame tree node here, as it doesn't change. | 823 // It is safe to obtain the root frame tree node here, as it doesn't change. |
826 FrameTreeNode* root = | 824 FrameTreeNode* root = |
827 static_cast<WebContentsImpl*>(shell()->web_contents())-> | 825 static_cast<WebContentsImpl*>(shell()->web_contents())-> |
828 GetFrameTree()->root(); | 826 GetFrameTree()->root(); |
829 | 827 |
830 ASSERT_EQ(1U, root->child_count()); | 828 ASSERT_EQ(1U, root->child_count()); |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1342 } | 1340 } |
1343 } | 1341 } |
1344 | 1342 |
1345 // Verify the tree of FrameNavigationEntries after NAVIGATION_TYPE_NEW_SUBFRAME | 1343 // Verify the tree of FrameNavigationEntries after NAVIGATION_TYPE_NEW_SUBFRAME |
1346 // commits. | 1344 // commits. |
1347 IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, | 1345 IN_PROC_BROWSER_TEST_F(NavigationControllerBrowserTest, |
1348 FrameNavigationEntry_NewSubframe) { | 1346 FrameNavigationEntry_NewSubframe) { |
1349 GURL main_url(embedded_test_server()->GetURL( | 1347 GURL main_url(embedded_test_server()->GetURL( |
1350 "/navigation_controller/simple_page_1.html")); | 1348 "/navigation_controller/simple_page_1.html")); |
1351 NavigateToURL(shell(), main_url); | 1349 NavigateToURL(shell(), main_url); |
| 1350 const NavigationControllerImpl& controller = |
| 1351 static_cast<const NavigationControllerImpl&>( |
| 1352 shell()->web_contents()->GetController()); |
1352 FrameTreeNode* root = | 1353 FrameTreeNode* root = |
1353 static_cast<WebContentsImpl*>(shell()->web_contents())-> | 1354 static_cast<WebContentsImpl*>(shell()->web_contents())-> |
1354 GetFrameTree()->root(); | 1355 GetFrameTree()->root(); |
1355 | 1356 |
1356 // 1. Create a same-site iframe. | 1357 // 1. Create a same-site iframe. |
1357 GURL frame_url(embedded_test_server()->GetURL( | 1358 GURL frame_url(embedded_test_server()->GetURL( |
1358 "/navigation_controller/simple_page_2.html")); | 1359 "/navigation_controller/simple_page_2.html")); |
1359 { | 1360 { |
1360 LoadCommittedCapturer capturer(shell()->web_contents()); | 1361 LoadCommittedCapturer capturer(shell()->web_contents()); |
1361 std::string script = "var iframe = document.createElement('iframe');" | 1362 std::string script = "var iframe = document.createElement('iframe');" |
1362 "iframe.src = '" + frame_url.spec() + "';" | 1363 "iframe.src = '" + frame_url.spec() + "';" |
1363 "document.body.appendChild(iframe);"; | 1364 "document.body.appendChild(iframe);"; |
1364 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script)); | 1365 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script)); |
1365 capturer.Wait(); | 1366 capturer.Wait(); |
1366 } | 1367 } |
| 1368 NavigationEntryImpl* entry = controller.GetLastCommittedEntry(); |
1367 | 1369 |
1368 // 2. Navigate in the first subframe same-site. | 1370 // 2. Navigate in the subframe same-site. |
1369 GURL frame_url2(embedded_test_server()->GetURL( | 1371 GURL frame_url2(embedded_test_server()->GetURL( |
1370 "/navigation_controller/page_with_links.html")); | 1372 "/navigation_controller/page_with_links.html")); |
1371 { | 1373 { |
1372 FrameNavigateParamsCapturer capturer(root->child_at(0)); | 1374 FrameNavigateParamsCapturer capturer(root->child_at(0)); |
1373 NavigateFrameToURL(root->child_at(0), frame_url2); | 1375 NavigateFrameToURL(root->child_at(0), frame_url2); |
1374 capturer.Wait(); | 1376 capturer.Wait(); |
1375 EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME, | 1377 EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME, |
1376 capturer.params().transition); | 1378 capturer.params().transition); |
1377 EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.details().type); | 1379 EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.details().type); |
1378 } | 1380 } |
1379 | 1381 |
| 1382 // We should have created a new NavigationEntry with the same main frame URL. |
| 1383 EXPECT_EQ(2, controller.GetEntryCount()); |
| 1384 EXPECT_EQ(1, controller.GetLastCommittedEntryIndex()); |
| 1385 NavigationEntryImpl* entry2 = controller.GetLastCommittedEntry(); |
| 1386 EXPECT_NE(entry, entry2); |
| 1387 EXPECT_EQ(main_url, entry2->GetURL()); |
| 1388 FrameNavigationEntry* root_entry2 = entry2->root_node()->frame_entry.get(); |
| 1389 EXPECT_EQ(main_url, root_entry2->url()); |
| 1390 |
| 1391 // Verify subframe entries if we're in --site-per-process mode. |
| 1392 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1393 switches::kSitePerProcess)) { |
| 1394 // The entry should have a new FrameNavigationEntries for the subframe. |
| 1395 ASSERT_EQ(1U, entry2->root_node()->children.size()); |
| 1396 EXPECT_EQ(frame_url2, entry2->root_node()->children[0]->frame_entry->url()); |
| 1397 } else { |
| 1398 // There are no subframe FrameNavigationEntries by default. |
| 1399 EXPECT_EQ(0U, entry2->root_node()->children.size()); |
| 1400 } |
| 1401 |
1380 // 3. Create a second, initially cross-site iframe. | 1402 // 3. Create a second, initially cross-site iframe. |
1381 GURL foo_url(embedded_test_server()->GetURL( | 1403 GURL foo_url(embedded_test_server()->GetURL( |
1382 "foo.com", "/navigation_controller/simple_page_1.html")); | 1404 "foo.com", "/navigation_controller/simple_page_1.html")); |
1383 { | 1405 { |
1384 LoadCommittedCapturer capturer(shell()->web_contents()); | 1406 LoadCommittedCapturer capturer(shell()->web_contents()); |
1385 std::string script = "var iframe = document.createElement('iframe');" | 1407 std::string script = "var iframe = document.createElement('iframe');" |
1386 "iframe.src = '" + foo_url.spec() + "';" | 1408 "iframe.src = '" + foo_url.spec() + "';" |
1387 "document.body.appendChild(iframe);"; | 1409 "document.body.appendChild(iframe);"; |
1388 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script)); | 1410 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script)); |
1389 capturer.Wait(); | 1411 capturer.Wait(); |
1390 } | 1412 } |
1391 | 1413 |
1392 // 4. Navigate in the second subframe cross-site. | 1414 // 4. Create a nested same-site iframe in the second subframe, wait for it to |
| 1415 // commit, then navigate it again. |
| 1416 { |
| 1417 LoadCommittedCapturer capturer(shell()->web_contents()); |
| 1418 std::string script = "var iframe = document.createElement('iframe');" |
| 1419 "iframe.src = '" + foo_url.spec() + "';" |
| 1420 "document.body.appendChild(iframe);"; |
| 1421 EXPECT_TRUE(content::ExecuteScript(root->child_at(1)->current_frame_host(), |
| 1422 script)); |
| 1423 capturer.Wait(); |
| 1424 } |
1393 GURL bar_url(embedded_test_server()->GetURL( | 1425 GURL bar_url(embedded_test_server()->GetURL( |
1394 "bar.com", "/navigation_controller/simple_page_1.html")); | 1426 "bar.com", "/navigation_controller/simple_page_1.html")); |
1395 { | 1427 { |
| 1428 FrameNavigateParamsCapturer capturer(root->child_at(1)->child_at(0)); |
| 1429 NavigateFrameToURL(root->child_at(1)->child_at(0), bar_url); |
| 1430 capturer.Wait(); |
| 1431 EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME, |
| 1432 capturer.params().transition); |
| 1433 EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.details().type); |
| 1434 } |
| 1435 |
| 1436 // We should have created a new NavigationEntry with the same main frame URL. |
| 1437 EXPECT_EQ(3, controller.GetEntryCount()); |
| 1438 EXPECT_EQ(2, controller.GetLastCommittedEntryIndex()); |
| 1439 NavigationEntryImpl* entry3 = controller.GetLastCommittedEntry(); |
| 1440 EXPECT_NE(entry, entry3); |
| 1441 EXPECT_EQ(main_url, entry3->GetURL()); |
| 1442 FrameNavigationEntry* root_entry3 = entry3->root_node()->frame_entry.get(); |
| 1443 EXPECT_EQ(main_url, root_entry3->url()); |
| 1444 |
| 1445 // Verify subframe entries if we're in --site-per-process mode. |
| 1446 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1447 switches::kSitePerProcess)) { |
| 1448 // The entry should still have FrameNavigationEntries for all 3 subframes. |
| 1449 ASSERT_EQ(2U, entry3->root_node()->children.size()); |
| 1450 EXPECT_EQ(frame_url2, entry3->root_node()->children[0]->frame_entry->url()); |
| 1451 EXPECT_EQ(foo_url, entry3->root_node()->children[1]->frame_entry->url()); |
| 1452 ASSERT_EQ(1U, entry3->root_node()->children[1]->children.size()); |
| 1453 EXPECT_EQ( |
| 1454 bar_url, |
| 1455 entry3->root_node()->children[1]->children[0]->frame_entry->url()); |
| 1456 } else { |
| 1457 // There are no subframe FrameNavigationEntries by default. |
| 1458 EXPECT_EQ(0U, entry3->root_node()->children.size()); |
| 1459 } |
| 1460 |
| 1461 // 6. Navigate the second subframe cross-site, clearing its existing subtree. |
| 1462 GURL baz_url(embedded_test_server()->GetURL( |
| 1463 "baz.com", "/navigation_controller/simple_page_1.html")); |
| 1464 { |
1396 FrameNavigateParamsCapturer capturer(root->child_at(1)); | 1465 FrameNavigateParamsCapturer capturer(root->child_at(1)); |
1397 std::string script = "var frames = document.getElementsByTagName('iframe');" | 1466 std::string script = "var frames = document.getElementsByTagName('iframe');" |
1398 "frames[1].src = '" + bar_url.spec() + "';"; | 1467 "frames[1].src = '" + baz_url.spec() + "';"; |
1399 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script)); | 1468 EXPECT_TRUE(content::ExecuteScript(root->current_frame_host(), script)); |
1400 capturer.Wait(); | 1469 capturer.Wait(); |
1401 EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME, | 1470 EXPECT_EQ(ui::PAGE_TRANSITION_MANUAL_SUBFRAME, |
1402 capturer.params().transition); | 1471 capturer.params().transition); |
1403 EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.details().type); | 1472 EXPECT_EQ(NAVIGATION_TYPE_NEW_SUBFRAME, capturer.details().type); |
1404 } | 1473 } |
1405 | 1474 |
1406 // TODO(creis): Expand this test once we clone FrameNavigationEntries for | 1475 // We should have created a new NavigationEntry with the same main frame URL. |
1407 // NEW_SUBFRAME navigations. | 1476 EXPECT_EQ(4, controller.GetEntryCount()); |
| 1477 EXPECT_EQ(3, controller.GetLastCommittedEntryIndex()); |
| 1478 NavigationEntryImpl* entry4 = controller.GetLastCommittedEntry(); |
| 1479 EXPECT_NE(entry, entry4); |
| 1480 EXPECT_EQ(main_url, entry4->GetURL()); |
| 1481 FrameNavigationEntry* root_entry4 = entry4->root_node()->frame_entry.get(); |
| 1482 EXPECT_EQ(main_url, root_entry4->url()); |
| 1483 |
| 1484 // Verify subframe entries if we're in --site-per-process mode. |
| 1485 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 1486 switches::kSitePerProcess)) { |
| 1487 // The entry should still have FrameNavigationEntries for all 3 subframes. |
| 1488 ASSERT_EQ(2U, entry4->root_node()->children.size()); |
| 1489 EXPECT_EQ(frame_url2, entry4->root_node()->children[0]->frame_entry->url()); |
| 1490 EXPECT_EQ(baz_url, entry4->root_node()->children[1]->frame_entry->url()); |
| 1491 ASSERT_EQ(0U, entry4->root_node()->children[1]->children.size()); |
| 1492 } else { |
| 1493 // There are no subframe FrameNavigationEntries by default. |
| 1494 EXPECT_EQ(0U, entry4->root_node()->children.size()); |
| 1495 } |
1408 | 1496 |
1409 // Check the end result of the frame tree. | 1497 // Check the end result of the frame tree. |
1410 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 1498 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
1411 switches::kSitePerProcess)) { | 1499 switches::kSitePerProcess)) { |
1412 FrameTreeVisualizer visualizer; | 1500 FrameTreeVisualizer visualizer; |
1413 EXPECT_EQ( | 1501 EXPECT_EQ( |
1414 " Site A ------------ proxies for B\n" | 1502 " Site A ------------ proxies for B\n" |
1415 " |--Site A ------- proxies for B\n" | 1503 " |--Site A ------- proxies for B\n" |
1416 " +--Site B ------- proxies for A\n" | 1504 " +--Site B ------- proxies for A\n" |
1417 "Where A = http://127.0.0.1/\n" | 1505 "Where A = http://127.0.0.1/\n" |
1418 " B = http://bar.com/", | 1506 " B = http://baz.com/", |
1419 visualizer.DepictFrameTree(root)); | 1507 visualizer.DepictFrameTree(root)); |
1420 } | 1508 } |
1421 } | 1509 } |
1422 | 1510 |
1423 namespace { | 1511 namespace { |
1424 | 1512 |
1425 class HttpThrottle : public ResourceThrottle { | 1513 class HttpThrottle : public ResourceThrottle { |
1426 public: | 1514 public: |
1427 // ResourceThrottle | 1515 // ResourceThrottle |
1428 void WillStartRequest(bool* defer) override { | 1516 void WillStartRequest(bool* defer) override { |
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1767 // tricky. | 1855 // tricky. |
1768 EXPECT_EQ(nullptr, controller.GetPendingEntry()); | 1856 EXPECT_EQ(nullptr, controller.GetPendingEntry()); |
1769 shell()->web_contents()->Stop(); | 1857 shell()->web_contents()->Stop(); |
1770 watcher.Wait(); | 1858 watcher.Wait(); |
1771 } | 1859 } |
1772 | 1860 |
1773 ResourceDispatcherHost::Get()->SetDelegate(nullptr); | 1861 ResourceDispatcherHost::Get()->SetDelegate(nullptr); |
1774 } | 1862 } |
1775 | 1863 |
1776 } // namespace content | 1864 } // namespace content |
OLD | NEW |