Index: content/browser/site_per_process_browsertest.cc |
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc |
index af10e3eecb5356c00b344c734801224d8a3c860c..c030d9faecaf2458b73d09a76c8af03391bcf8a1 100644 |
--- a/content/browser/site_per_process_browsertest.cc |
+++ b/content/browser/site_per_process_browsertest.cc |
@@ -6,6 +6,7 @@ |
#include "base/command_line.h" |
#include "base/strings/stringprintf.h" |
+#include "base/strings/utf_string_conversions.h" |
#include "content/browser/frame_host/cross_process_frame_connector.h" |
#include "content/browser/frame_host/frame_tree.h" |
#include "content/browser/frame_host/navigator.h" |
@@ -214,7 +215,7 @@ void SitePerProcessBrowserTest::StartFrameAtDataURL() { |
ASSERT_TRUE(ExecuteScript(shell()->web_contents(), data_url_script)); |
} |
-bool SitePerProcessBrowserTest::NavigateIframeToURL(Shell* window, |
+void SitePerProcessBrowserTest::NavigateIframeToURL(Shell* window, |
const GURL& url, |
std::string iframe_id) { |
// TODO(creis): This should wait for LOAD_STOP, but cross-site subframe |
@@ -231,9 +232,8 @@ bool SitePerProcessBrowserTest::NavigateIframeToURL(Shell* window, |
NOTIFICATION_NAV_ENTRY_COMMITTED, |
Source<NavigationController>( |
&window->web_contents()->GetController())); |
- bool result = ExecuteScript(window->web_contents(), script); |
+ EXPECT_TRUE(ExecuteScript(window->web_contents(), script)); |
load_observer.Wait(); |
- return result; |
} |
void SitePerProcessBrowserTest::SetUpCommandLine(CommandLine* command_line) { |
@@ -410,10 +410,9 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, DISABLED_CrashSubframe) { |
std::string foo_com("foo.com"); |
// Load cross-site page into iframe. |
- EXPECT_TRUE(NavigateIframeToURL( |
- shell(), |
- embedded_test_server()->GetURL("/cross-site/foo.com/title2.html"), |
- "test")); |
+ NavigateIframeToURL(shell(), embedded_test_server()->GetURL( |
+ "/cross-site/foo.com/title2.html"), |
+ "test"); |
// Check the subframe process. |
FrameTreeNode* root = |
@@ -487,8 +486,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
// Should be blocked. |
GURL client_redirect_https_url(https_server.GetURL( |
"client-redirect?files/title1.html")); |
- EXPECT_TRUE(NavigateIframeToURL(shell(), |
- client_redirect_https_url, "test")); |
+ NavigateIframeToURL(shell(), client_redirect_https_url, "test"); |
// DidFailProvisionalLoad when navigating to client_redirect_https_url. |
EXPECT_EQ(observer.navigation_url(), client_redirect_https_url); |
EXPECT_FALSE(observer.navigation_succeeded()); |
@@ -499,8 +497,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
// which redirects to same-site page. |
GURL server_redirect_http_url(https_server.GetURL( |
"server-redirect?" + http_url.spec())); |
- EXPECT_TRUE(NavigateIframeToURL(shell(), |
- server_redirect_http_url, "test")); |
+ NavigateIframeToURL(shell(), server_redirect_http_url, "test"); |
EXPECT_EQ(observer.navigation_url(), http_url); |
EXPECT_TRUE(observer.navigation_succeeded()); |
} |
@@ -510,8 +507,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
// which redirects to cross-site page. |
GURL server_redirect_http_url(https_server.GetURL( |
"server-redirect?files/title1.html")); |
- EXPECT_TRUE(NavigateIframeToURL(shell(), |
- server_redirect_http_url, "test")); |
+ NavigateIframeToURL(shell(), server_redirect_http_url, "test"); |
// DidFailProvisionalLoad when navigating to https_url. |
EXPECT_EQ(observer.navigation_url(), https_url); |
EXPECT_FALSE(observer.navigation_succeeded()); |
@@ -522,8 +518,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
// which redirects to cross-site page. |
GURL server_redirect_http_url(test_server()->GetURL( |
"server-redirect?" + https_url.spec())); |
- EXPECT_TRUE(NavigateIframeToURL(shell(), |
- server_redirect_http_url, "test")); |
+ NavigateIframeToURL(shell(), server_redirect_http_url, "test"); |
EXPECT_EQ(observer.navigation_url(), https_url); |
EXPECT_FALSE(observer.navigation_succeeded()); |
@@ -540,8 +535,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
Source<NavigationController>( |
&shell()->web_contents()->GetController())); |
- EXPECT_TRUE(NavigateIframeToURL(shell(), |
- client_redirect_http_url, "test")); |
+ NavigateIframeToURL(shell(), client_redirect_http_url, "test"); |
// Same-site Client-Redirect Page should be loaded successfully. |
EXPECT_EQ(observer.navigation_url(), client_redirect_http_url); |
@@ -556,10 +550,9 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
{ |
// Load same-site server-redirect page into Iframe, |
// which redirects to same-site page. |
- GURL server_redirect_http_url(test_server()->GetURL( |
- "server-redirect?files/title1.html")); |
- EXPECT_TRUE(NavigateIframeToURL(shell(), |
- server_redirect_http_url, "test")); |
+ GURL server_redirect_http_url( |
+ test_server()->GetURL("server-redirect?files/title1.html")); |
+ NavigateIframeToURL(shell(), server_redirect_http_url, "test"); |
EXPECT_EQ(observer.navigation_url(), http_url); |
EXPECT_TRUE(observer.navigation_succeeded()); |
} |
@@ -574,8 +567,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
Source<NavigationController>( |
&shell()->web_contents()->GetController())); |
- EXPECT_TRUE(NavigateIframeToURL(shell(), |
- client_redirect_http_url, "test")); |
+ NavigateIframeToURL(shell(), client_redirect_http_url, "test"); |
// Same-site Client-Redirect Page should be loaded successfully. |
EXPECT_EQ(observer.navigation_url(), client_redirect_http_url); |
@@ -622,7 +614,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
Source<NavigationController>( |
&shell()->web_contents()->GetController())); |
- EXPECT_TRUE(NavigateIframeToURL(shell(), client_redirect_http_url, "test")); |
+ NavigateIframeToURL(shell(), client_redirect_http_url, "test"); |
// DidFailProvisionalLoad when navigating to client_redirect_https_url. |
load_observer2.Wait(); |
@@ -637,8 +629,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
"server-redirect?" + http_url.spec())); |
GURL server_redirect_http_url(test_server()->GetURL( |
"server-redirect?" + server_redirect_https_url.spec())); |
- EXPECT_TRUE(NavigateIframeToURL(shell(), |
- server_redirect_http_url, "test")); |
+ NavigateIframeToURL(shell(), server_redirect_http_url, "test"); |
EXPECT_EQ(observer.navigation_url(), http_url); |
EXPECT_TRUE(observer.navigation_succeeded()); |
} |
@@ -650,7 +641,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
"server-redirect?" + https_url.spec())); |
GURL server_redirect_http_url(test_server()->GetURL( |
"server-redirect?" + server_redirect_https_url.spec())); |
- EXPECT_TRUE(NavigateIframeToURL(shell(), server_redirect_http_url, "test")); |
+ NavigateIframeToURL(shell(), server_redirect_http_url, "test"); |
// DidFailProvisionalLoad when navigating to https_url. |
EXPECT_EQ(observer.navigation_url(), https_url); |
@@ -664,7 +655,7 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
"client-redirect?" + http_url.spec())); |
GURL server_redirect_http_url(test_server()->GetURL( |
"server-redirect?" + client_redirect_http_url.spec())); |
- EXPECT_TRUE(NavigateIframeToURL(shell(), server_redirect_http_url, "test")); |
+ NavigateIframeToURL(shell(), server_redirect_http_url, "test"); |
// DidFailProvisionalLoad when navigating to client_redirect_http_url. |
EXPECT_EQ(observer.navigation_url(), client_redirect_http_url); |
@@ -831,4 +822,94 @@ IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, CrossSiteTwoLevelNesting) { |
bottom_child->current_frame_host()->GetSiteInstance()); |
} |
+// Disabled because of http://crbug.com/433012 . |
+IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
+ DISABLED_NavigateRemoteToDataURL) { |
+ GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); |
+ NavigateToURL(shell(), main_url); |
+ |
+ // It is safe to obtain the root frame tree node here, as it doesn't change. |
+ FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) |
+ ->GetFrameTree() |
+ ->root(); |
+ |
+ SitePerProcessWebContentsObserver observer(shell()->web_contents()); |
+ |
+ // Load cross-site page into iframe. |
+ GURL url = embedded_test_server()->GetURL("foo.com", "/title1.html"); |
+ NavigateFrameToURL(root->child_at(0), url); |
+ EXPECT_TRUE(observer.navigation_succeeded()); |
+ EXPECT_EQ(url, observer.navigation_url()); |
+ |
+ // Ensure that we have created a new process for the subframe. |
+ EXPECT_NE(shell()->web_contents()->GetSiteInstance(), |
+ root->child_at(0)->current_frame_host()->GetSiteInstance()); |
+ |
+ // Navigate iframe to a data URL. The navigation happens from a script in the |
+ // parent renderer, so the data URL should be rendered in the parent renderer. |
+ GURL data_url("data:text/html,dataurl"); |
+ std::string script = base::StringPrintf( |
+ "setTimeout(function() {" |
+ "var iframe = document.getElementById('test');" |
+ "iframe.onload = function() { document.title = 'LOADED'; };" |
+ "iframe.src=\"%s\";" |
+ "},0);", |
+ data_url.spec().c_str()); |
+ base::string16 passed_string(base::UTF8ToUTF16("LOADED")); |
+ TitleWatcher title_watcher(shell()->web_contents(), passed_string); |
+ EXPECT_TRUE(ExecuteScript(shell()->web_contents(), script)); |
+ (void)title_watcher.WaitAndGetTitle(); |
+ EXPECT_TRUE(observer.navigation_succeeded()); |
+ EXPECT_EQ(data_url, observer.navigation_url()); |
+ |
+ // Ensure that we have navigated using the top level process. |
+ EXPECT_EQ(shell()->web_contents()->GetSiteInstance(), |
+ root->child_at(0)->current_frame_host()->GetSiteInstance()); |
+} |
+ |
+// Disabled because of http://crbug.com/433012 . |
+IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, |
+ DISABLED_NavigateRemoteToBlankURL) { |
+ GURL main_url(embedded_test_server()->GetURL("/site_per_process_main.html")); |
+ NavigateToURL(shell(), main_url); |
+ |
+ // It is safe to obtain the root frame tree node here, as it doesn't change. |
+ FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) |
+ ->GetFrameTree() |
+ ->root(); |
+ |
+ SitePerProcessWebContentsObserver observer(shell()->web_contents()); |
+ |
+ // Load cross-site page into iframe. |
+ GURL url = embedded_test_server()->GetURL("foo.com", "/title1.html"); |
+ NavigateFrameToURL(root->child_at(0), url); |
+ EXPECT_TRUE(observer.navigation_succeeded()); |
+ EXPECT_EQ(url, observer.navigation_url()); |
+ |
+ // Ensure that we have created a new process for the subframe. |
+ EXPECT_NE(shell()->web_contents()->GetSiteInstance(), |
+ root->child_at(0)->current_frame_host()->GetSiteInstance()); |
+ |
+ // Navigate iframe to a data URL. The navigation happens from a script in the |
+ // parent renderer, so the data URL should be rendered in the parent renderer. |
+ GURL data_url("about:blank"); |
+ std::string script = base::StringPrintf( |
+ "setTimeout(function() {" |
+ "var iframe = document.getElementById('test');" |
+ "iframe.onload = function() { document.title = 'LOADED'; };" |
+ "iframe.src=\"%s\";" |
+ "},0);", |
+ data_url.spec().c_str()); |
+ base::string16 passed_string(base::UTF8ToUTF16("LOADED")); |
+ TitleWatcher title_watcher(shell()->web_contents(), passed_string); |
+ EXPECT_TRUE(ExecuteScript(shell()->web_contents(), script)); |
+ (void)title_watcher.WaitAndGetTitle(); |
+ EXPECT_TRUE(observer.navigation_succeeded()); |
+ EXPECT_EQ(data_url, observer.navigation_url()); |
+ |
+ // Ensure that we have navigated using the top level process. |
+ EXPECT_EQ(shell()->web_contents()->GetSiteInstance(), |
+ root->child_at(0)->current_frame_host()->GetSiteInstance()); |
+} |
+ |
} // namespace content |