Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2139)

Unified Diff: chrome/browser/devtools/devtools_sanity_browsertest.cc

Issue 2646683002: Implement OOPIFs within Devtools Extensions (Closed)
Patch Set: small URL fixes Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | content/browser/frame_host/render_frame_host_manager.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/devtools/devtools_sanity_browsertest.cc
diff --git a/chrome/browser/devtools/devtools_sanity_browsertest.cc b/chrome/browser/devtools/devtools_sanity_browsertest.cc
index 75002d3c3f5387f780372ab9b0154e97a7030cf6..c93c761931c11a12ea211f47dc261dae9fed71d2 100644
--- a/chrome/browser/devtools/devtools_sanity_browsertest.cc
+++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc
@@ -5,6 +5,7 @@
#include <stddef.h>
#include <memory>
+#include <vector>
#include "base/bind.h"
#include "base/cancelable_callback.h"
@@ -39,6 +40,7 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/chrome_paths.h"
#include "chrome/common/chrome_switches.h"
+#include "chrome/common/extensions/extension_process_policy.h"
#include "chrome/common/pref_names.h"
#include "chrome/common/url_constants.h"
#include "chrome/test/base/in_process_browser_test.h"
@@ -52,6 +54,7 @@
#include "content/public/browser/devtools_agent_host.h"
#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/notification_service.h"
+#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/render_widget_host.h"
#include "content/public/browser/render_widget_host_view.h"
@@ -61,6 +64,7 @@
#include "content/public/browser/worker_service.h"
#include "content/public/browser/worker_service_observer.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/test_navigation_observer.h"
#include "extensions/browser/extension_registry.h"
@@ -87,6 +91,7 @@ using app_modal::NativeAppModalDialog;
using content::BrowserThread;
using content::DevToolsAgentHost;
using content::NavigationController;
+using content::RenderFrameHost;
using content::RenderViewHost;
using content::WebContents;
using content::WorkerService;
@@ -501,6 +506,96 @@ class DevToolsExtensionTest : public DevToolsSanityTest,
return GetExtensionByPath(registry->enabled_extensions(), path);
}
+ // Loads a dynamically generated extension populated with a bunch of test
+ // pages. |name| is the extension name to use in the manifest.
+ // |devtools_page|, if non-empty, indicates which test page should be be
+ // listed as a devtools_page in the manifest. If |devtools_page| is empty, a
+ // non-devtools extension is created instead. |panel_iframe_src| controls the
+ // src= attribute of the <iframe> element in the 'panel.html' test page.
+ const Extension* LoadExtensionForTest(const std::string& name,
+ const std::string& devtools_page,
+ const std::string& panel_iframe_src) {
+ test_extension_dirs_.push_back(
+ base::MakeUnique<extensions::TestExtensionDir>());
+ extensions::TestExtensionDir* dir = test_extension_dirs_.back().get();
+
+ extensions::DictionaryBuilder manifest;
+ manifest.Set("name", name)
+ .Set("version", "1")
+ .Set("manifest_version", 2)
+ // simple_test_page.html is currently the only page referenced outside
+ // of its own extension in the tests
+ .Set("web_accessible_resources",
+ extensions::ListBuilder().Append("simple_test_page.html").Build());
+
+ // If |devtools_page| isn't empty, make it a devtools extension in the
+ // manifest.
+ if (!devtools_page.empty())
+ manifest.Set("devtools_page", devtools_page);
+
+ dir->WriteManifest(manifest.ToJSON());
+
+ GURL http_frame_url =
+ embedded_test_server()->GetURL("a.com", "/popup_iframe.html");
+
+ // If this is a devtools extension, |devtools_page| will indicate which of
+ // these devtools_pages will end up being used. Different tests use
+ // different devtools_pages.
+ dir->WriteFile(FILE_PATH_LITERAL("web_devtools_page.html"),
+ "<html><body><iframe src='" + http_frame_url.spec() +
+ "'></iframe></body></html>");
+
+ dir->WriteFile(FILE_PATH_LITERAL("simple_devtools_page.html"),
+ "<html><body></body></html>");
+
+ dir->WriteFile(
+ FILE_PATH_LITERAL("panel_devtools_page.html"),
+ "<html><head><script "
+ "src='panel_devtools_page.js'></script></head><body></body></html>");
+
+ dir->WriteFile(FILE_PATH_LITERAL("panel_devtools_page.js"),
+ "chrome.devtools.panels.create('iframe_panel',\n"
+ " null,\n"
+ " 'panel.html',\n"
+ " function(panel) {\n"
+ " chrome.devtools.inspectedWindow.eval(\n"
+ " 'console.log(\"PASS\")');\n"
+ " }\n"
+ ");\n");
+
+ dir->WriteFile(FILE_PATH_LITERAL("sidebarpane_devtools_page.html"),
+ "<html><head><script src='sidebarpane_devtools_page.js'>"
+ "</script></head><body></body></html>");
+
+ dir->WriteFile(
+ FILE_PATH_LITERAL("sidebarpane_devtools_page.js"),
+ "chrome.devtools.panels.elements.createSidebarPane('iframe_pane',\n"
+ " function(sidebar) {\n"
+ " chrome.devtools.inspectedWindow.eval(\n"
+ " 'console.log(\"PASS\")');\n"
+ " sidebar.setPage('panel.html');\n"
+ " }\n"
+ ");\n");
+
+ dir->WriteFile(FILE_PATH_LITERAL("panel.html"),
+ "<html><body><iframe src='" + panel_iframe_src +
+ "'></iframe></body></html>");
+
+ dir->WriteFile(FILE_PATH_LITERAL("simple_test_page.html"),
+ "<html><body>This is a test</body></html>");
+
+ GURL web_url = embedded_test_server()->GetURL("a.com", "/title3.html");
+
+ dir->WriteFile(FILE_PATH_LITERAL("multi_frame_page.html"),
+ "<html><body><iframe src='about:blank'>"
+ "</iframe><iframe src='data:text/html,foo'>"
+ "</iframe><iframe src='" +
+ web_url.spec() + "'></iframe></body></html>");
+
+ // Install the extension.
+ return LoadExtensionFromPath(dir->UnpackedPath());
+ }
+
private:
const Extension* GetExtensionByPath(
const extensions::ExtensionSet& extensions,
@@ -553,6 +648,8 @@ class DevToolsExtensionTest : public DevToolsSanityTest,
base::MessageLoopForUI::current()->QuitWhenIdle();
}
+ std::vector<std::unique_ptr<extensions::TestExtensionDir>>
+ test_extension_dirs_;
base::FilePath test_extensions_dir_;
};
@@ -932,66 +1029,496 @@ IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
RunTest("waitForTestResultsInConsole", std::string());
}
-// Tests a chrome.devtools extension panel that embeds an http:// iframe.
-IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, DevToolsExtensionWithHttpIframe) {
+// Tests that http Iframes within the visible devtools panel for the devtools
+// extension are rendered in their own processes and not in the devtools process
+// or the extension's process. This is tested because this is one of the
+// extension pages with devtools access
+// (https://developer.chrome.com/extensions/devtools). Also tests that frames
+// with data URLs and about:blank URLs are rendered in the devtools process,
+// unless a web OOPIF navigates itself to about:blank, in which case it does not
+// end up back in the devtools process. Also tests that when a web IFrame is
+// navigated back to a devtools extension page, it gets put back in the devtools
+// process.
+// http://crbug.com/570483
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
+ HttpIframeInDevToolsExtensionPanel) {
ASSERT_TRUE(embedded_test_server()->Start());
- // Our extension must load an URL from the test server, whose port is only
- // known at runtime. So, to embed the URL, we must dynamically generate the
- // extension, rather than loading it from static content.
- std::unique_ptr<extensions::TestExtensionDir> dir(
- new extensions::TestExtensionDir());
+ // Install the dynamically-generated extension.
+ const Extension* extension =
+ LoadExtensionForTest("Devtools Extension", "panel_devtools_page.html",
+ "/multi_frame_page.html");
+ ASSERT_TRUE(extension);
- extensions::DictionaryBuilder manifest;
- dir->WriteManifest(extensions::DictionaryBuilder()
- .Set("name", "Devtools Panel w/ HTTP Iframe")
- .Set("version", "1")
- .Set("manifest_version", 2)
- .Set("devtools_page", "devtools.html")
- .ToJSON());
+ OpenDevToolsWindow(kDebuggerTestPage, false);
- dir->WriteFile(
- FILE_PATH_LITERAL("devtools.html"),
- "<html><head><script src='devtools.js'></script></head></html>");
+ // Wait for the extension's panel to finish loading -- it'll output 'PASS'
+ // when it's installed. waitForTestResultsInConsole waits until that 'PASS'.
+ RunTestFunction(window_, "waitForTestResultsInConsole");
- dir->WriteFile(
- FILE_PATH_LITERAL("devtools.js"),
- "chrome.devtools.panels.create('iframe_panel',\n"
- " null,\n"
- " 'panel.html',\n"
- " function(panel) {\n"
- " chrome.devtools.inspectedWindow.eval('console.log(\"PASS\")');\n"
- " }\n"
- ");\n");
+ // Now that we know the panel is loaded, switch to it.
+ SwitchToExtensionPanel(window_, extension, "iframe_panel");
+ content::WaitForLoadStop(main_web_contents());
+
+ std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
+ EXPECT_EQ(7U, rfhs.size());
+
+ // This test creates a page with the following frame tree:
+ // - DevTools
+ // - devtools_page from DevTools extension
+ // - Panel (DevTools extension)
+ // - iframe (DevTools extension)
+ // - about:blank
+ // - data:
+ // - web URL
+
+ RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
+ RenderFrameHost* devtools_extension_devtools_page_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ RenderFrameHost* devtools_extension_panel_rfh =
+ ChildFrameAt(main_devtools_rfh, 1);
+ RenderFrameHost* panel_frame_rfh =
+ ChildFrameAt(devtools_extension_panel_rfh, 0);
+ RenderFrameHost* about_blank_frame_rfh = ChildFrameAt(panel_frame_rfh, 0);
+ RenderFrameHost* data_frame_rfh = ChildFrameAt(panel_frame_rfh, 1);
+ RenderFrameHost* web_frame_rfh = ChildFrameAt(panel_frame_rfh, 2);
+
+ GURL web_url = embedded_test_server()->GetURL("a.com", "/title3.html");
+ GURL about_blank_url = GURL(url::kAboutBlankURL);
+ GURL data_url = GURL("data:text/html,foo");
+
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(extension->GetResourceURL("/panel_devtools_page.html"),
+ devtools_extension_devtools_page_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension->GetResourceURL("/panel.html"),
+ devtools_extension_panel_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension->GetResourceURL("/multi_frame_page.html"),
+ panel_frame_rfh->GetLastCommittedURL());
+ EXPECT_EQ(about_blank_url, about_blank_frame_rfh->GetLastCommittedURL());
+ EXPECT_EQ(data_url, data_frame_rfh->GetLastCommittedURL());
+ EXPECT_EQ(web_url, web_frame_rfh->GetLastCommittedURL());
+
+ content::SiteInstance* devtools_instance =
+ main_devtools_rfh->GetSiteInstance();
+ EXPECT_TRUE(
+ devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_EQ(devtools_instance,
+ devtools_extension_devtools_page_rfh->GetSiteInstance());
+ EXPECT_EQ(devtools_instance, devtools_extension_panel_rfh->GetSiteInstance());
+ EXPECT_EQ(devtools_instance, panel_frame_rfh->GetSiteInstance());
+ EXPECT_EQ(devtools_instance, about_blank_frame_rfh->GetSiteInstance());
+ EXPECT_EQ(devtools_instance, data_frame_rfh->GetSiteInstance());
+ EXPECT_EQ(web_url.host(),
+ web_frame_rfh->GetSiteInstance()->GetSiteURL().host());
+ EXPECT_NE(devtools_instance, web_frame_rfh->GetSiteInstance());
+
+ // Check that if the web iframe navigates itself to about:blank, it stays in
+ // the web SiteInstance.
+ std::string about_blank_javascript = "location.href='about:blank';";
+
+ content::TestNavigationManager web_about_blank_manager(main_web_contents(),
+ about_blank_url);
+
+ ASSERT_TRUE(content::ExecuteScript(web_frame_rfh, about_blank_javascript));
+
+ web_about_blank_manager.WaitForNavigationFinished();
+
+ EXPECT_EQ(about_blank_url, web_frame_rfh->GetLastCommittedURL());
+ EXPECT_EQ(web_url.host(),
+ web_frame_rfh->GetSiteInstance()->GetSiteURL().host());
+ EXPECT_NE(devtools_instance, web_frame_rfh->GetSiteInstance());
+
+ // Check that if the web IFrame is navigated back to a devtools extension
+ // page, it gets put back in the devtools process.
+ GURL extension_simple_url =
+ extension->GetResourceURL("/simple_test_page.html");
+ std::string renavigation_javascript =
+ "location.href='" + extension_simple_url.spec() + "';";
+
+ content::TestNavigationManager renavigation_manager(main_web_contents(),
+ extension_simple_url);
+
+ ASSERT_TRUE(content::ExecuteScript(web_frame_rfh, renavigation_javascript));
+
+ renavigation_manager.WaitForNavigationFinished();
+
+ // The old RFH is no longer valid after the renavigation, so we must get the
+ // new one.
+ RenderFrameHost* extension_simple_frame_rfh =
+ ChildFrameAt(panel_frame_rfh, 2);
+
+ EXPECT_EQ(extension_simple_url,
+ extension_simple_frame_rfh->GetLastCommittedURL());
+ EXPECT_EQ(devtools_instance, extension_simple_frame_rfh->GetSiteInstance());
+}
- GURL http_iframe =
- embedded_test_server()->GetURL("a.com", "/popup_iframe.html");
- dir->WriteFile(FILE_PATH_LITERAL("panel.html"),
- "<html><body>Extension panel.<iframe src='" +
- http_iframe.spec() + "'></iframe>");
+// Tests that http Iframes within the sidebar pane page for the devtools
+// extension that is visible in the elements panel are rendered in their own
+// processes and not in the devtools process or the extension's process. This
+// is tested because this is one of the extension pages with devtools access
+// (https://developer.chrome.com/extensions/devtools). http://crbug.com/570483
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
+ HttpIframeInDevToolsExtensionSideBarPane) {
+ ASSERT_TRUE(embedded_test_server()->Start());
- // Install the extension.
- const Extension* extension = LoadExtensionFromPath(dir->UnpackedPath());
+ GURL web_url = embedded_test_server()->GetURL("a.com", "/title3.html");
+
+ // Install the dynamically-generated extension.
+ const Extension* extension = LoadExtensionForTest(
+ "Devtools Extension", "sidebarpane_devtools_page.html", web_url.spec());
ASSERT_TRUE(extension);
- // Open a devtools window.
OpenDevToolsWindow(kDebuggerTestPage, false);
- // Wait for the panel extension to finish loading -- it'll output 'PASS'
- // when it's installed. waitForTestResultsInConsole waits until that 'PASS'.
+ // Wait for the extension's sidebarpane to finish loading -- it'll output
+ // 'PASS' when it's installed. waitForTestResultsInConsole waits until that
+ // 'PASS'.
RunTestFunction(window_, "waitForTestResultsInConsole");
- // Now that we know the panel is loaded, switch to it. We'll wait until we
- // see a 'DONE' message sent from popup_iframe.html, indicating that it
+ // Now that we know the sidebarpane is loaded, switch to it.
+ content::TestNavigationManager web_manager(main_web_contents(), web_url);
+ SwitchToPanel(window_, "elements");
+ // This is a bit of a hack to switch to the sidebar pane in the elements panel
+ // that the Iframe has been added to.
+ SwitchToPanel(window_, "iframe_pane");
+ web_manager.WaitForNavigationFinished();
+
+ std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
+ EXPECT_EQ(4U, rfhs.size());
+
+ RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
+ RenderFrameHost* devtools_extension_devtools_page_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ RenderFrameHost* devtools_sidebar_pane_extension_rfh =
+ ChildFrameAt(main_devtools_rfh, 1);
+ RenderFrameHost* http_iframe_rfh =
+ ChildFrameAt(devtools_sidebar_pane_extension_rfh, 0);
+
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(extension->GetResourceURL("/sidebarpane_devtools_page.html"),
+ devtools_extension_devtools_page_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension->GetResourceURL("/panel.html"),
+ devtools_sidebar_pane_extension_rfh->GetLastCommittedURL());
+ EXPECT_EQ(web_url, http_iframe_rfh->GetLastCommittedURL());
+
+ content::SiteInstance* devtools_instance =
+ main_devtools_rfh->GetSiteInstance();
+ EXPECT_TRUE(
+ devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_EQ(devtools_instance,
+ devtools_extension_devtools_page_rfh->GetSiteInstance());
+ EXPECT_EQ(devtools_instance,
+ devtools_sidebar_pane_extension_rfh->GetSiteInstance());
+ EXPECT_EQ(web_url.host(),
+ http_iframe_rfh->GetSiteInstance()->GetSiteURL().host());
+ EXPECT_NE(devtools_instance, http_iframe_rfh->GetSiteInstance());
+}
+
+// Tests that http Iframes within the devtools background page, which is
+// different from the extension's background page, are rendered in their own
+// processes and not in the devtools process or the extension's process. This
+// is tested because this is one of the extension pages with devtools access
+// (https://developer.chrome.com/extensions/devtools). http://crbug.com/570483
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
+ HttpIframeInDevToolsExtensionDevtools) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ // Install the dynamically-generated extension.
+ const Extension* extension =
+ LoadExtensionForTest("Devtools Extension", "web_devtools_page.html",
+ "" /* panel_iframe_src */);
+ ASSERT_TRUE(extension);
+
+ // Wait for a 'DONE' message sent from popup_iframe.html, indicating that it
// loaded successfully.
content::DOMMessageQueue message_queue;
- SwitchToExtensionPanel(window_, extension, "iframe_panel");
std::string message;
+ OpenDevToolsWindow(kDebuggerTestPage, false);
+
while (true) {
ASSERT_TRUE(message_queue.WaitForMessage(&message));
if (message == "\"DONE\"")
break;
}
+
+ std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
+ EXPECT_EQ(3U, rfhs.size());
+
+ RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
+ RenderFrameHost* devtools_extension_devtools_page_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ RenderFrameHost* http_iframe_rfh =
+ ChildFrameAt(devtools_extension_devtools_page_rfh, 0);
+
+ GURL web_url = embedded_test_server()->GetURL("a.com", "/popup_iframe.html");
+
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(extension->GetResourceURL("/web_devtools_page.html"),
+ devtools_extension_devtools_page_rfh->GetLastCommittedURL());
+ EXPECT_EQ(web_url, http_iframe_rfh->GetLastCommittedURL());
+
+ content::SiteInstance* devtools_instance =
+ main_devtools_rfh->GetSiteInstance();
+ EXPECT_TRUE(
+ devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_EQ(devtools_instance,
+ devtools_extension_devtools_page_rfh->GetSiteInstance());
+ EXPECT_EQ(web_url.host(),
+ http_iframe_rfh->GetSiteInstance()->GetSiteURL().host());
+ EXPECT_NE(devtools_instance, http_iframe_rfh->GetSiteInstance());
+}
+
+// Tests that iframes to a non-devtools extension embedded in a devtools
+// extension will be isolated from devtools and the devtools extension.
+// http://crbug.com/570483
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
+ NonDevToolsExtensionInDevToolsExtension) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ // Install the dynamically-generated non-devtools extension.
+ const Extension* non_devtools_extension =
+ LoadExtensionForTest("Non-DevTools Extension", "" /* devtools_page */,
+ "" /* panel_iframe_src */);
+ ASSERT_TRUE(non_devtools_extension);
+
+ GURL non_dt_extension_test_url =
+ non_devtools_extension->GetResourceURL("/simple_test_page.html");
+
+ // Install the dynamically-generated devtools extension.
+ const Extension* devtools_extension =
+ LoadExtensionForTest("Devtools Extension", "panel_devtools_page.html",
+ non_dt_extension_test_url.spec());
+ ASSERT_TRUE(devtools_extension);
+
+ OpenDevToolsWindow(kDebuggerTestPage, false);
+
+ // Wait for the extension's panel to finish loading -- it'll output 'PASS'
+ // when it's installed. waitForTestResultsInConsole waits until that 'PASS'.
+ RunTestFunction(window_, "waitForTestResultsInConsole");
+
+ // Now that we know the panel is loaded, switch to it.
+ content::TestNavigationManager non_devtools_manager(
+ main_web_contents(), non_dt_extension_test_url);
+ SwitchToExtensionPanel(window_, devtools_extension, "iframe_panel");
+ non_devtools_manager.WaitForNavigationFinished();
+
+ std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
+ EXPECT_EQ(4U, rfhs.size());
+
+ RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
+ RenderFrameHost* devtools_extension_devtools_page_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ RenderFrameHost* devtools_extension_panel_rfh =
+ ChildFrameAt(main_devtools_rfh, 1);
+ RenderFrameHost* non_devtools_extension_rfh =
+ ChildFrameAt(devtools_extension_panel_rfh, 0);
+
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(devtools_extension->GetResourceURL("/panel_devtools_page.html"),
+ devtools_extension_devtools_page_rfh->GetLastCommittedURL());
+ EXPECT_EQ(devtools_extension->GetResourceURL("/panel.html"),
+ devtools_extension_panel_rfh->GetLastCommittedURL());
+ EXPECT_EQ(non_dt_extension_test_url,
+ non_devtools_extension_rfh->GetLastCommittedURL());
+
+ // simple_test_page.html's frame should be in |non_devtools_extension|'s
+ // process, not in devtools or |devtools_extension|'s process.
+ content::SiteInstance* devtools_instance =
+ main_devtools_rfh->GetSiteInstance();
+ EXPECT_TRUE(
+ devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_EQ(devtools_instance,
+ devtools_extension_devtools_page_rfh->GetSiteInstance());
+ EXPECT_EQ(devtools_instance, devtools_extension_panel_rfh->GetSiteInstance());
+ EXPECT_EQ(non_dt_extension_test_url.GetOrigin(),
+ non_devtools_extension_rfh->GetSiteInstance()->GetSiteURL());
+ EXPECT_NE(devtools_instance, non_devtools_extension_rfh->GetSiteInstance());
+}
+
+// Tests that if a devtools extension's devtools panel page has a subframe to a
+// page for another devtools extension, the subframe is rendered in the devtools
+// process as well. http://crbug.com/570483
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
+ DevToolsExtensionInDevToolsExtension) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ // Install the dynamically-generated extension.
+ const Extension* devtools_b_extension =
+ LoadExtensionForTest("Devtools Extension B", "simple_devtools_page.html",
+ "" /* panel_iframe_src */);
+ ASSERT_TRUE(devtools_b_extension);
+
+ GURL extension_b_page_url =
+ devtools_b_extension->GetResourceURL("/simple_test_page.html");
+
+ // Install another dynamically-generated extension. This extension's
+ // panel.html's iframe will point to an extension b URL.
+ const Extension* devtools_a_extension =
+ LoadExtensionForTest("Devtools Extension A", "panel_devtools_page.html",
+ extension_b_page_url.spec());
+ ASSERT_TRUE(devtools_a_extension);
+
+ OpenDevToolsWindow(kDebuggerTestPage, false);
+
+ // Wait for the extension's panel to finish loading -- it'll output 'PASS'
+ // when it's installed. waitForTestResultsInConsole waits until that 'PASS'.
+ RunTestFunction(window_, "waitForTestResultsInConsole");
+
+ // Now that we know the panel is loaded, switch to it.
+ content::TestNavigationManager extension_b_manager(main_web_contents(),
+ extension_b_page_url);
+ SwitchToExtensionPanel(window_, devtools_a_extension, "iframe_panel");
+ extension_b_manager.WaitForNavigationFinished();
+
+ std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
+ EXPECT_EQ(5U, rfhs.size());
+
+ RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
+
+ RenderFrameHost* devtools_extension_a_devtools_rfh =
+ content::FrameMatchingPredicate(
+ main_web_contents(), base::Bind(&content::FrameHasSourceUrl,
+ devtools_a_extension->GetResourceURL(
+ "/panel_devtools_page.html")));
+ EXPECT_TRUE(devtools_extension_a_devtools_rfh);
+ RenderFrameHost* devtools_extension_b_devtools_rfh =
+ content::FrameMatchingPredicate(
+ main_web_contents(), base::Bind(&content::FrameHasSourceUrl,
+ devtools_b_extension->GetResourceURL(
+ "/simple_devtools_page.html")));
+ EXPECT_TRUE(devtools_extension_b_devtools_rfh);
+
+ RenderFrameHost* devtools_extension_a_panel_rfh =
+ ChildFrameAt(main_devtools_rfh, 2);
+ RenderFrameHost* devtools_extension_b_frame_rfh =
+ ChildFrameAt(devtools_extension_a_panel_rfh, 0);
+
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(devtools_a_extension->GetResourceURL("/panel_devtools_page.html"),
+ devtools_extension_a_devtools_rfh->GetLastCommittedURL());
+ EXPECT_EQ(devtools_b_extension->GetResourceURL("/simple_devtools_page.html"),
+ devtools_extension_b_devtools_rfh->GetLastCommittedURL());
+ EXPECT_EQ(devtools_a_extension->GetResourceURL("/panel.html"),
+ devtools_extension_a_panel_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension_b_page_url,
+ devtools_extension_b_frame_rfh->GetLastCommittedURL());
+
+ // All frames should be in the devtools process.
+ content::SiteInstance* devtools_instance =
+ main_devtools_rfh->GetSiteInstance();
+ EXPECT_TRUE(
+ devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_EQ(devtools_instance,
+ devtools_extension_a_devtools_rfh->GetSiteInstance());
+ EXPECT_EQ(devtools_instance,
+ devtools_extension_b_devtools_rfh->GetSiteInstance());
+ EXPECT_EQ(devtools_instance,
+ devtools_extension_a_panel_rfh->GetSiteInstance());
+ EXPECT_EQ(devtools_instance,
+ devtools_extension_b_frame_rfh->GetSiteInstance());
+}
+
+// Tests that a devtools extension can still have subframes to itself in a
+// "devtools page" and that they will be rendered within the devtools process as
+// well, not in the extension process. http://crbug.com/570483
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, DevToolsExtensionInItself) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ // Install the dynamically-generated extension.
+ const Extension* extension =
+ LoadExtensionForTest("Devtools Extension", "panel_devtools_page.html",
+ "/simple_test_page.html");
+ ASSERT_TRUE(extension);
+
+ OpenDevToolsWindow(kDebuggerTestPage, false);
+
+ // Wait for the extension's panel to finish loading -- it'll output 'PASS'
+ // when it's installed. waitForTestResultsInConsole waits until that 'PASS'.
+ RunTestFunction(window_, "waitForTestResultsInConsole");
+
+ // Now that we know the panel is loaded, switch to it.
+ GURL extension_test_url = extension->GetResourceURL("/simple_test_page.html");
+ content::TestNavigationManager test_page_manager(main_web_contents(),
+ extension_test_url);
+ SwitchToExtensionPanel(window_, extension, "iframe_panel");
+ test_page_manager.WaitForNavigationFinished();
+
+ std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
+ EXPECT_EQ(4U, rfhs.size());
+
+ RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
+ RenderFrameHost* devtools_extension_devtools_page_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ RenderFrameHost* devtools_extension_panel_rfh =
+ ChildFrameAt(main_devtools_rfh, 1);
+ RenderFrameHost* devtools_extension_panel_frame_rfh =
+ ChildFrameAt(devtools_extension_panel_rfh, 0);
+
+ // All frames should be in the devtools process, including
+ // simple_test_page.html
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(extension->GetResourceURL("/panel_devtools_page.html"),
+ devtools_extension_devtools_page_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension->GetResourceURL("/panel.html"),
+ devtools_extension_panel_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension_test_url,
+ devtools_extension_panel_frame_rfh->GetLastCommittedURL());
+
+ content::SiteInstance* devtools_instance =
+ main_devtools_rfh->GetSiteInstance();
+ EXPECT_TRUE(
+ devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_EQ(devtools_instance,
+ devtools_extension_devtools_page_rfh->GetSiteInstance());
+ EXPECT_EQ(devtools_instance, devtools_extension_panel_rfh->GetSiteInstance());
+ EXPECT_EQ(devtools_instance,
+ devtools_extension_panel_frame_rfh->GetSiteInstance());
+}
+
+// Tests that a devtools (not a devtools extension) Iframe can be injected into
+// devtools. http://crbug.com/570483
+IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DevtoolsInDevTools) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ GURL devtools_url = GURL(chrome::kChromeUIDevToolsURL);
+
+ OpenDevToolsWindow(kDebuggerTestPage, false);
+
+ std::string javascript =
+ "var devtoolsFrame = document.createElement('iframe');"
+ "document.body.appendChild(devtoolsFrame);"
+ "devtoolsFrame.src = '" +
+ devtools_url.spec() + "';";
+
+ RenderFrameHost* main_devtools_rfh = main_web_contents()->GetMainFrame();
+
+ content::TestNavigationManager manager(main_web_contents(), devtools_url);
+ ASSERT_TRUE(content::ExecuteScript(main_devtools_rfh, javascript));
+ manager.WaitForNavigationFinished();
+
+ std::vector<RenderFrameHost*> rfhs = main_web_contents()->GetAllFrames();
+ EXPECT_EQ(2U, rfhs.size());
+ RenderFrameHost* devtools_iframe_rfh = ChildFrameAt(main_devtools_rfh, 0);
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(devtools_url, devtools_iframe_rfh->GetLastCommittedURL());
+ content::SiteInstance* devtools_instance =
+ main_devtools_rfh->GetSiteInstance();
+ EXPECT_TRUE(
+ devtools_instance->GetSiteURL().SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_EQ(devtools_instance, devtools_iframe_rfh->GetSiteInstance());
+
+ std::string message;
+ EXPECT_TRUE(ExecuteScriptAndExtractString(
+ devtools_iframe_rfh, "domAutomationController.send(document.origin)",
+ &message));
+ EXPECT_EQ(devtools_url.GetOrigin().spec(), message + "/");
}
// Some web features, when used from an extension, are subject to browser-side
« no previous file with comments | « no previous file | content/browser/frame_host/render_frame_host_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698