summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjyasskin@chromium.org <jyasskin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-17 21:55:36 +0000
committerjyasskin@chromium.org <jyasskin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-04-17 21:55:36 +0000
commit3ae0ea1cfccc6c166cfd9531e34f6b0ea8833f82 (patch)
treec0fd33fb1b2add79a7fb7eebea8dc850199cef87
parent80f2011a2e7982572aff821f6085e134f955996d (diff)
downloadchromium_src-3ae0ea1cfccc6c166cfd9531e34f6b0ea8833f82.zip
chromium_src-3ae0ea1cfccc6c166cfd9531e34f6b0ea8833f82.tar.gz
chromium_src-3ae0ea1cfccc6c166cfd9531e34f6b0ea8833f82.tar.bz2
Merge 261496 "Check the scheme of a RenderViewHost before assumi..."
> Check the scheme of a RenderViewHost before assuming it contains an extension. > > Thanks to ncarter for the test! > > BUG=357382 > > Review URL: https://codereview.chromium.org/216113007 TBR=aarya Review URL: https://codereview.chromium.org/241773002 git-svn-id: svn://svn.chromium.org/chrome/branches/1847/src@264652 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/extensions/process_manager_browsertest.cc57
-rw-r--r--extensions/browser/process_manager.cc15
2 files changed, 69 insertions, 3 deletions
diff --git a/chrome/browser/extensions/process_manager_browsertest.cc b/chrome/browser/extensions/process_manager_browsertest.cc
index 68efedf..4140ebd 100644
--- a/chrome/browser/extensions/process_manager_browsertest.cc
+++ b/chrome/browser/extensions/process_manager_browsertest.cc
@@ -7,10 +7,15 @@
#include "chrome/browser/extensions/browser_action_test_util.h"
#include "chrome/browser/extensions/extension_browsertest.h"
#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/test/base/in_process_browser_test.h"
+#include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/notification_service.h"
+#include "content/public/browser/web_contents.h"
#include "content/public/test/test_utils.h"
#include "extensions/browser/extension_system.h"
+#include "net/dns/mock_host_resolver.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
namespace extensions {
@@ -102,4 +107,56 @@ IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest,
EXPECT_EQ(0, pm->GetLazyKeepaliveCount(popup.get()));
}
+// Content loaded from http://hlogonemlfkgpejgnedahbkiabcdhnnn should not
+// interact with an installed extension with that ID. Regression test
+// for bug 357382.
+IN_PROC_BROWSER_TEST_F(ProcessManagerBrowserTest, HttpHostMatchingExtensionId) {
+ ProcessManager* pm = ExtensionSystem::Get(profile())->process_manager();
+
+ // We start with no background hosts.
+ ASSERT_EQ(0u, pm->background_hosts().size());
+ ASSERT_EQ(0u, pm->GetAllViews().size());
+
+ // Load an extension with a background page.
+ scoped_refptr<const Extension> extension =
+ LoadExtension(test_data_dir_.AppendASCII("api_test")
+ .AppendASCII("browser_action")
+ .AppendASCII("none"));
+
+ // Set up a test server running at http://[extension-id]
+ ASSERT_TRUE(extension.get());
+ const std::string aliased_host = extension->id();
+ host_resolver()->AddRule(aliased_host, "127.0.0.1");
+ ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
+ GURL url =
+ embedded_test_server()->GetURL("/extensions/test_file_with_body.html");
+ GURL::Replacements replace_host;
+ replace_host.SetHostStr(aliased_host);
+ url = url.ReplaceComponents(replace_host);
+
+ // Load a page from the test host in a new tab.
+ ui_test_utils::NavigateToURLWithDisposition(
+ browser(),
+ url,
+ NEW_FOREGROUND_TAB,
+ ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
+
+ // Sanity check that there's no bleeding between the extension and the tab.
+ content::WebContents* tab_web_contents =
+ browser()->tab_strip_model()->GetActiveWebContents();
+ EXPECT_EQ(url, tab_web_contents->GetVisibleURL());
+ EXPECT_TRUE(NULL == pm->GetExtensionForRenderViewHost(
+ tab_web_contents->GetRenderViewHost()))
+ << "Non-extension content must not have an associated extension";
+ ASSERT_EQ(1u, pm->GetRenderViewHostsForExtension(extension->id()).size());
+ content::WebContents* extension_web_contents =
+ content::WebContents::FromRenderViewHost(
+ *pm->GetRenderViewHostsForExtension(extension->id()).begin());
+ EXPECT_TRUE(extension_web_contents->GetSiteInstance() !=
+ tab_web_contents->GetSiteInstance());
+ EXPECT_TRUE(pm->GetSiteInstanceForURL(extension->url()) !=
+ tab_web_contents->GetSiteInstance());
+ EXPECT_TRUE(pm->GetBackgroundHostForExtension(extension->id()));
+}
+
} // namespace extensions
diff --git a/extensions/browser/process_manager.cc b/extensions/browser/process_manager.cc
index 96a8b28..a82a734 100644
--- a/extensions/browser/process_manager.cc
+++ b/extensions/browser/process_manager.cc
@@ -32,10 +32,12 @@
#include "content/public/browser/web_contents_observer.h"
#include "content/public/browser/web_contents_user_data.h"
#include "content/public/common/renderer_preferences.h"
+#include "content/public/common/url_constants.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/browser/extensions_browser_client.h"
#include "extensions/browser/view_type_utils.h"
+#include "extensions/common/constants.h"
#include "extensions/common/extension.h"
#include "extensions/common/manifest_handlers/background_info.h"
#include "extensions/common/manifest_handlers/incognito_info.h"
@@ -58,11 +60,18 @@ namespace {
std::string GetExtensionID(RenderViewHost* render_view_host) {
// This works for both apps and extensions because the site has been
- // normalized to the extension URL for apps.
- if (!render_view_host->GetSiteInstance())
+ // normalized to the extension URL for hosted apps.
+ content::SiteInstance* site_instance = render_view_host->GetSiteInstance();
+ if (!site_instance)
+ return std::string();
+
+ const GURL& site_url = site_instance->GetSiteURL();
+
+ if (!site_url.SchemeIs(kExtensionScheme) &&
+ !site_url.SchemeIs(content::kGuestScheme))
return std::string();
- return render_view_host->GetSiteInstance()->GetSiteURL().host();
+ return site_url.host();
}
std::string GetExtensionIDFromFrame(