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

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

Issue 2646683002: Implement OOPIFs within Devtools Extensions (Closed)
Patch Set: finish rough draft of tests without popup.html Created 3 years, 10 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 d5ceb17592e2ea7ad964ecaa7797feac8ef5a32b..b573c2e4e454d0aef23d49b0acff31da0ba70248 100644
--- a/chrome/browser/devtools/devtools_sanity_browsertest.cc
+++ b/chrome/browser/devtools/devtools_sanity_browsertest.cc
@@ -38,6 +38,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"
@@ -51,6 +52,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"
@@ -60,6 +62,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"
@@ -512,6 +515,59 @@ class DevToolsExtensionTest : public DevToolsSanityTest,
return GetExtensionByPath(registry->enabled_extensions(), path);
}
+ const Extension* LoadExtensionForTest(std::string name,
alexmos 2017/02/15 01:23:41 nit: const std::string& name
davidsac (gone - try alexmos) 2017/02/16 20:29:02 Done.
+ extensions::TestExtensionDir* dir,
+ bool has_test_page,
+ bool devtools,
alexmos 2017/02/15 01:23:41 nit: is_devtools, or is_devtools_extension
davidsac (gone - try alexmos) 2017/02/16 20:29:01 Done.
+ bool devtools_script) {
alexmos 2017/02/15 01:23:41 similarly, I think this actually means should_crea
davidsac (gone - try alexmos) 2017/02/16 20:29:02 Done. Kinda. Renamed to |should_create_panel_and_
+ extensions::DictionaryBuilder manifest;
+ manifest.Set("name", name).Set("version", "1").Set("manifest_version", 2);
+ if (devtools) {
+ manifest.Set("devtools_page", "devtools.html");
+ }
+ if (has_test_page) {
alexmos 2017/02/15 01:23:41 Do you need to pass this in? What if you just alw
davidsac (gone - try alexmos) 2017/02/16 20:29:02 Done. I hesitated to do this initially, because I
+ manifest.Set("web_accessible_resources",
+ extensions::ListBuilder().Append("test.html").Build());
+ }
+ dir->WriteManifest(manifest.ToJSON());
+
+ if (devtools) {
+ if (devtools_script) {
+ dir->WriteFile(
+ FILE_PATH_LITERAL("devtools.html"),
+ "<html><head><script "
+ "src='devtools.js'></script></head><body><iframe></iframe></"
+ "body></html>");
+
+ 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");
+
+ dir->WriteFile(FILE_PATH_LITERAL("panel.html"),
+ "<html><body>does nothing</body></html>");
+ } else {
+ dir->WriteFile(FILE_PATH_LITERAL("devtools.html"),
+ "<html><head></head><body></body></html>");
+ }
+ }
+
+ if (has_test_page) {
+ dir->WriteFile(FILE_PATH_LITERAL("test.html"),
+ "<html><head></head><body>This is a test</body></html>");
+ }
+
+ // Install the extension.
+ const Extension* extension = LoadExtensionFromPath(dir->UnpackedPath());
+ return extension;
+ }
+
private:
const Extension* GetExtensionByPath(
const extensions::ExtensionSet& extensions,
@@ -902,17 +958,22 @@ 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 three "devtools pages" (the visible
+// devtools panel for the devtools extension, the sidebar pane page for the
+// devtools extension that is visible in the elemanets panel, and the devtools
+// background page, which is different from the extension's background
+// page)(https://developer.chrome.com/extensions/devtools) are rendered in their
+// own processes and not in the devtools process or the extension's process.
+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
+ // Our extension must load a 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());
- extensions::DictionaryBuilder manifest;
dir->WriteManifest(extensions::DictionaryBuilder()
alexmos 2017/02/15 01:23:41 Can this test (and the next two) also use your new
davidsac (gone - try alexmos) 2017/02/16 20:29:02 The first two use this now, but not the third. Le
.Set("name", "Devtools Panel w/ HTTP Iframe")
.Set("version", "1")
@@ -920,9 +981,12 @@ IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, DevToolsExtensionWithHttpIframe) {
.Set("devtools_page", "devtools.html")
.ToJSON());
- dir->WriteFile(
- FILE_PATH_LITERAL("devtools.html"),
- "<html><head><script src='devtools.js'></script></head></html>");
+ GURL http_iframe_url =
+ embedded_test_server()->GetURL("a.com", "/popup_iframe.html");
alexmos 2017/02/15 01:23:41 This can just stay at its old location in the file
davidsac (gone - try alexmos) 2017/02/16 20:29:02 The code has changed quite a bit, so I'm not sure
+
+ dir->WriteFile(FILE_PATH_LITERAL("devtools.html"),
+ "<html><head><script "
+ "src='devtools.js'></script></head><body></body></html>");
dir->WriteFile(
FILE_PATH_LITERAL("devtools.js"),
@@ -934,11 +998,9 @@ IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, DevToolsExtensionWithHttpIframe) {
" }\n"
");\n");
- 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>");
+ "<html><body><iframe src='" + http_iframe_url.spec() +
+ "'></iframe></body></html>");
// Install the extension.
const Extension* extension = LoadExtensionFromPath(dir->UnpackedPath());
@@ -957,11 +1019,674 @@ IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, DevToolsExtensionWithHttpIframe) {
content::DOMMessageQueue message_queue;
SwitchToExtensionPanel(window_, extension, "iframe_panel");
std::string message;
+
while (true) {
ASSERT_TRUE(message_queue.WaitForMessage(&message));
if (message == "\"DONE\"")
break;
}
+
+ 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_devtools_extension_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ content::RenderFrameHost* devtools_panel_extension_rfh =
+ ChildFrameAt(main_devtools_rfh, 1);
+ content::RenderFrameHost* http_iframe_rfh =
+ ChildFrameAt(devtools_panel_extension_rfh, 0);
+
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(extension->GetResourceURL("/devtools.html"),
+ devtools_devtools_extension_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension->GetResourceURL("/panel.html"),
+ devtools_panel_extension_rfh->GetLastCommittedURL());
+ EXPECT_EQ(http_iframe_url, http_iframe_rfh->GetLastCommittedURL());
+
+ if (content::AreAllSitesIsolatedForTesting() ||
+ extensions::IsIsolateExtensionsEnabled()) {
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(devtools_devtools_extension_rfh->GetSiteInstance()
alexmos 2017/02/15 01:23:41 Instead of this, let's just expect that devtools_d
davidsac (gone - try alexmos) 2017/02/16 20:29:02 Hmm I feel like it might still be helpful to check
+ ->GetSiteURL()
+ .SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_TRUE(
+ devtools_panel_extension_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(http_iframe_url.host(),
+ http_iframe_rfh->GetSiteInstance()->GetSiteURL().host());
alexmos 2017/02/15 01:23:41 Similarly, for this kind of check, let's ensure th
davidsac (gone - try alexmos) 2017/03/09 20:21:22 Are you sure? I can change it, but I felt like it
+
+ } else {
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(devtools_devtools_extension_rfh->GetSiteInstance()
+ ->GetSiteURL()
+ .SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_TRUE(
+ devtools_panel_extension_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(http_iframe_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ }
+}
+
+// Tests that http Iframes within the three "devtools pages" (the visible
+// devtools panel for the devtools extension, the sidebar pane page for the
+// devtools extension that is visible in the elemanets panel, and the devtools
+// background page, which is different from the extension's background
+// page)(https://developer.chrome.com/extensions/devtools) are rendered in their
+// own processes and not in the devtools process or the extension's process.
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
+ HttpIframeInDevToolsExtensionSideBarPane) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ // Our extension must load a 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());
+
+ dir->WriteManifest(extensions::DictionaryBuilder()
+ .Set("name", "Devtools Panel w/ HTTP Iframe")
+ .Set("version", "1")
+ .Set("manifest_version", 2)
+ .Set("devtools_page", "devtools.html")
+ .ToJSON());
+
+ GURL http_iframe_url =
+ embedded_test_server()->GetURL("a.com", "/popup_iframe.html");
+
+ dir->WriteFile(FILE_PATH_LITERAL("devtools.html"),
+ "<html><head><script "
+ "src='devtools.js'></script></head><body></body></html>");
+
+ dir->WriteFile(
+ FILE_PATH_LITERAL("devtools.js"),
+ "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='" + http_iframe_url.spec() +
+ "'></iframe></body></html>");
+
+ // Install the extension.
+ const Extension* extension = LoadExtensionFromPath(dir->UnpackedPath());
+ 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");
+
+ content::DOMMessageQueue message_queue;
+ 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");
+
+ std::string message;
+
+ while (true) {
+ ASSERT_TRUE(message_queue.WaitForMessage(&message));
+ if (message == "\"DONE\"")
+ break;
+ }
+
+ 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_devtools_extension_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("/devtools.html"),
+ devtools_devtools_extension_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension->GetResourceURL("/panel.html"),
+ devtools_sidebar_pane_extension_rfh->GetLastCommittedURL());
+ EXPECT_EQ(http_iframe_url, http_iframe_rfh->GetLastCommittedURL());
+
+ if (content::AreAllSitesIsolatedForTesting() ||
+ extensions::IsIsolateExtensionsEnabled()) {
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(devtools_devtools_extension_rfh->GetSiteInstance()
+ ->GetSiteURL()
+ .SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_TRUE(devtools_sidebar_pane_extension_rfh->GetSiteInstance()
+ ->GetSiteURL()
+ .SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_EQ(http_iframe_url.host(),
+ http_iframe_rfh->GetSiteInstance()->GetSiteURL().host());
+
+ } else {
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(devtools_devtools_extension_rfh->GetSiteInstance()
+ ->GetSiteURL()
+ .SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_TRUE(devtools_sidebar_pane_extension_rfh->GetSiteInstance()
+ ->GetSiteURL()
+ .SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_TRUE(http_iframe_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ }
+}
+
+// Tests that http Iframes within the three "devtools pages" (the visible
+// devtools panel for the devtools extension, the sidebar pane page for the
+// devtools extension that is visible in the elemanets panel, and the devtools
+// background page, which is different from the extension's background
+// page)(https://developer.chrome.com/extensions/devtools) are rendered in their
+// own processes and not in the devtools process or the extension's process.
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
+ HttpIframeInDevToolsExtensionDevtools) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ // Our extension must load a 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());
+
+ GURL http_iframe_url =
+ embedded_test_server()->GetURL("a.com", "/popup_iframe.html");
+
+ dir->WriteManifest(extensions::DictionaryBuilder()
+ .Set("name", "Devtools Panel w/ HTTP Iframe")
+ .Set("version", "1")
+ .Set("manifest_version", 2)
+ .Set("devtools_page", "devtools.html")
+ .ToJSON());
+
+ dir->WriteFile(FILE_PATH_LITERAL("devtools.html"),
+ "<html><head></head><body><iframe src='" +
+ http_iframe_url.spec() + "'></iframe></body></html>");
+
+ // Install the extension.
+ const Extension* extension = LoadExtensionFromPath(dir->UnpackedPath());
+ ASSERT_TRUE(extension);
+
+ // Open a devtools window.
+ OpenDevToolsWindow(kDebuggerTestPage, false);
+
+ // 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
+ // loaded successfully.
+ content::DOMMessageQueue message_queue;
+ std::string message;
+
+ 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_devtools_extension_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ content::RenderFrameHost* http_iframe_rfh =
+ ChildFrameAt(devtools_devtools_extension_rfh, 0);
+
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(extension->GetResourceURL("/devtools.html"),
+ devtools_devtools_extension_rfh->GetLastCommittedURL());
+ EXPECT_EQ(http_iframe_url, http_iframe_rfh->GetLastCommittedURL());
+
+ if (content::AreAllSitesIsolatedForTesting() ||
+ extensions::IsIsolateExtensionsEnabled()) {
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(devtools_devtools_extension_rfh->GetSiteInstance()
+ ->GetSiteURL()
+ .SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_EQ(http_iframe_url.host(),
+ http_iframe_rfh->GetSiteInstance()->GetSiteURL().host());
+
+ } else {
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(devtools_devtools_extension_rfh->GetSiteInstance()
+ ->GetSiteURL()
+ .SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_TRUE(http_iframe_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ }
+}
+
+// tests that an iframe to a non-devtools extension embedded in a devtools
+// extension will be isolated from devtools and the devtools extension.
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
+ NonDevToolsExtensionInDevToolsExtension) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ std::unique_ptr<extensions::TestExtensionDir> dir(
+ new extensions::TestExtensionDir());
+
+ // Install the extensions.
+ const Extension* devtools_extension =
+ LoadExtensionForTest("Devtools Extension", dir.get(), false, true, true);
alexmos 2017/02/15 01:23:41 To make the bools more readable (someone reading t
davidsac (gone - try alexmos) 2017/02/16 20:29:02 Done. Tell me if that looks good to you, though.
+ ASSERT_TRUE(devtools_extension);
+
+ std::unique_ptr<extensions::TestExtensionDir> dir2(
+ new extensions::TestExtensionDir());
+
+ const Extension* non_devtools_extension = LoadExtensionForTest(
+ "Non-DevTools Extension", dir2.get(), true, false, false);
+ ASSERT_TRUE(non_devtools_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");
+
+ GURL extension_file_url =
+ non_devtools_extension->GetResourceURL("/test.html");
+
+ 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_devtools_extension_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ content::RenderFrameHost* non_devtools_extension_rfh =
+ ChildFrameAt(devtools_devtools_extension_rfh, 0);
+
+ base::string16 javascript =
+ base::UTF8ToUTF16("location.href='" + extension_file_url.spec() + "';");
+
+ content::TestNavigationManager manager(main_web_contents(),
+ extension_file_url);
+
+ non_devtools_extension_rfh->ExecuteJavaScript(javascript);
alexmos 2017/02/15 01:23:41 Still wondering if there are any reasons to use Ex
davidsac (gone - try alexmos) 2017/02/16 20:29:02 Done. Sounds great. It was on my todo list, it w
+
+ manager.WaitForNavigationFinished();
+
+ rfhs = main_web_contents()->GetAllFrames();
+ EXPECT_EQ(3U, rfhs.size());
+
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(devtools_extension->GetResourceURL("/devtools.html"),
+ devtools_devtools_extension_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension_file_url,
+ non_devtools_extension_rfh->GetLastCommittedURL());
+
+ if (content::AreAllSitesIsolatedForTesting() ||
+ extensions::IsIsolateExtensionsEnabled()) {
+ // test.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_TRUE(devtools_devtools_extension_rfh->GetSiteInstance()
+ ->GetSiteURL()
+ .SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_EQ(extension_file_url.GetOrigin(),
+ non_devtools_extension_rfh->GetSiteInstance()->GetSiteURL());
+ } else {
+ // test.html's frame should be in the devtools process.
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(devtools_devtools_extension_rfh->GetSiteInstance()
+ ->GetSiteURL()
+ .SchemeIs(content::kChromeDevToolsScheme));
+ EXPECT_TRUE(
+ non_devtools_extension_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ }
+}
+
+// Tests that if a devtools extension's devtools page has a subframe to a
+// page for another devtools extension, the subframe is rendered in the devtools
+// process as well.
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
+ DevToolsExtensionInDevToolsExtension) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ std::unique_ptr<extensions::TestExtensionDir> dir(
+ new extensions::TestExtensionDir());
+
+ // Install the extension.
+ const Extension* devtools_a_extension = LoadExtensionForTest(
+ "Devtools Extension A", dir.get(), false, true, true);
+ ASSERT_TRUE(devtools_a_extension);
+
+ std::unique_ptr<extensions::TestExtensionDir> dir2(
+ new extensions::TestExtensionDir());
+
+ const Extension* devtools_b_extension = LoadExtensionForTest(
+ "Devtools Extension B", dir2.get(), true, true, false);
+ ASSERT_TRUE(devtools_b_extension);
+
+ // Open a devtools window.
+ OpenDevToolsWindow(kDebuggerTestPage, false);
+
+ // Wait for the panel extension to finish loading -- it'll output 'PASS'
+ // when it is. waitForTestResultsInConsole waits until that 'PASS'.
+ RunTestFunction(window_, "waitForTestResultsInConsole");
+
+ GURL extension_file_url = devtools_b_extension->GetResourceURL("/test.html");
alexmos 2017/02/15 01:23:41 I'd name this extension_b_url, to make its uses mo
davidsac (gone - try alexmos) 2017/02/16 20:29:02 Done.
+
+ 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_a_devtools_rfh =
alexmos 2017/02/15 01:23:41 no need for second "devtools" in the names here
davidsac (gone - try alexmos) 2017/02/16 20:29:02 We might want some other name differentiation then
+ ChildFrameAt(main_devtools_rfh, 0);
+ content::RenderFrameHost* devtools_extension_b_devtools_rfh =
+ ChildFrameAt(devtools_extension_a_devtools_rfh, 0);
+
+ base::string16 javascript =
+ base::UTF8ToUTF16("location.href='" + extension_file_url.spec() + "';");
+
+ content::TestNavigationManager manager(main_web_contents(),
+ extension_file_url);
+
+ devtools_extension_b_devtools_rfh->ExecuteJavaScript(javascript);
+
+ manager.WaitForNavigationFinished();
+
+ rfhs = main_web_contents()->GetAllFrames();
+ EXPECT_EQ(3U, rfhs.size());
+
+ // TODO the expected result is the exact same as a non-devtools extension in
+ // devtools
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(devtools_a_extension->GetResourceURL("/devtools.html"),
+ devtools_extension_a_devtools_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension_file_url,
+ devtools_extension_b_devtools_rfh->GetLastCommittedURL());
alexmos 2017/02/15 01:23:42 So, technically, at this point, if we ever regress
davidsac (gone - try alexmos) 2017/02/16 20:29:02 Done. As part of my refactor, I got rid of the cal
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(devtools_extension_a_devtools_rfh->GetSiteInstance()
+ ->GetSiteURL()
+ .SchemeIs(content::kChromeDevToolsScheme));
+ // test.html's frame should be in the devtools process.
+ EXPECT_TRUE(devtools_extension_b_devtools_rfh->GetSiteInstance()
+ ->GetSiteURL()
+ .SchemeIs(content::kChromeDevToolsScheme));
+}
+
+// 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.
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest, DevToolsExtensionInItself) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+#if 0
+ std::unique_ptr<extensions::TestExtensionDir> dir(
+ new extensions::TestExtensionDir());
+ // Install the extension.
+ const Extension* extension =
+ LoadExtensionForTest("Devtools Extension", dir.get(), true, true, true);
+ ASSERT_TRUE(extension);
+
+
+
+ GURL extension_file_url = extension->GetResourceURL("/test.html");
+
+ // 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");
+
+ //SwitchToExtensionPanel(window_, extension, "iframe_panel");
+
+ base::string16 javascript =
+ base::UTF8ToUTF16("location.href='" + extension_file_url.spec() + "';");
+
+ content::TestNavigationManager manager(main_web_contents(),
+ extension_file_url);
+
+ content::RenderFrameHost* rfh = main_web_contents()->GetAllFrames()[2];
+ rfh->ExecuteJavaScript(javascript);
+
+ manager.WaitForNavigationFinished();
+
+#else
+ std::unique_ptr<extensions::TestExtensionDir> dir(
+ new extensions::TestExtensionDir());
+
+ extensions::DictionaryBuilder manifest;
+ manifest.Set("name", "Devtools Extension")
+ .Set("version", "1")
+ .Set("manifest_version", 2);
+ manifest.Set("devtools_page", "devtools.html");
+
+ manifest.Set("web_accessible_resources",
+ extensions::ListBuilder().Append("test.html").Build());
+
+ dir->WriteManifest(manifest.ToJSON());
+
+ dir->WriteFile(FILE_PATH_LITERAL("devtools.html"),
+ "<html><head><script "
+ "src='devtools.js'></script></head><body></body></html>");
+
+ 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");
+
+ dir->WriteFile(FILE_PATH_LITERAL("panel.html"),
+ "<html><body><iframe src='test.html'></iframe></body></html>");
+
+ dir->WriteFile(FILE_PATH_LITERAL("test.html"),
+ "<html><head><script src='test.js'></script></head><body>This "
+ "is a test</body></html>");
+
+ dir->WriteFile(FILE_PATH_LITERAL("test.js"),
+ "window.onload = function() {\n"
+ " domAutomationController.setAutomationId(0);\n"
+ " domAutomationController.send('DONE');\n"
+ "}\n");
+
+ // Install the extension.
+ const Extension* extension = LoadExtensionFromPath(dir->UnpackedPath());
+ 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
+ // loaded successfully.
+ content::DOMMessageQueue message_queue;
+ SwitchToExtensionPanel(window_, extension, "iframe_panel");
+ std::string message1;
+
+ while (true) {
+ ASSERT_TRUE(message_queue.WaitForMessage(&message1));
+ if (message1 == "\"DONE\"")
+ break;
+ }
+
+ GURL extension_file_url = extension->GetResourceURL("/test.html");
+
+#endif
+
+ 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* devtools_extension_test_rfh =
+ ChildFrameAt(devtools_extension_devtools_rfh, 0);
+
+ // all frames should be in the devtools process.
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(extension->GetResourceURL("/devtools.html"),
+ devtools_extension_devtools_rfh->GetLastCommittedURL());
+ EXPECT_EQ(extension_file_url,
+ devtools_extension_test_rfh->GetLastCommittedURL());
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(
+ devtools_extension_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ // test.html's frame should be in the devtools process.
+ EXPECT_TRUE(
+ devtools_extension_test_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+}
+
+// Tests that an Iframe to a non-devtools extension cannot be injected into
+// devtools when not contained in a devtools extension.
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
+ NonDevToolsExtensionInDevToolsOutsideDevToolsExtension) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ std::unique_ptr<extensions::TestExtensionDir> dir(
+ new extensions::TestExtensionDir());
+
+ // Install the extension.
+ const Extension* extension = LoadExtensionForTest(
+ "Non-DevTools Extension", dir.get(), true, false, false);
+ ASSERT_TRUE(extension);
+
+ // Open a devtools window.
+ OpenDevToolsWindow(kDebuggerTestPage, false);
+
+ GURL extension_file_url = extension->GetResourceURL("/test.html");
+
+ content::RenderFrameHost* main_devtools_rfh =
+ main_web_contents()->GetMainFrame();
+
+ base::string16 javascript = base::UTF8ToUTF16(
+ "var extensionFrame = document.createElement('iframe');"
+ "document.body.appendChild(extensionFrame);"
+ "extensionFrame.setAttribute('src', '" +
+ extension_file_url.spec() + "');");
+
+ content::TestNavigationManager manager(main_web_contents(),
+ extension_file_url);
+
+ main_devtools_rfh->ExecuteJavaScript(javascript);
+
+ if (content::AreAllSitesIsolatedForTesting() ||
+ extensions::IsIsolateExtensionsEnabled()) {
+ EXPECT_FALSE(manager.WaitForRequestStart());
+
+ std::vector<content::RenderFrameHost*> rfhs =
+ main_web_contents()->GetAllFrames();
+
+ EXPECT_EQ(1U, rfhs.size());
+
+ // TODO(davidsac): check to make sure that the rfh is about:blank or
+ // something
+ } else {
+ manager.WaitForNavigationFinished();
+ std::vector<content::RenderFrameHost*> rfhs =
+ main_web_contents()->GetAllFrames();
+
+ EXPECT_EQ(2U, rfhs.size());
+
+ content::RenderFrameHost* extension_test_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(extension_test_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(extension_file_url, extension_test_rfh->GetLastCommittedURL());
+ }
+}
+
+// Tests that a web Iframe cannot be injected into devtools when not contained
+// in a devtools extension.
+IN_PROC_BROWSER_TEST_F(DevToolsExtensionTest,
+ HttpIframeInDevToolsOutsideDevToolsExtension) {
+ ASSERT_TRUE(embedded_test_server()->Start());
+
+ GURL simple_page_url =
+ embedded_test_server()->GetURL("a.com", "/title1.html");
+
+ // Open a devtools window.
+ OpenDevToolsWindow(kDebuggerTestPage, false);
+
+ base::string16 javascript = base::UTF8ToUTF16(
+ "var httpFrame = document.createElement('iframe');"
+ "document.body.appendChild(httpFrame);"
+ "httpFrame.setAttribute('src', '" +
+ simple_page_url.spec() + "');");
+
+ content::RenderFrameHost* main_devtools_rfh =
+ main_web_contents()->GetMainFrame();
+
+ content::TestNavigationManager manager(main_web_contents(), simple_page_url);
+
+ main_devtools_rfh->ExecuteJavaScript(javascript);
+
+ if (content::AreAllSitesIsolatedForTesting() ||
+ extensions::IsIsolateExtensionsEnabled()) {
+ EXPECT_FALSE(manager.WaitForRequestStart());
+
+ std::vector<content::RenderFrameHost*> rfhs =
+ main_web_contents()->GetAllFrames();
+
+ EXPECT_EQ(1U, rfhs.size());
+ // TODO(davidsac): check to make sure that the rfh is about:blank or
+ // something
+ } else {
+ manager.WaitForNavigationFinished();
+ std::vector<content::RenderFrameHost*> rfhs =
+ main_web_contents()->GetAllFrames();
+ EXPECT_EQ(2U, rfhs.size());
+ content::RenderFrameHost* http_iframe_rfh =
+ ChildFrameAt(main_devtools_rfh, 0);
+ EXPECT_TRUE(main_devtools_rfh->GetLastCommittedURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(main_devtools_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_TRUE(http_iframe_rfh->GetSiteInstance()->GetSiteURL().SchemeIs(
+ content::kChromeDevToolsScheme));
+ EXPECT_EQ(simple_page_url, http_iframe_rfh->GetLastCommittedURL());
+ }
}
// 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