[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/5fafa5aa3c2bde50f4f50511f134192147f86b55 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}
diff --git a/chrome/browser/extensions/extension_web_ui_unittest.cc b/chrome/browser/extensions/extension_web_ui_unittest.cc
index b68d613..12cb23a2 100644
--- a/chrome/browser/extensions/extension_web_ui_unittest.cc
+++ b/chrome/browser/extensions/extension_web_ui_unittest.cc
@@ -71,12 +71,13 @@
 // Test that component extension url overrides have lower priority than
 // non-component extension url overrides.
 TEST_F(ExtensionWebUITest, ExtensionURLOverride) {
+  const char kOverrideResource[] = "1.html";
   // Register a non-component extension.
   DictionaryBuilder manifest;
   manifest.Set(manifest_keys::kName, "ext1")
       .Set(manifest_keys::kVersion, "0.1")
       .Set(std::string(manifest_keys::kChromeURLOverrides),
-           std::move(DictionaryBuilder().Set("bookmarks", "1.html")));
+           std::move(DictionaryBuilder().Set("bookmarks", kOverrideResource)));
   scoped_refptr<Extension> ext_unpacked(
       ExtensionBuilder()
           .SetManifest(std::move(manifest))
@@ -85,18 +86,33 @@
           .Build());
   extension_service_->AddExtension(ext_unpacked.get());
 
-  GURL expected_unpacked_override_url(std::string(ext_unpacked->url().spec()) +
-                                      "1.html");
-  GURL url("chrome://bookmarks");
-  EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url, profile_.get()));
-  EXPECT_EQ(url, expected_unpacked_override_url);
+  const GURL kExpectedUnpackedOverrideUrl =
+      ext_unpacked->GetResourceURL(kOverrideResource);
+  const GURL kBookmarksUrl("chrome://bookmarks");
+  GURL changed_url = kBookmarksUrl;
+  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
+  const char kOverrideResource2[] = "2.html";
   DictionaryBuilder manifest2;
   manifest2.Set(manifest_keys::kName, "ext2")
       .Set(manifest_keys::kVersion, "0.1")
       .Set(std::string(manifest_keys::kChromeURLOverrides),
-           std::move(DictionaryBuilder().Set("bookmarks", "2.html")));
+           std::move(DictionaryBuilder().Set("bookmarks", kOverrideResource2)));
   scoped_refptr<Extension> ext_component(
       ExtensionBuilder()
           .SetManifest(std::move(manifest2))
@@ -107,27 +123,39 @@
 
   // Despite being registered more recently, the component extension should
   // not take precedence over the non-component extension.
-  url = GURL("chrome://bookmarks");
-  EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url, profile_.get()));
-  EXPECT_EQ(url, expected_unpacked_override_url);
+  changed_url = kBookmarksUrl;
+  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 expected_component_override_url(
-      std::string(ext_component->url().spec()) + "2.html");
+  GURL kExpectedComponentOverrideUrl =
+      ext_component->GetResourceURL(kOverrideResource2);
 
   // Unregister non-component extension. Only component extension remaining.
   ExtensionWebUI::UnregisterChromeURLOverrides(
       profile_.get(), URLOverrides::GetChromeURLOverrides(ext_unpacked.get()));
-  url = GURL("chrome://bookmarks");
-  EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url, profile_.get()));
-  EXPECT_EQ(url, expected_component_override_url);
+  changed_url = kBookmarksUrl;
+  EXPECT_TRUE(
+      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
   // should still take precedence.
   ExtensionWebUI::RegisterOrActivateChromeURLOverrides(
       profile_.get(), URLOverrides::GetChromeURLOverrides(ext_unpacked.get()));
-  url = GURL("chrome://bookmarks");
-  EXPECT_TRUE(ExtensionWebUI::HandleChromeURLOverride(&url, profile_.get()));
-  EXPECT_EQ(url, expected_unpacked_override_url);
+  changed_url = kBookmarksUrl;
+  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);
 }
 
 }  // namespace extensions