Chromium Code Reviews| Index: content/browser/frame_host/frame_tree_browsertest.cc |
| diff --git a/content/browser/frame_host/frame_tree_browsertest.cc b/content/browser/frame_host/frame_tree_browsertest.cc |
| index 0fd2ac04c4350042beffd2b6418f438e9e5a3ec0..83288b6e755258bfbd92af24903667f108062ce7 100644 |
| --- a/content/browser/frame_host/frame_tree_browsertest.cc |
| +++ b/content/browser/frame_host/frame_tree_browsertest.cc |
| @@ -10,6 +10,7 @@ |
| #include "content/browser/web_contents/web_contents_impl.h" |
| #include "content/public/browser/notification_service.h" |
| #include "content/public/browser/notification_types.h" |
| +#include "content/public/common/content_switches.h" |
| #include "content/public/common/url_constants.h" |
| #include "content/public/test/browser_test_utils.h" |
| #include "content/public/test/content_browser_test.h" |
| @@ -17,6 +18,7 @@ |
| #include "content/public/test/test_navigation_observer.h" |
| #include "content/public/test/test_utils.h" |
| #include "content/shell/browser/shell.h" |
| +#include "content/shell/common/shell_switches.h" |
| #include "content/test/content_browser_test_utils_internal.h" |
| #include "content/test/test_frame_navigation_observer.h" |
| #include "net/dns/mock_host_resolver.h" |
| @@ -31,6 +33,17 @@ |
| namespace content { |
| +namespace { |
| + |
| +std::string GetOriginFromRenderer(FrameTreeNode* node) { |
| + std::string origin; |
| + EXPECT_TRUE(ExecuteScriptAndExtractString( |
| + node, "window.domAutomationController.send(document.origin);", &origin)); |
| + return origin; |
| +} |
| + |
| +} // namespace |
| + |
| class FrameTreeBrowserTest : public ContentBrowserTest { |
| public: |
| FrameTreeBrowserTest() {} |
| @@ -41,15 +54,6 @@ class FrameTreeBrowserTest : public ContentBrowserTest { |
| SetupCrossSiteRedirector(embedded_test_server()); |
| } |
| - protected: |
| - std::string GetOriginFromRenderer(FrameTreeNode* node) { |
| - std::string origin; |
| - EXPECT_TRUE(ExecuteScriptAndExtractString( |
| - node, "window.domAutomationController.send(document.origin);", |
| - &origin)); |
| - return origin; |
| - } |
| - |
| private: |
| DISALLOW_COPY_AND_ASSIGN(FrameTreeBrowserTest); |
| }; |
| @@ -691,4 +695,67 @@ IN_PROC_BROWSER_TEST_F(CrossProcessFrameTreeBrowserTest, |
| EXPECT_EQ(root->child_at(1)->current_origin().Serialize(), "null"); |
| } |
| +// FrameTreeBrowserTest variant where we isolate http://*.is, Iceland's top |
| +// level domain. This is an analogue to --isolate-extensions that we use inside |
| +// of content_browsertests, where extensions don't exist. Iceland, like an |
| +// extension process, is a special place with magical powers; we want to protect |
|
Charlie Reis
2016/09/09 21:18:23
Ha!
ncarter (slow)
2016/09/09 21:56:31
Acknowledged.
|
| +// it from outsiders. |
| +class IsolateIcelandFrameTreeBrowserTest : public ContentBrowserTest { |
|
Charlie Reis
2016/09/09 21:18:23
Is there a reason this doesn't derive from FrameTr
ncarter (slow)
2016/09/09 21:56:31
CrossProcessFrameTreeBrowserTest didn't derive fro
|
| + public: |
| + IsolateIcelandFrameTreeBrowserTest() {} |
| + |
| + void SetUpCommandLine(base::CommandLine* command_line) override { |
| + command_line->AppendSwitchASCII(switches::kIsolateSitesForTesting, "*.is"); |
| + } |
| + |
| + void SetUpOnMainThread() override { |
| + host_resolver()->AddRule("*", "127.0.0.1"); |
| + ASSERT_TRUE(embedded_test_server()->Start()); |
| + SetupCrossSiteRedirector(embedded_test_server()); |
| + } |
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(IsolateIcelandFrameTreeBrowserTest); |
| +}; |
| + |
| +// Regression test for https://crbug.com/644966 |
| +IN_PROC_BROWSER_TEST_F(IsolateIcelandFrameTreeBrowserTest, |
| + ProcessSwitchForIsolatedBlob) { |
| + // blink suppresses navigations to blob URLs of origins different from the |
| + // frame initiating the navigation. We disable those checks for this test, to |
| + // test what happens in a compromise scenario. |
| + base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| + switches::kDisableWebSecurity); |
| + |
| + // Set up an iframe. |
| + WebContents* contents = shell()->web_contents(); |
| + FrameTreeNode* root = |
| + static_cast<WebContentsImpl*>(contents)->GetFrameTree()->root(); |
| + GURL main_url(embedded_test_server()->GetURL( |
| + "a.com", "/cross_site_iframe_factory.html?a(b)")); |
| + EXPECT_TRUE(NavigateToURL(shell(), main_url)); |
| + |
| + // The navigation targets an invalid blob url; that's intentional. Secure |
| + // behaviors are for this navigation to either be cancelled, or for it to |
|
Charlie Reis
2016/09/09 21:18:23
I'm a little unclear here. Is there a mode where
ncarter (slow)
2016/09/09 21:56:31
I removed the speculative language.
|
| + // commit an a 404 response in a process dedicated to http://b.is. |
| + std::string result; |
| + EXPECT_TRUE(ExecuteScriptAndExtractString( |
| + root, |
| + "var iframe_element = document.getElementsByTagName('iframe')[0];" |
| + "iframe_element.onload = () => {" |
| + " domAutomationController.send('done');" |
| + "};" |
| + "iframe_element.src = 'blob:http://b.is:2932/';", |
| + &result)); |
| + WaitForLoadStop(contents); |
| + |
| + // Make sure we did a process transfer back to "b.is". |
| + EXPECT_EQ( |
| + " Site A ------------ proxies for B\n" |
| + " +--Site B ------- proxies for A\n" |
| + "Where A = http://a.com/\n" |
| + " B = http://b.is/", |
| + FrameTreeVisualizer().DepictFrameTree(root)); |
| +} |
| + |
| } // namespace content |