OLD | NEW |
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 "content/browser/frame_host/cross_process_frame_connector.h" | 9 #include "content/browser/frame_host/cross_process_frame_connector.h" |
10 #include "content/browser/frame_host/frame_tree.h" | 10 #include "content/browser/frame_host/frame_tree.h" |
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
223 static_cast<WebContentsImpl*>(shell()->web_contents()) | 223 static_cast<WebContentsImpl*>(shell()->web_contents()) |
224 ->GetRenderWidgetHostViewsInTree(); | 224 ->GetRenderWidgetHostViewsInTree(); |
225 EXPECT_EQ(1U, views_set.size()); | 225 EXPECT_EQ(1U, views_set.size()); |
226 } | 226 } |
227 RenderFrameProxyHost* proxy_to_parent = | 227 RenderFrameProxyHost* proxy_to_parent = |
228 child->render_manager()->GetRenderFrameProxyHost( | 228 child->render_manager()->GetRenderFrameProxyHost( |
229 shell()->web_contents()->GetSiteInstance()); | 229 shell()->web_contents()->GetSiteInstance()); |
230 EXPECT_FALSE(proxy_to_parent); | 230 EXPECT_FALSE(proxy_to_parent); |
231 | 231 |
232 // Load cross-site page into iframe. | 232 // Load cross-site page into iframe. |
233 NavigateFrameToURL( | 233 GURL url = embedded_test_server()->GetURL("foo.com", "/title2.html"); |
234 root->child_at(0), | 234 NavigateFrameToURL(root->child_at(0), url); |
235 embedded_test_server()->GetURL("/cross-site/foo.com/title2.html")); | |
236 // Verify that the navigation succeeded and the expected URL was loaded. | 235 // Verify that the navigation succeeded and the expected URL was loaded. |
237 EXPECT_TRUE(observer.navigation_succeeded()); | 236 EXPECT_TRUE(observer.navigation_succeeded()); |
238 EXPECT_EQ(embedded_test_server()->base_url().scheme(), | 237 EXPECT_EQ(url, observer.navigation_url()); |
239 observer.navigation_url().scheme()); | |
240 EXPECT_EQ("foo.com", observer.navigation_url().host()); | |
241 EXPECT_EQ("/title2.html", observer.navigation_url().path()); | |
242 | 238 |
243 // Ensure that we have created a new process for the subframe. | 239 // Ensure that we have created a new process for the subframe. |
244 ASSERT_EQ(2U, root->child_count()); | 240 ASSERT_EQ(2U, root->child_count()); |
245 SiteInstance* site_instance = child->current_frame_host()->GetSiteInstance(); | 241 SiteInstance* site_instance = child->current_frame_host()->GetSiteInstance(); |
246 RenderViewHost* rvh = child->current_frame_host()->render_view_host(); | 242 RenderViewHost* rvh = child->current_frame_host()->render_view_host(); |
247 RenderProcessHost* rph = child->current_frame_host()->GetProcess(); | 243 RenderProcessHost* rph = child->current_frame_host()->GetProcess(); |
248 EXPECT_NE(shell()->web_contents()->GetRenderViewHost(), rvh); | 244 EXPECT_NE(shell()->web_contents()->GetRenderViewHost(), rvh); |
249 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), site_instance); | 245 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), site_instance); |
250 EXPECT_NE(shell()->web_contents()->GetRenderProcessHost(), rph); | 246 EXPECT_NE(shell()->web_contents()->GetRenderProcessHost(), rph); |
251 { | 247 { |
252 // There should be now two RenderWidgetHosts, one for each process | 248 // There should be now two RenderWidgetHosts, one for each process |
253 // rendering a frame. | 249 // rendering a frame. |
254 std::set<RenderWidgetHostView*> views_set = | 250 std::set<RenderWidgetHostView*> views_set = |
255 static_cast<WebContentsImpl*>(shell()->web_contents()) | 251 static_cast<WebContentsImpl*>(shell()->web_contents()) |
256 ->GetRenderWidgetHostViewsInTree(); | 252 ->GetRenderWidgetHostViewsInTree(); |
257 EXPECT_EQ(2U, views_set.size()); | 253 EXPECT_EQ(2U, views_set.size()); |
258 } | 254 } |
259 proxy_to_parent = child->render_manager()->GetProxyToParent(); | 255 proxy_to_parent = child->render_manager()->GetProxyToParent(); |
260 EXPECT_TRUE(proxy_to_parent); | 256 EXPECT_TRUE(proxy_to_parent); |
261 EXPECT_TRUE(proxy_to_parent->cross_process_frame_connector()); | 257 EXPECT_TRUE(proxy_to_parent->cross_process_frame_connector()); |
262 EXPECT_EQ( | 258 EXPECT_EQ( |
263 rvh->GetView(), | 259 rvh->GetView(), |
264 proxy_to_parent->cross_process_frame_connector()->get_view_for_testing()); | 260 proxy_to_parent->cross_process_frame_connector()->get_view_for_testing()); |
265 | 261 |
266 // Load another cross-site page into the same iframe. | 262 // Load another cross-site page into the same iframe. |
267 NavigateFrameToURL( | 263 url = embedded_test_server()->GetURL("bar.com", "/title3.html"); |
268 root->child_at(0), | 264 NavigateFrameToURL(root->child_at(0), url); |
269 embedded_test_server()->GetURL("/cross-site/bar.com/title3.html")); | |
270 EXPECT_TRUE(observer.navigation_succeeded()); | 265 EXPECT_TRUE(observer.navigation_succeeded()); |
271 EXPECT_EQ(embedded_test_server()->base_url().scheme(), | 266 EXPECT_EQ(url, observer.navigation_url()); |
272 observer.navigation_url().scheme()); | |
273 EXPECT_EQ("bar.com", observer.navigation_url().host()); | |
274 EXPECT_EQ("/title3.html", observer.navigation_url().path()); | |
275 | 267 |
276 // Check again that a new process is created and is different from the | 268 // Check again that a new process is created and is different from the |
277 // top level one and the previous one. | 269 // top level one and the previous one. |
278 ASSERT_EQ(2U, root->child_count()); | 270 ASSERT_EQ(2U, root->child_count()); |
279 child = root->child_at(0); | 271 child = root->child_at(0); |
280 EXPECT_NE(shell()->web_contents()->GetRenderViewHost(), | 272 EXPECT_NE(shell()->web_contents()->GetRenderViewHost(), |
281 child->current_frame_host()->render_view_host()); | 273 child->current_frame_host()->render_view_host()); |
282 EXPECT_NE(rvh, child->current_frame_host()->render_view_host()); | 274 EXPECT_NE(rvh, child->current_frame_host()->render_view_host()); |
283 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), | 275 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), |
284 child->current_frame_host()->GetSiteInstance()); | 276 child->current_frame_host()->GetSiteInstance()); |
(...skipping 27 matching lines...) Expand all Loading... |
312 SitePerProcessWebContentsObserver observer(shell()->web_contents()); | 304 SitePerProcessWebContentsObserver observer(shell()->web_contents()); |
313 | 305 |
314 // Load same-site page into iframe. | 306 // Load same-site page into iframe. |
315 FrameTreeNode* child = root->child_at(0); | 307 FrameTreeNode* child = root->child_at(0); |
316 GURL http_url(embedded_test_server()->GetURL("/title1.html")); | 308 GURL http_url(embedded_test_server()->GetURL("/title1.html")); |
317 NavigateFrameToURL(child, http_url); | 309 NavigateFrameToURL(child, http_url); |
318 EXPECT_EQ(http_url, observer.navigation_url()); | 310 EXPECT_EQ(http_url, observer.navigation_url()); |
319 EXPECT_TRUE(observer.navigation_succeeded()); | 311 EXPECT_TRUE(observer.navigation_succeeded()); |
320 | 312 |
321 // Load cross-site page into iframe. | 313 // Load cross-site page into iframe. |
322 NavigateFrameToURL( | 314 GURL url = embedded_test_server()->GetURL("foo.com", "/title2.html"); |
323 root->child_at(0), | 315 NavigateFrameToURL(root->child_at(0), url); |
324 embedded_test_server()->GetURL("/cross-site/foo.com/title2.html")); | |
325 EXPECT_TRUE(observer.navigation_succeeded()); | 316 EXPECT_TRUE(observer.navigation_succeeded()); |
326 EXPECT_EQ("foo.com", observer.navigation_url().host()); | 317 EXPECT_EQ(url, observer.navigation_url()); |
327 EXPECT_EQ("/title2.html", observer.navigation_url().path()); | |
328 | 318 |
329 // Ensure that we have created a new process for the subframe. | 319 // Ensure that we have created a new process for the subframe. |
330 ASSERT_EQ(2U, root->child_count()); | 320 ASSERT_EQ(2U, root->child_count()); |
331 SiteInstance* site_instance = child->current_frame_host()->GetSiteInstance(); | 321 SiteInstance* site_instance = child->current_frame_host()->GetSiteInstance(); |
332 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), site_instance); | 322 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), site_instance); |
333 | 323 |
334 // Emulate the main frame changing the src of the iframe such that it | 324 // Emulate the main frame changing the src of the iframe such that it |
335 // navigates cross-site. | 325 // navigates cross-site. |
336 NavigateIframeToURL( | 326 url = embedded_test_server()->GetURL("bar.com", "/title3.html"); |
337 shell(), | 327 NavigateIframeToURL(shell(), url, "test"); |
338 embedded_test_server()->GetURL("/cross-site/bar.com/title3.html"), | |
339 "test"); | |
340 EXPECT_TRUE(observer.navigation_succeeded()); | 328 EXPECT_TRUE(observer.navigation_succeeded()); |
341 EXPECT_EQ("bar.com", observer.navigation_url().host()); | 329 EXPECT_EQ(url, observer.navigation_url()); |
342 EXPECT_EQ("/title3.html", observer.navigation_url().path()); | |
343 | 330 |
344 // Check again that a new process is created and is different from the | 331 // Check again that a new process is created and is different from the |
345 // top level one and the previous one. | 332 // top level one and the previous one. |
346 ASSERT_EQ(2U, root->child_count()); | 333 ASSERT_EQ(2U, root->child_count()); |
347 child = root->child_at(0); | 334 child = root->child_at(0); |
348 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), | 335 EXPECT_NE(shell()->web_contents()->GetSiteInstance(), |
349 child->current_frame_host()->GetSiteInstance()); | 336 child->current_frame_host()->GetSiteInstance()); |
350 EXPECT_NE(site_instance, | 337 EXPECT_NE(site_instance, |
351 child->current_frame_host()->GetSiteInstance()); | 338 child->current_frame_host()->GetSiteInstance()); |
352 | 339 |
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
665 NavigateFrameToURL(root->child_at(0), http_url); | 652 NavigateFrameToURL(root->child_at(0), http_url); |
666 EXPECT_EQ(http_url, observer.navigation_url()); | 653 EXPECT_EQ(http_url, observer.navigation_url()); |
667 EXPECT_TRUE(observer.navigation_succeeded()); | 654 EXPECT_TRUE(observer.navigation_succeeded()); |
668 RenderFrameProxyHost* proxy_to_parent = | 655 RenderFrameProxyHost* proxy_to_parent = |
669 root->child_at(0)->render_manager()->GetRenderFrameProxyHost( | 656 root->child_at(0)->render_manager()->GetRenderFrameProxyHost( |
670 shell()->web_contents()->GetSiteInstance()); | 657 shell()->web_contents()->GetSiteInstance()); |
671 EXPECT_FALSE(proxy_to_parent); | 658 EXPECT_FALSE(proxy_to_parent); |
672 } | 659 } |
673 | 660 |
674 // Create the cross-site URL to navigate to. | 661 // Create the cross-site URL to navigate to. |
675 GURL::Replacements replace_host; | 662 GURL cross_site_url = |
676 std::string foo_com("foo.com"); | 663 embedded_test_server()->GetURL("foo.com", "/frame_tree/1-1.html"); |
677 GURL cross_site_url(embedded_test_server()->GetURL("/frame_tree/1-1.html")); | |
678 replace_host.SetHostStr(foo_com); | |
679 cross_site_url = cross_site_url.ReplaceComponents(replace_host); | |
680 | 664 |
681 // Load cross-site page into the second iframe without waiting for the | 665 // Load cross-site page into the second iframe without waiting for the |
682 // navigation to complete. Once LoadURLWithParams returns, we would expect | 666 // navigation to complete. Once LoadURLWithParams returns, we would expect |
683 // proxies to have been created in the frame tree, but children of the | 667 // proxies to have been created in the frame tree, but children of the |
684 // navigating frame to still be present. The reason is that we don't run the | 668 // navigating frame to still be present. The reason is that we don't run the |
685 // message loop, so no IPCs that alter the frame tree can be processed. | 669 // message loop, so no IPCs that alter the frame tree can be processed. |
686 FrameTreeNode* child = root->child_at(1); | 670 FrameTreeNode* child = root->child_at(1); |
687 SiteInstance* site = NULL; | 671 SiteInstance* site = NULL; |
688 { | 672 { |
689 SitePerProcessWebContentsObserver observer(shell()->web_contents()); | 673 SitePerProcessWebContentsObserver observer(shell()->web_contents()); |
(...skipping 12 matching lines...) Expand all Loading... |
702 root->child_at(0)->render_manager()->GetRenderFrameProxyHost(site)); | 686 root->child_at(0)->render_manager()->GetRenderFrameProxyHost(site)); |
703 EXPECT_FALSE(child->render_manager()->GetRenderFrameProxyHost(site)); | 687 EXPECT_FALSE(child->render_manager()->GetRenderFrameProxyHost(site)); |
704 for (size_t i = 0; i < child->child_count(); ++i) { | 688 for (size_t i = 0; i < child->child_count(); ++i) { |
705 EXPECT_FALSE( | 689 EXPECT_FALSE( |
706 child->child_at(i)->render_manager()->GetRenderFrameProxyHost(site)); | 690 child->child_at(i)->render_manager()->GetRenderFrameProxyHost(site)); |
707 } | 691 } |
708 // Now that the verification is done, run the message loop and wait for the | 692 // Now that the verification is done, run the message loop and wait for the |
709 // navigation to complete. | 693 // navigation to complete. |
710 navigation_observer.Wait(); | 694 navigation_observer.Wait(); |
711 EXPECT_FALSE(child->render_manager()->pending_frame_host()); | 695 EXPECT_FALSE(child->render_manager()->pending_frame_host()); |
| 696 EXPECT_TRUE(observer.navigation_succeeded()); |
712 EXPECT_EQ(cross_site_url, observer.navigation_url()); | 697 EXPECT_EQ(cross_site_url, observer.navigation_url()); |
713 EXPECT_TRUE(observer.navigation_succeeded()); | |
714 } | 698 } |
715 | 699 |
716 // Load another cross-site page into the same iframe. | 700 // Load another cross-site page into the same iframe. |
717 cross_site_url = embedded_test_server()->GetURL("/title2.html"); | 701 cross_site_url = embedded_test_server()->GetURL("bar.com", "/title2.html"); |
718 std::string bar_com("bar.com"); | |
719 replace_host.SetHostStr(bar_com); | |
720 cross_site_url = cross_site_url.ReplaceComponents(replace_host); | |
721 | |
722 { | 702 { |
723 // Perform the same checks as the first cross-site navigation, since | 703 // Perform the same checks as the first cross-site navigation, since |
724 // there have been issues in subsequent cross-site navigations. Also ensure | 704 // there have been issues in subsequent cross-site navigations. Also ensure |
725 // that the SiteInstance has properly changed. | 705 // that the SiteInstance has properly changed. |
726 // TODO(nasko): Once we have proper cleanup of resources, add code to | 706 // TODO(nasko): Once we have proper cleanup of resources, add code to |
727 // verify that the intermediate SiteInstance/RenderFrameHost have been | 707 // verify that the intermediate SiteInstance/RenderFrameHost have been |
728 // properly cleaned up. | 708 // properly cleaned up. |
729 SitePerProcessWebContentsObserver observer(shell()->web_contents()); | 709 SitePerProcessWebContentsObserver observer(shell()->web_contents()); |
730 TestFrameNavigationObserver navigation_observer(child); | 710 TestFrameNavigationObserver navigation_observer(child); |
731 NavigationController::LoadURLParams params(cross_site_url); | 711 NavigationController::LoadURLParams params(cross_site_url); |
(...skipping 10 matching lines...) Expand all Loading... |
742 EXPECT_TRUE(root->render_manager()->GetRenderFrameProxyHost(site2)); | 722 EXPECT_TRUE(root->render_manager()->GetRenderFrameProxyHost(site2)); |
743 EXPECT_TRUE( | 723 EXPECT_TRUE( |
744 root->child_at(0)->render_manager()->GetRenderFrameProxyHost(site2)); | 724 root->child_at(0)->render_manager()->GetRenderFrameProxyHost(site2)); |
745 EXPECT_FALSE(child->render_manager()->GetRenderFrameProxyHost(site2)); | 725 EXPECT_FALSE(child->render_manager()->GetRenderFrameProxyHost(site2)); |
746 for (size_t i = 0; i < child->child_count(); ++i) { | 726 for (size_t i = 0; i < child->child_count(); ++i) { |
747 EXPECT_FALSE( | 727 EXPECT_FALSE( |
748 child->child_at(i)->render_manager()->GetRenderFrameProxyHost(site2)); | 728 child->child_at(i)->render_manager()->GetRenderFrameProxyHost(site2)); |
749 } | 729 } |
750 | 730 |
751 navigation_observer.Wait(); | 731 navigation_observer.Wait(); |
| 732 EXPECT_TRUE(observer.navigation_succeeded()); |
752 EXPECT_EQ(cross_site_url, observer.navigation_url()); | 733 EXPECT_EQ(cross_site_url, observer.navigation_url()); |
753 EXPECT_TRUE(observer.navigation_succeeded()); | |
754 EXPECT_EQ(0U, child->child_count()); | 734 EXPECT_EQ(0U, child->child_count()); |
755 } | 735 } |
756 } | 736 } |
757 | 737 |
758 } // namespace content | 738 } // namespace content |
OLD | NEW |