| 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 404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 415 // PlzNavigate: returns the speculative RenderFrameHost. | 415 // PlzNavigate: returns the speculative RenderFrameHost. |
| 416 RenderFrameHostImpl* GetPendingFrameHost( | 416 RenderFrameHostImpl* GetPendingFrameHost( |
| 417 RenderFrameHostManager* manager) { | 417 RenderFrameHostManager* manager) { |
| 418 if (base::CommandLine::ForCurrentProcess()->HasSwitch( | 418 if (base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 419 switches::kEnableBrowserSideNavigation)) { | 419 switches::kEnableBrowserSideNavigation)) { |
| 420 return manager->speculative_render_frame_host_.get(); | 420 return manager->speculative_render_frame_host_.get(); |
| 421 } | 421 } |
| 422 return manager->pending_frame_host(); | 422 return manager->pending_frame_host(); |
| 423 } | 423 } |
| 424 | 424 |
| 425 // Exposes RenderFrameHostManager::CollectOpenerFrameTrees for testing. |
| 426 void CollectOpenerFrameTrees( |
| 427 FrameTreeNode* node, |
| 428 std::vector<FrameTree*>* opener_frame_trees, |
| 429 base::hash_set<FrameTreeNode*>* nodes_with_back_links) { |
| 430 node->render_manager()->CollectOpenerFrameTrees(opener_frame_trees, |
| 431 nodes_with_back_links); |
| 432 } |
| 433 |
| 425 private: | 434 private: |
| 426 RenderFrameHostManagerTestWebUIControllerFactory factory_; | 435 RenderFrameHostManagerTestWebUIControllerFactory factory_; |
| 427 }; | 436 }; |
| 428 | 437 |
| 429 // Tests that when you navigate from a chrome:// url to another page, and | 438 // Tests that when you navigate from a chrome:// url to another page, and |
| 430 // then do that same thing in another tab, that the two resulting pages have | 439 // then do that same thing in another tab, that the two resulting pages have |
| 431 // different SiteInstances, BrowsingInstances, and RenderProcessHosts. This is | 440 // different SiteInstances, BrowsingInstances, and RenderProcessHosts. This is |
| 432 // a regression test for bug 9364. | 441 // a regression test for bug 9364. |
| 433 TEST_F(RenderFrameHostManagerTest, NewTabPageProcesses) { | 442 TEST_F(RenderFrameHostManagerTest, NewTabPageProcesses) { |
| 434 set_should_create_webui(true); | 443 set_should_create_webui(true); |
| (...skipping 1796 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2231 // |contents1| -- that was http://crbug.com/473714. | 2240 // |contents1| -- that was http://crbug.com/473714. |
| 2232 EXPECT_FALSE(contents2->GetMainFrame()->IsRenderFrameLive()); | 2241 EXPECT_FALSE(contents2->GetMainFrame()->IsRenderFrameLive()); |
| 2233 contents2->NavigateAndCommit(kUrl3); | 2242 contents2->NavigateAndCommit(kUrl3); |
| 2234 EXPECT_TRUE(contents2->GetMainFrame()->IsRenderFrameLive()); | 2243 EXPECT_TRUE(contents2->GetMainFrame()->IsRenderFrameLive()); |
| 2235 EXPECT_NE(nullptr, | 2244 EXPECT_NE(nullptr, |
| 2236 iframe->GetRenderFrameProxyHost(contents1->GetSiteInstance())); | 2245 iframe->GetRenderFrameProxyHost(contents1->GetSiteInstance())); |
| 2237 EXPECT_EQ(nullptr, | 2246 EXPECT_EQ(nullptr, |
| 2238 iframe->GetRenderFrameProxyHost(contents2->GetSiteInstance())); | 2247 iframe->GetRenderFrameProxyHost(contents2->GetSiteInstance())); |
| 2239 } | 2248 } |
| 2240 | 2249 |
| 2250 // Test that opener proxies are created properly with a cycle on the opener |
| 2251 // chain. |
| 2252 TEST_F(RenderFrameHostManagerTest, CreateOpenerProxiesWithCycleOnOpenerChain) { |
| 2253 const GURL kUrl1("http://www.google.com/"); |
| 2254 const GURL kUrl2("http://www.chromium.org/"); |
| 2255 |
| 2256 // Navigate to an initial URL. |
| 2257 contents()->NavigateAndCommit(kUrl1); |
| 2258 TestRenderFrameHost* rfh1 = main_test_rfh(); |
| 2259 scoped_refptr<SiteInstanceImpl> site_instance1 = rfh1->GetSiteInstance(); |
| 2260 |
| 2261 // Create 2 new tabs and construct the opener chain as follows: |
| 2262 // |
| 2263 // tab2 <--- tab1 <---- contents() |
| 2264 // | ^ |
| 2265 // +-------+ |
| 2266 // |
| 2267 scoped_ptr<TestWebContents> tab1( |
| 2268 TestWebContents::Create(browser_context(), site_instance1.get())); |
| 2269 RenderFrameHostManager* tab1_manager = tab1->GetRenderManagerForTesting(); |
| 2270 scoped_ptr<TestWebContents> tab2( |
| 2271 TestWebContents::Create(browser_context(), site_instance1.get())); |
| 2272 RenderFrameHostManager* tab2_manager = tab2->GetRenderManagerForTesting(); |
| 2273 |
| 2274 contents()->SetOpener(tab1.get()); |
| 2275 tab1->SetOpener(tab2.get()); |
| 2276 tab2->SetOpener(tab1.get()); |
| 2277 |
| 2278 // Navigate main window to a cross-site URL. This will call |
| 2279 // CreateOpenerProxies() to create proxies for the two opener tabs in the new |
| 2280 // SiteInstance. |
| 2281 contents()->NavigateAndCommit(kUrl2); |
| 2282 TestRenderFrameHost* rfh2 = main_test_rfh(); |
| 2283 EXPECT_NE(site_instance1, rfh2->GetSiteInstance()); |
| 2284 |
| 2285 // Check that each tab now has a proxy in the new SiteInstance. |
| 2286 RenderFrameProxyHost* tab1_proxy = |
| 2287 tab1_manager->GetRenderFrameProxyHost(rfh2->GetSiteInstance()); |
| 2288 EXPECT_TRUE(tab1_proxy); |
| 2289 RenderFrameProxyHost* tab2_proxy = |
| 2290 tab2_manager->GetRenderFrameProxyHost(rfh2->GetSiteInstance()); |
| 2291 EXPECT_TRUE(tab2_proxy); |
| 2292 |
| 2293 // Verify that the proxies' openers point to each other. |
| 2294 int tab1_opener_routing_id = |
| 2295 tab1_manager->GetOpenerRoutingID(rfh2->GetSiteInstance()); |
| 2296 int tab2_opener_routing_id = |
| 2297 tab2_manager->GetOpenerRoutingID(rfh2->GetSiteInstance()); |
| 2298 EXPECT_EQ(tab2_proxy->GetRoutingID(), tab1_opener_routing_id); |
| 2299 EXPECT_EQ(tab1_proxy->GetRoutingID(), tab2_opener_routing_id); |
| 2300 |
| 2301 // TODO(alexmos): Because of the cycle, tab2 will require a separate opener |
| 2302 // update IPC. Verify that this IPC is sent once it's implemented. |
| 2303 } |
| 2304 |
| 2305 // Test that opener proxies are created properly when the opener points |
| 2306 // to itself. |
| 2307 TEST_F(RenderFrameHostManagerTest, CreateOpenerProxiesWhenOpenerPointsToSelf) { |
| 2308 const GURL kUrl1("http://www.google.com/"); |
| 2309 const GURL kUrl2("http://www.chromium.org/"); |
| 2310 |
| 2311 // Navigate to an initial URL. |
| 2312 contents()->NavigateAndCommit(kUrl1); |
| 2313 TestRenderFrameHost* rfh1 = main_test_rfh(); |
| 2314 scoped_refptr<SiteInstanceImpl> site_instance1 = rfh1->GetSiteInstance(); |
| 2315 |
| 2316 // Create an opener tab, and simulate that its opener points to itself. |
| 2317 scoped_ptr<TestWebContents> opener( |
| 2318 TestWebContents::Create(browser_context(), site_instance1.get())); |
| 2319 RenderFrameHostManager* opener_manager = opener->GetRenderManagerForTesting(); |
| 2320 contents()->SetOpener(opener.get()); |
| 2321 opener->SetOpener(opener.get()); |
| 2322 |
| 2323 // Navigate main window to a cross-site URL. This will call |
| 2324 // CreateOpenerProxies() to create proxies for the opener tab in the new |
| 2325 // SiteInstance. |
| 2326 contents()->NavigateAndCommit(kUrl2); |
| 2327 TestRenderFrameHost* rfh2 = main_test_rfh(); |
| 2328 EXPECT_NE(site_instance1, rfh2->GetSiteInstance()); |
| 2329 |
| 2330 // Check that the opener now has a proxy in the new SiteInstance. |
| 2331 RenderFrameProxyHost* opener_proxy = |
| 2332 opener_manager->GetRenderFrameProxyHost(rfh2->GetSiteInstance()); |
| 2333 EXPECT_TRUE(opener_proxy); |
| 2334 |
| 2335 // Verify that the proxy's opener points to itself. |
| 2336 int opener_routing_id = |
| 2337 opener_manager->GetOpenerRoutingID(rfh2->GetSiteInstance()); |
| 2338 EXPECT_EQ(opener_proxy->GetRoutingID(), opener_routing_id); |
| 2339 |
| 2340 // TODO(alexmos): Because of the cycle, setting the opener in opener_proxy |
| 2341 // will require a separate opener update IPC. Verify that this IPC is sent |
| 2342 // once it's implemented. |
| 2343 } |
| 2344 |
| 2345 // Build the following frame opener graph and see that it can be properly |
| 2346 // traversed when creating opener proxies: |
| 2347 // |
| 2348 // +-> root4 <--+ root3 <---- root2 +--- root1 |
| 2349 // | / | ^ / \ | / \ . |
| 2350 // | 42 +-----|------- 22 23 <--+ 12 13 |
| 2351 // | +------------+ | | ^ |
| 2352 // +-------------------------------+ +-+ |
| 2353 // |
| 2354 // The test starts traversing openers from root1 and expects to discover all |
| 2355 // four FrameTrees. Nodes 13 (with cycle to itself) and 42 (with back link to |
| 2356 // root3) should be put on the list of nodes that will need their frame openers |
| 2357 // set separately in a second pass, since their opener routing IDs won't be |
| 2358 // available during the first pass of CreateOpenerProxies. |
| 2359 TEST_F(RenderFrameHostManagerTest, TraverseComplexOpenerChain) { |
| 2360 FrameTree* tree1 = contents()->GetFrameTree(); |
| 2361 FrameTreeNode* root1 = tree1->root(); |
| 2362 int process_id = root1->current_frame_host()->GetProcess()->GetID(); |
| 2363 tree1->AddFrame(root1, process_id, 12, blink::WebTreeScopeType::Document, |
| 2364 std::string(), blink::WebSandboxFlags::None); |
| 2365 tree1->AddFrame(root1, process_id, 13, blink::WebTreeScopeType::Document, |
| 2366 std::string(), blink::WebSandboxFlags::None); |
| 2367 |
| 2368 scoped_ptr<TestWebContents> tab2( |
| 2369 TestWebContents::Create(browser_context(), nullptr)); |
| 2370 FrameTree* tree2 = tab2->GetFrameTree(); |
| 2371 FrameTreeNode* root2 = tree2->root(); |
| 2372 process_id = root2->current_frame_host()->GetProcess()->GetID(); |
| 2373 tree2->AddFrame(root2, process_id, 22, blink::WebTreeScopeType::Document, |
| 2374 std::string(), blink::WebSandboxFlags::None); |
| 2375 tree2->AddFrame(root2, process_id, 23, blink::WebTreeScopeType::Document, |
| 2376 std::string(), blink::WebSandboxFlags::None); |
| 2377 |
| 2378 scoped_ptr<TestWebContents> tab3( |
| 2379 TestWebContents::Create(browser_context(), nullptr)); |
| 2380 FrameTree* tree3 = tab3->GetFrameTree(); |
| 2381 FrameTreeNode* root3 = tree3->root(); |
| 2382 |
| 2383 scoped_ptr<TestWebContents> tab4( |
| 2384 TestWebContents::Create(browser_context(), nullptr)); |
| 2385 FrameTree* tree4 = tab4->GetFrameTree(); |
| 2386 FrameTreeNode* root4 = tree4->root(); |
| 2387 process_id = root4->current_frame_host()->GetProcess()->GetID(); |
| 2388 tree4->AddFrame(root4, process_id, 42, blink::WebTreeScopeType::Document, |
| 2389 std::string(), blink::WebSandboxFlags::None); |
| 2390 |
| 2391 root1->child_at(1)->SetOpener(root1->child_at(1)); |
| 2392 root1->SetOpener(root2->child_at(1)); |
| 2393 root2->SetOpener(root3); |
| 2394 root2->child_at(0)->SetOpener(root4); |
| 2395 root2->child_at(1)->SetOpener(root4); |
| 2396 root4->child_at(0)->SetOpener(root3); |
| 2397 |
| 2398 std::vector<FrameTree*> opener_frame_trees; |
| 2399 base::hash_set<FrameTreeNode*> nodes_with_back_links; |
| 2400 |
| 2401 CollectOpenerFrameTrees(root1, &opener_frame_trees, &nodes_with_back_links); |
| 2402 |
| 2403 EXPECT_EQ(4U, opener_frame_trees.size()); |
| 2404 EXPECT_EQ(tree1, opener_frame_trees[0]); |
| 2405 EXPECT_EQ(tree2, opener_frame_trees[1]); |
| 2406 EXPECT_EQ(tree3, opener_frame_trees[2]); |
| 2407 EXPECT_EQ(tree4, opener_frame_trees[3]); |
| 2408 |
| 2409 EXPECT_EQ(2U, nodes_with_back_links.size()); |
| 2410 EXPECT_TRUE(nodes_with_back_links.find(root1->child_at(1)) != |
| 2411 nodes_with_back_links.end()); |
| 2412 EXPECT_TRUE(nodes_with_back_links.find(root4->child_at(0)) != |
| 2413 nodes_with_back_links.end()); |
| 2414 } |
| 2415 |
| 2241 } // namespace content | 2416 } // namespace content |
| OLD | NEW |