OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/command_line.h" | 5 #include "base/command_line.h" |
6 #include "base/files/file_path.h" | 6 #include "base/files/file_path.h" |
7 #include "base/strings/utf_string_conversions.h" | 7 #include "base/strings/utf_string_conversions.h" |
8 #include "base/test/histogram_tester.h" | 8 #include "base/test/histogram_tester.h" |
9 #include "base/time/time.h" | 9 #include "base/time/time.h" |
10 #include "content/browser/compositor/test/no_transport_image_transport_factory.h
" | 10 #include "content/browser/compositor/test/no_transport_image_transport_factory.h
" |
(...skipping 26 matching lines...) Expand all Loading... |
37 #include "content/public/test/mock_render_process_host.h" | 37 #include "content/public/test/mock_render_process_host.h" |
38 #include "content/public/test/test_notification_tracker.h" | 38 #include "content/public/test/test_notification_tracker.h" |
39 #include "content/public/test/test_utils.h" | 39 #include "content/public/test/test_utils.h" |
40 #include "content/test/test_content_browser_client.h" | 40 #include "content/test/test_content_browser_client.h" |
41 #include "content/test/test_content_client.h" | 41 #include "content/test/test_content_client.h" |
42 #include "content/test/test_render_frame_host.h" | 42 #include "content/test/test_render_frame_host.h" |
43 #include "content/test/test_render_view_host.h" | 43 #include "content/test/test_render_view_host.h" |
44 #include "content/test/test_web_contents.h" | 44 #include "content/test/test_web_contents.h" |
45 #include "net/base/load_flags.h" | 45 #include "net/base/load_flags.h" |
46 #include "testing/gtest/include/gtest/gtest.h" | 46 #include "testing/gtest/include/gtest/gtest.h" |
| 47 #include "third_party/WebKit/public/web/WebFrameOwnerProperties.h" |
47 #include "third_party/WebKit/public/web/WebSandboxFlags.h" | 48 #include "third_party/WebKit/public/web/WebSandboxFlags.h" |
48 #include "ui/base/page_transition_types.h" | 49 #include "ui/base/page_transition_types.h" |
49 | 50 |
50 namespace content { | 51 namespace content { |
51 namespace { | 52 namespace { |
52 | 53 |
53 class RenderFrameHostManagerTestWebUIControllerFactory | 54 class RenderFrameHostManagerTestWebUIControllerFactory |
54 : public WebUIControllerFactory { | 55 : public WebUIControllerFactory { |
55 public: | 56 public: |
56 RenderFrameHostManagerTestWebUIControllerFactory() | 57 RenderFrameHostManagerTestWebUIControllerFactory() |
(...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 } | 677 } |
677 | 678 |
678 // Navigate to the first site. | 679 // Navigate to the first site. |
679 NavigateActiveAndCommit(kUrl1); | 680 NavigateActiveAndCommit(kUrl1); |
680 TestRenderFrameHost* initial_rfh = contents()->GetMainFrame(); | 681 TestRenderFrameHost* initial_rfh = contents()->GetMainFrame(); |
681 { | 682 { |
682 RenderFrameHostCreatedObserver observer(contents()); | 683 RenderFrameHostCreatedObserver observer(contents()); |
683 initial_rfh->OnCreateChildFrame( | 684 initial_rfh->OnCreateChildFrame( |
684 initial_rfh->GetProcess()->GetNextRoutingID(), | 685 initial_rfh->GetProcess()->GetNextRoutingID(), |
685 blink::WebTreeScopeType::Document, std::string(), | 686 blink::WebTreeScopeType::Document, std::string(), |
686 blink::WebSandboxFlags::None); | 687 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
687 EXPECT_TRUE(observer.created()); | 688 EXPECT_TRUE(observer.created()); |
688 } | 689 } |
689 | 690 |
690 // Create one more frame in the same SiteInstance where initial_rfh | 691 // Create one more frame in the same SiteInstance where initial_rfh |
691 // exists so that initial_rfh doesn't get deleted on navigation to another | 692 // exists so that initial_rfh doesn't get deleted on navigation to another |
692 // site. | 693 // site. |
693 initial_rfh->GetSiteInstance()->increment_active_frame_count(); | 694 initial_rfh->GetSiteInstance()->increment_active_frame_count(); |
694 | 695 |
695 // Navigate to a cross-site URL. | 696 // Navigate to a cross-site URL. |
696 NavigateActiveAndCommit(kUrl2); | 697 NavigateActiveAndCommit(kUrl2); |
697 EXPECT_TRUE(initial_rfh->is_swapped_out()); | 698 EXPECT_TRUE(initial_rfh->is_swapped_out()); |
698 | 699 |
699 TestRenderFrameHost* dest_rfh = contents()->GetMainFrame(); | 700 TestRenderFrameHost* dest_rfh = contents()->GetMainFrame(); |
700 ASSERT_TRUE(dest_rfh); | 701 ASSERT_TRUE(dest_rfh); |
701 EXPECT_NE(initial_rfh, dest_rfh); | 702 EXPECT_NE(initial_rfh, dest_rfh); |
702 | 703 |
703 { | 704 { |
704 // Since the old RFH is now swapped out, it shouldn't process any messages | 705 // Since the old RFH is now swapped out, it shouldn't process any messages |
705 // to create child frames. | 706 // to create child frames. |
706 RenderFrameHostCreatedObserver observer(contents()); | 707 RenderFrameHostCreatedObserver observer(contents()); |
707 initial_rfh->OnCreateChildFrame( | 708 initial_rfh->OnCreateChildFrame( |
708 initial_rfh->GetProcess()->GetNextRoutingID(), | 709 initial_rfh->GetProcess()->GetNextRoutingID(), |
709 blink::WebTreeScopeType::Document, std::string(), | 710 blink::WebTreeScopeType::Document, std::string(), |
710 blink::WebSandboxFlags::None); | 711 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
711 EXPECT_FALSE(observer.created()); | 712 EXPECT_FALSE(observer.created()); |
712 } | 713 } |
713 } | 714 } |
714 | 715 |
715 TEST_F(RenderFrameHostManagerTest, WhiteListSwapCompositorFrame) { | 716 TEST_F(RenderFrameHostManagerTest, WhiteListSwapCompositorFrame) { |
716 // TODO(nasko): Check with kenrb whether this test can be rewritten and | 717 // TODO(nasko): Check with kenrb whether this test can be rewritten and |
717 // whether it makes sense when swapped out is replaced with proxies. | 718 // whether it makes sense when swapped out is replaced with proxies. |
718 if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) { | 719 if (SiteIsolationPolicy::IsSwappedOutStateForbidden()) { |
719 return; | 720 return; |
720 } | 721 } |
(...skipping 1346 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2067 IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess()); | 2068 IsolateAllSitesForTesting(base::CommandLine::ForCurrentProcess()); |
2068 | 2069 |
2069 const GURL kUrlA("http://www.google.com/"); | 2070 const GURL kUrlA("http://www.google.com/"); |
2070 const GURL kUrlB("http://webkit.org/"); | 2071 const GURL kUrlB("http://webkit.org/"); |
2071 | 2072 |
2072 // Create a page with two child frames. | 2073 // Create a page with two child frames. |
2073 contents()->NavigateAndCommit(kUrlA); | 2074 contents()->NavigateAndCommit(kUrlA); |
2074 contents()->GetMainFrame()->OnCreateChildFrame( | 2075 contents()->GetMainFrame()->OnCreateChildFrame( |
2075 contents()->GetMainFrame()->GetProcess()->GetNextRoutingID(), | 2076 contents()->GetMainFrame()->GetProcess()->GetNextRoutingID(), |
2076 blink::WebTreeScopeType::Document, "frame_name", | 2077 blink::WebTreeScopeType::Document, "frame_name", |
2077 blink::WebSandboxFlags::None); | 2078 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
2078 contents()->GetMainFrame()->OnCreateChildFrame( | 2079 contents()->GetMainFrame()->OnCreateChildFrame( |
2079 contents()->GetMainFrame()->GetProcess()->GetNextRoutingID(), | 2080 contents()->GetMainFrame()->GetProcess()->GetNextRoutingID(), |
2080 blink::WebTreeScopeType::Document, "frame_name", | 2081 blink::WebTreeScopeType::Document, "frame_name", |
2081 blink::WebSandboxFlags::None); | 2082 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
2082 RenderFrameHostManager* root_manager = | 2083 RenderFrameHostManager* root_manager = |
2083 contents()->GetFrameTree()->root()->render_manager(); | 2084 contents()->GetFrameTree()->root()->render_manager(); |
2084 RenderFrameHostManager* iframe1 = | 2085 RenderFrameHostManager* iframe1 = |
2085 contents()->GetFrameTree()->root()->child_at(0)->render_manager(); | 2086 contents()->GetFrameTree()->root()->child_at(0)->render_manager(); |
2086 RenderFrameHostManager* iframe2 = | 2087 RenderFrameHostManager* iframe2 = |
2087 contents()->GetFrameTree()->root()->child_at(1)->render_manager(); | 2088 contents()->GetFrameTree()->root()->child_at(1)->render_manager(); |
2088 | 2089 |
2089 // 1) The first navigation. | 2090 // 1) The first navigation. |
2090 NavigationEntryImpl entryA(NULL /* instance */, -1 /* page_id */, kUrlA, | 2091 NavigationEntryImpl entryA(NULL /* instance */, -1 /* page_id */, kUrlA, |
2091 Referrer(), base::string16() /* title */, | 2092 Referrer(), base::string16() /* title */, |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2209 // Reload |contents1|. | 2210 // Reload |contents1|. |
2210 contents1->NavigateAndCommit(kUrl1); | 2211 contents1->NavigateAndCommit(kUrl1); |
2211 EXPECT_TRUE(contents1->GetMainFrame()->IsRenderFrameLive()); | 2212 EXPECT_TRUE(contents1->GetMainFrame()->IsRenderFrameLive()); |
2212 EXPECT_FALSE(contents2->GetMainFrame()->IsRenderFrameLive()); | 2213 EXPECT_FALSE(contents2->GetMainFrame()->IsRenderFrameLive()); |
2213 EXPECT_EQ(contents1->GetSiteInstance(), contents2->GetSiteInstance()); | 2214 EXPECT_EQ(contents1->GetSiteInstance(), contents2->GetSiteInstance()); |
2214 | 2215 |
2215 // |contents1| creates an out of process iframe. | 2216 // |contents1| creates an out of process iframe. |
2216 contents1->GetMainFrame()->OnCreateChildFrame( | 2217 contents1->GetMainFrame()->OnCreateChildFrame( |
2217 contents1->GetMainFrame()->GetProcess()->GetNextRoutingID(), | 2218 contents1->GetMainFrame()->GetProcess()->GetNextRoutingID(), |
2218 blink::WebTreeScopeType::Document, "frame_name", | 2219 blink::WebTreeScopeType::Document, "frame_name", |
2219 blink::WebSandboxFlags::None); | 2220 blink::WebSandboxFlags::None, blink::WebFrameOwnerProperties()); |
2220 RenderFrameHostManager* iframe = | 2221 RenderFrameHostManager* iframe = |
2221 contents()->GetFrameTree()->root()->child_at(0)->render_manager(); | 2222 contents()->GetFrameTree()->root()->child_at(0)->render_manager(); |
2222 NavigationEntryImpl entry(NULL /* instance */, -1 /* page_id */, kUrl2, | 2223 NavigationEntryImpl entry(NULL /* instance */, -1 /* page_id */, kUrl2, |
2223 Referrer(kUrl1, blink::WebReferrerPolicyDefault), | 2224 Referrer(kUrl1, blink::WebReferrerPolicyDefault), |
2224 base::string16() /* title */, | 2225 base::string16() /* title */, |
2225 ui::PAGE_TRANSITION_LINK, | 2226 ui::PAGE_TRANSITION_LINK, |
2226 false /* is_renderer_init */); | 2227 false /* is_renderer_init */); |
2227 RenderFrameHostImpl* cross_site = NavigateToEntry(iframe, entry); | 2228 RenderFrameHostImpl* cross_site = NavigateToEntry(iframe, entry); |
2228 iframe->DidNavigateFrame(cross_site, true); | 2229 iframe->DidNavigateFrame(cross_site, true); |
2229 | 2230 |
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2369 // The test starts traversing openers from root1 and expects to discover all | 2370 // The test starts traversing openers from root1 and expects to discover all |
2370 // four FrameTrees. Nodes 13 (with cycle to itself) and 42 (with back link to | 2371 // four FrameTrees. Nodes 13 (with cycle to itself) and 42 (with back link to |
2371 // root3) should be put on the list of nodes that will need their frame openers | 2372 // root3) should be put on the list of nodes that will need their frame openers |
2372 // set separately in a second pass, since their opener routing IDs won't be | 2373 // set separately in a second pass, since their opener routing IDs won't be |
2373 // available during the first pass of CreateOpenerProxies. | 2374 // available during the first pass of CreateOpenerProxies. |
2374 TEST_F(RenderFrameHostManagerTest, TraverseComplexOpenerChain) { | 2375 TEST_F(RenderFrameHostManagerTest, TraverseComplexOpenerChain) { |
2375 FrameTree* tree1 = contents()->GetFrameTree(); | 2376 FrameTree* tree1 = contents()->GetFrameTree(); |
2376 FrameTreeNode* root1 = tree1->root(); | 2377 FrameTreeNode* root1 = tree1->root(); |
2377 int process_id = root1->current_frame_host()->GetProcess()->GetID(); | 2378 int process_id = root1->current_frame_host()->GetProcess()->GetID(); |
2378 tree1->AddFrame(root1, process_id, 12, blink::WebTreeScopeType::Document, | 2379 tree1->AddFrame(root1, process_id, 12, blink::WebTreeScopeType::Document, |
2379 std::string(), blink::WebSandboxFlags::None); | 2380 std::string(), blink::WebSandboxFlags::None, |
| 2381 blink::WebFrameOwnerProperties()); |
2380 tree1->AddFrame(root1, process_id, 13, blink::WebTreeScopeType::Document, | 2382 tree1->AddFrame(root1, process_id, 13, blink::WebTreeScopeType::Document, |
2381 std::string(), blink::WebSandboxFlags::None); | 2383 std::string(), blink::WebSandboxFlags::None, |
| 2384 blink::WebFrameOwnerProperties()); |
2382 | 2385 |
2383 scoped_ptr<TestWebContents> tab2( | 2386 scoped_ptr<TestWebContents> tab2( |
2384 TestWebContents::Create(browser_context(), nullptr)); | 2387 TestWebContents::Create(browser_context(), nullptr)); |
2385 FrameTree* tree2 = tab2->GetFrameTree(); | 2388 FrameTree* tree2 = tab2->GetFrameTree(); |
2386 FrameTreeNode* root2 = tree2->root(); | 2389 FrameTreeNode* root2 = tree2->root(); |
2387 process_id = root2->current_frame_host()->GetProcess()->GetID(); | 2390 process_id = root2->current_frame_host()->GetProcess()->GetID(); |
2388 tree2->AddFrame(root2, process_id, 22, blink::WebTreeScopeType::Document, | 2391 tree2->AddFrame(root2, process_id, 22, blink::WebTreeScopeType::Document, |
2389 std::string(), blink::WebSandboxFlags::None); | 2392 std::string(), blink::WebSandboxFlags::None, |
| 2393 blink::WebFrameOwnerProperties()); |
2390 tree2->AddFrame(root2, process_id, 23, blink::WebTreeScopeType::Document, | 2394 tree2->AddFrame(root2, process_id, 23, blink::WebTreeScopeType::Document, |
2391 std::string(), blink::WebSandboxFlags::None); | 2395 std::string(), blink::WebSandboxFlags::None, |
| 2396 blink::WebFrameOwnerProperties()); |
2392 | 2397 |
2393 scoped_ptr<TestWebContents> tab3( | 2398 scoped_ptr<TestWebContents> tab3( |
2394 TestWebContents::Create(browser_context(), nullptr)); | 2399 TestWebContents::Create(browser_context(), nullptr)); |
2395 FrameTree* tree3 = tab3->GetFrameTree(); | 2400 FrameTree* tree3 = tab3->GetFrameTree(); |
2396 FrameTreeNode* root3 = tree3->root(); | 2401 FrameTreeNode* root3 = tree3->root(); |
2397 | 2402 |
2398 scoped_ptr<TestWebContents> tab4( | 2403 scoped_ptr<TestWebContents> tab4( |
2399 TestWebContents::Create(browser_context(), nullptr)); | 2404 TestWebContents::Create(browser_context(), nullptr)); |
2400 FrameTree* tree4 = tab4->GetFrameTree(); | 2405 FrameTree* tree4 = tab4->GetFrameTree(); |
2401 FrameTreeNode* root4 = tree4->root(); | 2406 FrameTreeNode* root4 = tree4->root(); |
2402 process_id = root4->current_frame_host()->GetProcess()->GetID(); | 2407 process_id = root4->current_frame_host()->GetProcess()->GetID(); |
2403 tree4->AddFrame(root4, process_id, 42, blink::WebTreeScopeType::Document, | 2408 tree4->AddFrame(root4, process_id, 42, blink::WebTreeScopeType::Document, |
2404 std::string(), blink::WebSandboxFlags::None); | 2409 std::string(), blink::WebSandboxFlags::None, |
| 2410 blink::WebFrameOwnerProperties()); |
2405 | 2411 |
2406 root1->child_at(1)->SetOpener(root1->child_at(1)); | 2412 root1->child_at(1)->SetOpener(root1->child_at(1)); |
2407 root1->SetOpener(root2->child_at(1)); | 2413 root1->SetOpener(root2->child_at(1)); |
2408 root2->SetOpener(root3); | 2414 root2->SetOpener(root3); |
2409 root2->child_at(0)->SetOpener(root4); | 2415 root2->child_at(0)->SetOpener(root4); |
2410 root2->child_at(1)->SetOpener(root4); | 2416 root2->child_at(1)->SetOpener(root4); |
2411 root4->child_at(0)->SetOpener(root3); | 2417 root4->child_at(0)->SetOpener(root3); |
2412 | 2418 |
2413 std::vector<FrameTree*> opener_frame_trees; | 2419 std::vector<FrameTree*> opener_frame_trees; |
2414 base::hash_set<FrameTreeNode*> nodes_with_back_links; | 2420 base::hash_set<FrameTreeNode*> nodes_with_back_links; |
2415 | 2421 |
2416 CollectOpenerFrameTrees(root1, &opener_frame_trees, &nodes_with_back_links); | 2422 CollectOpenerFrameTrees(root1, &opener_frame_trees, &nodes_with_back_links); |
2417 | 2423 |
2418 EXPECT_EQ(4U, opener_frame_trees.size()); | 2424 EXPECT_EQ(4U, opener_frame_trees.size()); |
2419 EXPECT_EQ(tree1, opener_frame_trees[0]); | 2425 EXPECT_EQ(tree1, opener_frame_trees[0]); |
2420 EXPECT_EQ(tree2, opener_frame_trees[1]); | 2426 EXPECT_EQ(tree2, opener_frame_trees[1]); |
2421 EXPECT_EQ(tree3, opener_frame_trees[2]); | 2427 EXPECT_EQ(tree3, opener_frame_trees[2]); |
2422 EXPECT_EQ(tree4, opener_frame_trees[3]); | 2428 EXPECT_EQ(tree4, opener_frame_trees[3]); |
2423 | 2429 |
2424 EXPECT_EQ(2U, nodes_with_back_links.size()); | 2430 EXPECT_EQ(2U, nodes_with_back_links.size()); |
2425 EXPECT_TRUE(nodes_with_back_links.find(root1->child_at(1)) != | 2431 EXPECT_TRUE(nodes_with_back_links.find(root1->child_at(1)) != |
2426 nodes_with_back_links.end()); | 2432 nodes_with_back_links.end()); |
2427 EXPECT_TRUE(nodes_with_back_links.find(root4->child_at(0)) != | 2433 EXPECT_TRUE(nodes_with_back_links.find(root4->child_at(0)) != |
2428 nodes_with_back_links.end()); | 2434 nodes_with_back_links.end()); |
2429 } | 2435 } |
2430 | 2436 |
2431 } // namespace content | 2437 } // namespace content |
OLD | NEW |