Commit 2b7cf6ac authored by rdevlin.cronin's avatar rdevlin.cronin Committed by Commit bot

[Extensions] Fix override urls' visible urls

When we override a URL like chrome://bookmarks by an extension, it maps it to
the chrome-extension:// url, but should still display the chrome://bookmarks
url in the omnibox.  crrev.com/5fafa5aa changed
the way prefs were read, so it broke this.  Fix the breakage, and add a unittest
so that it doesn't happen again.

BUG=579389

Review URL: https://codereview.chromium.org/1635663002

Cr-Commit-Position: refs/heads/master@{#371824}
parent 3ae73738
...@@ -448,21 +448,25 @@ bool ExtensionWebUI::HandleChromeURLOverrideReverse( ...@@ -448,21 +448,25 @@ bool ExtensionWebUI::HandleChromeURLOverrideReverse(
// internal URL // internal URL
// chrome-extension://eemcgdkfndhakfknompkggombfjjjeno/main.html#1 to // chrome-extension://eemcgdkfndhakfknompkggombfjjjeno/main.html#1 to
// chrome://bookmarks/#1 for display in the omnibox. // chrome://bookmarks/#1 for display in the omnibox.
for (base::DictionaryValue::Iterator it(*overrides); !it.IsAtEnd(); for (base::DictionaryValue::Iterator dict_iter(*overrides);
it.Advance()) { !dict_iter.IsAtEnd(); dict_iter.Advance()) {
const base::ListValue* url_list = NULL; const base::ListValue* url_list = nullptr;
if (!it.value().GetAsList(&url_list)) if (!dict_iter.value().GetAsList(&url_list))
continue; continue;
for (base::ListValue::const_iterator it2 = url_list->begin(); for (base::ListValue::const_iterator list_iter = url_list->begin();
it2 != url_list->end(); ++it2) { list_iter != url_list->end(); ++list_iter) {
const base::DictionaryValue* dict = nullptr;
if (!(*list_iter)->GetAsDictionary(&dict))
continue;
std::string override; std::string override;
if (!(*it2)->GetAsString(&override)) if (!dict->GetString(kEntry, &override))
continue; continue;
if (base::StartsWith(url->spec(), override, if (base::StartsWith(url->spec(), override,
base::CompareCase::SENSITIVE)) { base::CompareCase::SENSITIVE)) {
GURL original_url(content::kChromeUIScheme + std::string("://") + GURL original_url(content::kChromeUIScheme + std::string("://") +
it.key() + url->spec().substr(override.length())); dict_iter.key() +
url->spec().substr(override.length()));
*url = original_url; *url = original_url;
return true; return true;
} }
......
...@@ -71,12 +71,13 @@ class ExtensionWebUITest : public testing::Test { ...@@ -71,12 +71,13 @@ class ExtensionWebUITest : public testing::Test {
// Test that component extension url overrides have lower priority than // Test that component extension url overrides have lower priority than
// non-component extension url overrides. // non-component extension url overrides.
TEST_F(ExtensionWebUITest, ExtensionURLOverride) { TEST_F(ExtensionWebUITest, ExtensionURLOverride) {
const char kOverrideResource[] = "1.html";
// Register a non-component extension. // Register a non-component extension.
DictionaryBuilder manifest; DictionaryBuilder manifest;
manifest.Set(manifest_keys::kName, "ext1") manifest.Set(manifest_keys::kName, "ext1")
.Set(manifest_keys::kVersion, "0.1") .Set(manifest_keys::kVersion, "0.1")
.Set(std::string(manifest_keys::kChromeURLOverrides), .Set(std::string(manifest_keys::kChromeURLOverrides),
std::move(DictionaryBuilder().Set("bookmarks", "1.html"))); std::move(DictionaryBuilder().Set("bookmarks", kOverrideResource)));
scoped_refptr<Extension> ext_unpacked( scoped_refptr<Extension> ext_unpacked(
ExtensionBuilder() ExtensionBuilder()
.SetManifest(std::move(manifest)) .SetManifest(std::move(manifest))
...@@ -85,18 +86,33 @@ TEST_F(ExtensionWebUITest, ExtensionURLOverride) { ...@@ -85,18 +86,33 @@ TEST_F(ExtensionWebUITest, ExtensionURLOverride) {
.Build()); .Build());
extension_service_->AddExtension(ext_unpacked.get()); extension_service_->AddExtension(ext_unpacked.get());
GURL expected_unpacked_override_url(std::string(ext_unpacked->url().spec()) + const GURL kExpectedUnpackedOverrideUrl =
"1.html"); ext_unpacked->GetResourceURL(kOverrideResource);
GURL url("chrome://bookmarks"); const GURL kBookmarksUrl("chrome://bookmarks");
EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url, profile_.get())); GURL changed_url = kBookmarksUrl;
EXPECT_EQ(url, expected_unpacked_override_url); EXPECT_TRUE(
ExtensionWebUI::HandleChromeURLOverride(&changed_url, profile_.get()));
EXPECT_EQ(kExpectedUnpackedOverrideUrl, changed_url);
EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverrideReverse(&changed_url,
profile_.get()));
EXPECT_EQ(kBookmarksUrl, changed_url);
GURL url_plus_fragment = kBookmarksUrl.Resolve("#1");
EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url_plus_fragment,
profile_.get()));
EXPECT_EQ(kExpectedUnpackedOverrideUrl.Resolve("#1"),
url_plus_fragment);
EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverrideReverse(&url_plus_fragment,
profile_.get()));
EXPECT_EQ(kBookmarksUrl.Resolve("#1"), url_plus_fragment);
// Register a component extension // Register a component extension
const char kOverrideResource2[] = "2.html";
DictionaryBuilder manifest2; DictionaryBuilder manifest2;
manifest2.Set(manifest_keys::kName, "ext2") manifest2.Set(manifest_keys::kName, "ext2")
.Set(manifest_keys::kVersion, "0.1") .Set(manifest_keys::kVersion, "0.1")
.Set(std::string(manifest_keys::kChromeURLOverrides), .Set(std::string(manifest_keys::kChromeURLOverrides),
std::move(DictionaryBuilder().Set("bookmarks", "2.html"))); std::move(DictionaryBuilder().Set("bookmarks", kOverrideResource2)));
scoped_refptr<Extension> ext_component( scoped_refptr<Extension> ext_component(
ExtensionBuilder() ExtensionBuilder()
.SetManifest(std::move(manifest2)) .SetManifest(std::move(manifest2))
...@@ -107,27 +123,39 @@ TEST_F(ExtensionWebUITest, ExtensionURLOverride) { ...@@ -107,27 +123,39 @@ TEST_F(ExtensionWebUITest, ExtensionURLOverride) {
// Despite being registered more recently, the component extension should // Despite being registered more recently, the component extension should
// not take precedence over the non-component extension. // not take precedence over the non-component extension.
url = GURL("chrome://bookmarks"); changed_url = kBookmarksUrl;
EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url, profile_.get())); EXPECT_TRUE(
EXPECT_EQ(url, expected_unpacked_override_url); ExtensionWebUI::HandleChromeURLOverride(&changed_url, profile_.get()));
EXPECT_EQ(kExpectedUnpackedOverrideUrl, changed_url);
EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverrideReverse(&changed_url,
profile_.get()));
EXPECT_EQ(kBookmarksUrl, changed_url);
GURL expected_component_override_url( GURL kExpectedComponentOverrideUrl =
std::string(ext_component->url().spec()) + "2.html"); ext_component->GetResourceURL(kOverrideResource2);
// Unregister non-component extension. Only component extension remaining. // Unregister non-component extension. Only component extension remaining.
ExtensionWebUI::UnregisterChromeURLOverrides( ExtensionWebUI::UnregisterChromeURLOverrides(
profile_.get(), URLOverrides::GetChromeURLOverrides(ext_unpacked.get())); profile_.get(), URLOverrides::GetChromeURLOverrides(ext_unpacked.get()));
url = GURL("chrome://bookmarks"); changed_url = kBookmarksUrl;
EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url, profile_.get())); EXPECT_TRUE(
EXPECT_EQ(url, expected_component_override_url); ExtensionWebUI::HandleChromeURLOverride(&changed_url, profile_.get()));
EXPECT_EQ(kExpectedComponentOverrideUrl, changed_url);
EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverrideReverse(&changed_url,
profile_.get()));
EXPECT_EQ(kBookmarksUrl, changed_url);
// This time the non-component extension was registered more recently and // This time the non-component extension was registered more recently and
// should still take precedence. // should still take precedence.
ExtensionWebUI::RegisterOrActivateChromeURLOverrides( ExtensionWebUI::RegisterOrActivateChromeURLOverrides(
profile_.get(), URLOverrides::GetChromeURLOverrides(ext_unpacked.get())); profile_.get(), URLOverrides::GetChromeURLOverrides(ext_unpacked.get()));
url = GURL("chrome://bookmarks"); changed_url = kBookmarksUrl;
EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url, profile_.get())); EXPECT_TRUE(
EXPECT_EQ(url, expected_unpacked_override_url); ExtensionWebUI::HandleChromeURLOverride(&changed_url, profile_.get()));
EXPECT_EQ(kExpectedUnpackedOverrideUrl, changed_url);
EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverrideReverse(&changed_url,
profile_.get()));
EXPECT_EQ(kBookmarksUrl, changed_url);
} }
} // namespace extensions } // namespace extensions
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