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

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

Issue 2646683002: Implement OOPIFs within Devtools Extensions (Closed)
Patch Set: added |WaitForLoadStop| and fixed a navigation 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..e91541ad006d89c4d3df3237094139b93cd232fc 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"
@@ -501,6 +505,87 @@ 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.empty()) {
+ manifest.Set("devtools_page", devtools_page);
+ }
+
+ dir->WriteManifest(manifest.ToJSON());
+
+ GURL http_popup_url =
+ embedded_test_server()->GetURL("a.com", "/popup_iframe.html");
+
+ dir->WriteFile(FILE_PATH_LITERAL("web_devtools_page.html"),
+ "<html><head></head><body><iframe src='" +
+ http_popup_url.spec() + "'></iframe></body></html>");
+
+ dir->WriteFile(FILE_PATH_LITERAL("simple_devtools_page.html"),
+ "<html><head></head><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('console.log("
+ "\"PASS\")');\n"
+ " }\n"
+ ");\n"
+ "chrome.devtools.panels.elements.createSidebarPane('iframe_pane',\n"
+ "function(sidebar) {\n"
+ "chrome.devtools.inspectedWindow.eval('console.log(\"PASS\")');\n"
+ "sidebar.setPage('panel.html');\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><head></head><body>This is a test</body></html>");
+
+ GURL about_blank_url = GURL(url::kAboutBlankURL);
+ GURL web_url = embedded_test_server()->GetURL("a.com", "/title3.html");
+ GURL data_url = GURL("data:text/html,foo");
+
+ dir->WriteFile(FILE_PATH_LITERAL("renavigation_test_page.html"),
+ "<html><body><iframe src='" + about_blank_url.spec() +
+ "'></iframe><iframe src='" + data_url.spec() +
+ "'></iframe><iframe src='" + web_url.spec() +
+ "'></iframe></body></html>");
+
+ // Install the extension.
+ const Extension* extension = LoadExtensionFromPath(dir->UnpackedPath());
+ return extension;
+ }
+
private:
const Extension* GetExtensionByPath(
const extensions::ExtensionSet& extensions,
@@ -553,6 +638,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 +1019,497 @@ 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 data
+// URLs and about blank URLs are rendered in the devtools process, unless an
+// OOPIF is navigated 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.
+// BUG=crbug.com/570483
ncarter (slow) 2017/03/20 17:22:12 BUG= -> https://
davidsac (gone - try alexmos) 2017/03/20 18:25:57 Done.
+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",
+ "/renavigation_test_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 panel extension 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<content::RenderFrameHost*> rfhs =
+ main_web_contents()->GetAllFrames();
+ EXPECT_EQ(7U, rfhs.size());
+
+ content::RenderFrameHost* main_devtools_rfh =
+ main_web_contents()->GetMainFrame();
+ content::RenderFrameHost* devtools_extension_devtools_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ content::RenderFrameHost* devtools_panel_extension_rfh =
+ ChildFrameAt(main_devtools_rfh, 1);
+ content::RenderFrameHost* test_frame_rfh =
+ ChildFrameAt(devtools_panel_extension_rfh, 0);
+ content::RenderFrameHost* about_blank_frame_rfh =
+ ChildFrameAt(test_frame_rfh, 0);
+ content::RenderFrameHost* data_frame_rfh = ChildFrameAt(test_frame_rfh, 1);
+ content::RenderFrameHost* about_blank_http_iframe_rfh =
+ ChildFrameAt(test_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_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension->GetResourceURL("/panel.html"),
+ devtools_panel_extension_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension->GetResourceURL("/renavigation_test_page.html"),
+ test_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, about_blank_http_iframe_rfh->GetLastCommittedURL());
+
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_extension_devtools_rfh->GetSiteInstance());
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_panel_extension_rfh->GetSiteInstance());
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ test_frame_rfh->GetSiteInstance());
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ about_blank_frame_rfh->GetSiteInstance());
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ data_frame_rfh->GetSiteInstance());
+ EXPECT_EQ(
+ web_url.host(),
+ about_blank_http_iframe_rfh->GetSiteInstance()->GetSiteURL().host());
+
+ // Check that if an OOPIF navigates itself to about:blank, it stays an OOPIF.
+
+ std::string about_blank_javascript =
+ "location.href='" + about_blank_url.spec() + "';";
+
+ content::TestNavigationManager web_about_blank_manager(main_web_contents(),
+ about_blank_url);
+
+ ASSERT_TRUE(content::ExecuteScript(about_blank_http_iframe_rfh,
+ about_blank_javascript));
+
+ web_about_blank_manager.WaitForNavigationFinished();
+
+ EXPECT_EQ(about_blank_url,
+ about_blank_http_iframe_rfh->GetLastCommittedURL());
+ EXPECT_EQ(
+ web_url.host(),
+ about_blank_http_iframe_rfh->GetSiteInstance()->GetSiteURL().host());
+
+ // Check that when a 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(about_blank_http_iframe_rfh,
+ renavigation_javascript));
+
+ renavigation_manager.WaitForNavigationFinished();
+
+ // The old RFH is no longer valid after the renavigation, so we must get the
+ // new one.
+ content::RenderFrameHost* extension_simple_frame_rfh =
+ ChildFrameAt(test_frame_rfh, 2);
+
+ EXPECT_EQ(extension_simple_url,
+ extension_simple_frame_rfh->GetLastCommittedURL());
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ 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). BUG=crbug.com/570483
ncarter (slow) 2017/03/20 17:22:12 "BUG=crbug.com/570383" -> "https://crbug.com/57038
davidsac (gone - try alexmos) 2017/03/20 18:25:57 Done.
+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", "panel_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'.
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 panel 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<content::RenderFrameHost*> rfhs =
+ main_web_contents()->GetAllFrames();
+ EXPECT_EQ(4U, rfhs.size());
+
+ content::RenderFrameHost* main_devtools_rfh =
+ main_web_contents()->GetMainFrame();
+ content::RenderFrameHost* devtools_extension_devtools_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ content::RenderFrameHost* devtools_sidebar_pane_extension_rfh =
+ ChildFrameAt(main_devtools_rfh, 1);
+ content::RenderFrameHost* http_iframe_rfh =
+ ChildFrameAt(devtools_sidebar_pane_extension_rfh, 0);
+
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(extension->GetResourceURL("/panel_devtools_page.html"),
+ devtools_extension_devtools_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension->GetResourceURL("/panel.html"),
+ devtools_sidebar_pane_extension_rfh->GetLastCommittedURL());
+ EXPECT_EQ(web_url, http_iframe_rfh->GetLastCommittedURL());
+
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_extension_devtools_rfh->GetSiteInstance());
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_sidebar_pane_extension_rfh->GetSiteInstance());
+ EXPECT_EQ(web_url.host(),
+ http_iframe_rfh->GetSiteInstance()->GetSiteURL().host());
+}
+
+// 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). BUG=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<content::RenderFrameHost*> rfhs =
+ main_web_contents()->GetAllFrames();
+ EXPECT_EQ(3U, rfhs.size());
+
+ content::RenderFrameHost* main_devtools_rfh =
+ main_web_contents()->GetMainFrame();
+ content::RenderFrameHost* devtools_extension_devtools_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ content::RenderFrameHost* http_iframe_rfh =
+ ChildFrameAt(devtools_extension_devtools_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_rfh->GetLastCommittedURL());
+ EXPECT_EQ(web_url, http_iframe_rfh->GetLastCommittedURL());
+
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_extension_devtools_rfh->GetSiteInstance());
+ EXPECT_EQ(web_url.host(),
+ http_iframe_rfh->GetSiteInstance()->GetSiteURL().host());
+}
+
+// Tests that iframes to a non-devtools extension embedded in a devtools
+// extension will be isolated from devtools and the devtools extension.
+// BUG=crbug.com/570483
ncarter (slow) 2017/03/20 17:22:12 BUG= -> https:// as above
davidsac (gone - try alexmos) 2017/03/20 18:25:57 Done.
+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 panel extension 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<content::RenderFrameHost*> rfhs =
+ main_web_contents()->GetAllFrames();
+ EXPECT_EQ(4U, rfhs.size());
+
+ content::RenderFrameHost* main_devtools_rfh =
+ main_web_contents()->GetMainFrame();
+ content::RenderFrameHost* devtools_extension_devtools_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ content::RenderFrameHost* devtools_extension_panel_rfh =
+ ChildFrameAt(main_devtools_rfh, 1);
+ content::RenderFrameHost* non_devtools_extension_test_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_rfh->GetLastCommittedURL());
+ EXPECT_EQ(devtools_extension->GetResourceURL("/panel.html"),
+ devtools_extension_panel_rfh->GetLastCommittedURL());
+ EXPECT_EQ(non_dt_extension_test_url,
+ non_devtools_extension_test_rfh->GetLastCommittedURL());
+
+ // popup_test_page.html's frame should be in extension b's
+ // process, not in devtools or extension a's process.
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_extension_devtools_rfh->GetSiteInstance());
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_extension_panel_rfh->GetSiteInstance());
+ EXPECT_EQ(non_dt_extension_test_url.GetOrigin(),
+ non_devtools_extension_test_rfh->GetSiteInstance()->GetSiteURL());
+}
+
+// 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. BUG=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_test_url =
+ devtools_b_extension->GetResourceURL("/simple_test_page.html");
+
+ // Install the dynamically-generated extension.
+ const Extension* devtools_a_extension =
+ LoadExtensionForTest("Devtools Extension A", "panel_devtools_page.html",
+ extension_b_test_url.spec());
+ ASSERT_TRUE(devtools_a_extension);
+
+ OpenDevToolsWindow(kDebuggerTestPage, false);
+
+ // Wait for the panel extension 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_test_url);
+ SwitchToExtensionPanel(window_, devtools_a_extension, "iframe_panel");
+ extension_b_manager.WaitForNavigationFinished();
+
+ std::vector<content::RenderFrameHost*> rfhs =
+ main_web_contents()->GetAllFrames();
+ EXPECT_EQ(5U, rfhs.size());
+
+ content::RenderFrameHost* main_devtools_rfh =
+ main_web_contents()->GetMainFrame();
+
+ content::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);
+ content::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);
+
+ content::RenderFrameHost* devtools_extension_a_panel_rfh =
+ ChildFrameAt(main_devtools_rfh, 2);
+ content::RenderFrameHost* devtools_extension_b_test_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_test_url,
+ devtools_extension_b_test_rfh->GetLastCommittedURL());
+
+ // all frames should be in the devtools process.
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_extension_a_devtools_rfh->GetSiteInstance());
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_extension_b_devtools_rfh->GetSiteInstance());
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_extension_a_panel_rfh->GetSiteInstance());
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_extension_b_test_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. BUG=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 panel extension 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<content::RenderFrameHost*> rfhs =
+ main_web_contents()->GetAllFrames();
+ EXPECT_EQ(4U, rfhs.size());
+
+ content::RenderFrameHost* main_devtools_rfh =
+ main_web_contents()->GetMainFrame();
+ content::RenderFrameHost* devtools_extension_devtools_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ content::RenderFrameHost* devtools_extension_panel_rfh =
+ ChildFrameAt(main_devtools_rfh, 1);
+ content::RenderFrameHost* devtools_extension_test_rfh =
+ ChildFrameAt(devtools_extension_panel_rfh, 0);
+
+ // all frames should be in the devtools process, including test.html's frame
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(extension->GetResourceURL("/panel_devtools_page.html"),
+ devtools_extension_devtools_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension->GetResourceURL("/panel.html"),
+ devtools_extension_panel_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension_test_url,
+ devtools_extension_test_rfh->GetLastCommittedURL());
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_extension_devtools_rfh->GetSiteInstance());
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_extension_panel_rfh->GetSiteInstance());
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_extension_test_rfh->GetSiteInstance());
+}
+
+// Tests that a devtools (not a devtools extension) Iframe can be injected into
+// devtools. BUG=crbug.com/570483
+IN_PROC_BROWSER_TEST_F(DevToolsSanityTest, DevtoolsInDevTools) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ GURL devtools_url = GURL("chrome-devtools://devtools/bundled/inspector.html");
+
+ OpenDevToolsWindow(kDebuggerTestPage, false);
+
+ std::string javascript =
+ "var devtoolsFrame = document.createElement('iframe');"
+ "document.body.appendChild(devtoolsFrame);"
+ "devtoolsFrame.setAttribute('src', '" +
+ devtools_url.spec() + "');";
+
+ content::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<content::RenderFrameHost*> rfhs =
+ main_web_contents()->GetAllFrames();
+ EXPECT_EQ(2U, rfhs.size());
+ content::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());
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(main_devtools_rfh->GetSiteInstance(),
+ devtools_iframe_rfh->GetSiteInstance());
+
+ std::string message;
+
+ EXPECT_TRUE(ExecuteScriptAndExtractString(
+ devtools_iframe_rfh, "domAutomationController.send(document.origin)",
+ &message));
+ EXPECT_EQ("chrome-devtools://devtools", 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