Do not allow non web accessible resources to be linked.

BUG=141462
TEST=ExtensionResourceRequestPolicyTest.LinkToWebAccessibleResources

Review URL: https://chromiumcodereview.appspot.com/22935006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@222464 0039d316-1c4b-4281-b951-d872f2087c98
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index 60c6942..bcc1967 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -100,6 +100,7 @@
 #include "chrome/common/extensions/manifest_handlers/shared_module_info.h"
 #include "chrome/common/extensions/permissions/permissions_data.h"
 #include "chrome/common/extensions/permissions/socket_permission.h"
+#include "chrome/common/extensions/web_accessible_resources_handler.h"
 #include "chrome/common/logging_chrome.h"
 #include "chrome/common/pepper_permission_util.h"
 #include "chrome/common/pref_names.h"
@@ -1048,6 +1049,37 @@
   return true;
 }
 
+bool ChromeContentBrowserClient::ShouldAllowOpenURL(
+    content::SiteInstance* site_instance, const GURL& url) {
+  GURL from_url = site_instance->GetSiteURL();
+  // Do not allow pages from the web or other extensions navigate to
+  // non-web-accessible extension resources.
+  if (url.SchemeIs(extensions::kExtensionScheme) &&
+      (from_url.SchemeIsHTTPOrHTTPS() ||
+          from_url.SchemeIs(extensions::kExtensionScheme))) {
+    Profile* profile = Profile::FromBrowserContext(
+        site_instance->GetProcess()->GetBrowserContext());
+    ExtensionService* service =
+        extensions::ExtensionSystem::Get(profile)->extension_service();
+    if (!service)
+      return true;
+    const Extension* extension =
+        service->extensions()->GetExtensionOrAppByURL(url);
+    if (!extension)
+      return true;
+    const Extension* from_extension =
+        service->extensions()->GetExtensionOrAppByURL(
+            site_instance->GetSiteURL());
+    if (from_extension && from_extension->id() == extension->id())
+      return true;
+
+    if (!extensions::WebAccessibleResourcesInfo::IsResourceWebAccessible(
+            extension, url.path()))
+      return false;
+  }
+  return true;
+}
+
 bool ChromeContentBrowserClient::IsSuitableHost(
     content::RenderProcessHost* process_host,
     const GURL& site_url) {