Commit 2c844154 authored by Charlie Reis's avatar Charlie Reis Committed by Commit Bot

Make ExtensionSet::GetExtensionOrApp{ID}ByURL support filesystem URLs.

Filesystem and blob URLs don't have a chrome-extension:// scheme
according to GURL, but do according to url::Origin.

BUG=851503, 840857

Change-Id: Ia5e4cf5f9c3d04dff07d4f31da6d774d574af653
Reviewed-on: https://chromium-review.googlesource.com/1093402
Commit-Queue: Charlie Reis <creis@chromium.org>
Reviewed-by: default avatarAlex Moshchuk <alexmos@chromium.org>
Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#566677}
parent 03a72bc8
...@@ -10,9 +10,28 @@ ...@@ -10,9 +10,28 @@
#include "extensions/common/constants.h" #include "extensions/common/constants.h"
#include "extensions/common/extension.h" #include "extensions/common/extension.h"
#include "extensions/common/manifest_handlers/sandboxed_page_info.h" #include "extensions/common/manifest_handlers/sandboxed_page_info.h"
#include "url/origin.h"
namespace extensions { namespace extensions {
namespace {
std::string GetExtensionIdByURL(const GURL& url) {
if (url.SchemeIs(kExtensionScheme))
return url.host();
// Trying url::Origin is important to properly handle extension schemes inside
// blob: and filesystem: URLs, which won't match the extension scheme check
// above.
url::Origin origin = url::Origin::Create(url);
if (origin.scheme() == kExtensionScheme)
return origin.host();
return std::string();
}
} // namespace
ExtensionSet::const_iterator::const_iterator() {} ExtensionSet::const_iterator::const_iterator() {}
ExtensionSet::const_iterator::const_iterator(const const_iterator& other) ExtensionSet::const_iterator::const_iterator(const const_iterator& other)
...@@ -67,9 +86,12 @@ void ExtensionSet::Clear() { ...@@ -67,9 +86,12 @@ void ExtensionSet::Clear() {
} }
std::string ExtensionSet::GetExtensionOrAppIDByURL(const GURL& url) const { std::string ExtensionSet::GetExtensionOrAppIDByURL(const GURL& url) const {
if (url.SchemeIs(kExtensionScheme)) std::string extension_id = GetExtensionIdByURL(url);
return url.host(); if (!extension_id.empty())
return extension_id;
// GetHostedAppByURL already supports filesystem: URLs (via MatchesURL).
// TODO(crbug/852162): Add support for blob: URLs in MatchesURL.
const Extension* extension = GetHostedAppByURL(url); const Extension* extension = GetHostedAppByURL(url);
if (!extension) if (!extension)
return std::string(); return std::string();
...@@ -78,9 +100,12 @@ std::string ExtensionSet::GetExtensionOrAppIDByURL(const GURL& url) const { ...@@ -78,9 +100,12 @@ std::string ExtensionSet::GetExtensionOrAppIDByURL(const GURL& url) const {
} }
const Extension* ExtensionSet::GetExtensionOrAppByURL(const GURL& url) const { const Extension* ExtensionSet::GetExtensionOrAppByURL(const GURL& url) const {
if (url.SchemeIs(kExtensionScheme)) std::string extension_id = GetExtensionIdByURL(url);
return GetByID(url.host()); if (!extension_id.empty())
return GetByID(extension_id);
// GetHostedAppByURL already supports filesystem: URLs (via MatchesURL).
// TODO(crbug/852162): Add support for blob: URLs in MatchesURL.
return GetHostedAppByURL(url); return GetHostedAppByURL(url);
} }
......
...@@ -97,6 +97,16 @@ TEST(ExtensionSetTest, ExtensionSet) { ...@@ -97,6 +97,16 @@ TEST(ExtensionSetTest, ExtensionSet) {
ext4.get(), ext4.get(),
extensions.GetExtensionOrAppByURL(ext4->GetResourceURL("test.html"))); extensions.GetExtensionOrAppByURL(ext4->GetResourceURL("test.html")));
// Get extension by a filesystem or blob URL within it.
GURL ext2_filesystem_url =
GURL("filesystem:" + ext2->GetResourceURL("test.html").spec());
EXPECT_EQ(ext2.get(), extensions.GetExtensionOrAppByURL(ext2_filesystem_url));
EXPECT_EQ(ext2->id(),
extensions.GetExtensionOrAppIDByURL(ext2_filesystem_url));
GURL ext3_blob_url = GURL("blob:" + ext3->GetResourceURL("test.html").spec());
EXPECT_EQ(ext3.get(), extensions.GetExtensionOrAppByURL(ext3_blob_url));
EXPECT_EQ(ext3->id(), extensions.GetExtensionOrAppIDByURL(ext3_blob_url));
// Get extension by web extent. // Get extension by web extent.
EXPECT_EQ(ext2.get(), EXPECT_EQ(ext2.get(),
extensions.GetExtensionOrAppByURL( extensions.GetExtensionOrAppByURL(
...@@ -107,6 +117,17 @@ TEST(ExtensionSetTest, ExtensionSet) { ...@@ -107,6 +117,17 @@ TEST(ExtensionSetTest, ExtensionSet) {
EXPECT_FALSE(extensions.GetExtensionOrAppByURL( EXPECT_FALSE(extensions.GetExtensionOrAppByURL(
GURL("http://blog.chromium.org/"))); GURL("http://blog.chromium.org/")));
// Get extension by web extent with filesystem URL. Paths still matter.
EXPECT_EQ(ext3.get(), extensions.GetExtensionOrAppByURL(
GURL("filesystem:http://dev.chromium.org/foo")));
EXPECT_EQ(ext3->id(), extensions.GetExtensionOrAppIDByURL(
GURL("filesystem:http://dev.chromium.org/foo")));
EXPECT_EQ(nullptr, extensions.GetExtensionOrAppByURL(
GURL("filesystem:http://code.google.com/foo")));
// TODO(crbug/852162): Support blob URLs. This should return ext3.
EXPECT_EQ(nullptr, extensions.GetExtensionOrAppByURL(
GURL("blob:http://dev.chromium.org/abcd")));
// Test InSameExtent(). // Test InSameExtent().
EXPECT_TRUE(extensions.InSameExtent( EXPECT_TRUE(extensions.InSameExtent(
GURL("http://code.google.com/p/chromium/monkey/"), GURL("http://code.google.com/p/chromium/monkey/"),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment