[go: up one dir, main page]

Show hosted app requests to extensions

BUG=526413
TEST=browser_tests --gtest_filter=ExtensionWebRequestApiTest.HostedAppRequest

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

Cr-Commit-Position: refs/heads/master@{#347756}
(cherry picked from commit 1db473b2e3b66646a7470e543540a44e854cd8f7)

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

Cr-Commit-Position: refs/branch-heads/2454@{#461}
Cr-Branched-From: 12bfc3360892ec53cd00fc239a47e5298beb063b-refs/heads/master@{#338390}
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
index d8adacc..bcf1301 100644
--- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc
+++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -19,6 +19,7 @@
 #include "content/public/test/browser_test_utils.h"
 #include "extensions/browser/api/web_request/web_request_api.h"
 #include "extensions/browser/extension_system.h"
+#include "extensions/common/extension_builder.h"
 #include "extensions/common/features/feature.h"
 #include "extensions/test/extension_test_message_listener.h"
 #include "extensions/test/result_catcher.h"
@@ -389,3 +390,33 @@
               listener_result.message());
   }
 }
+
+IN_PROC_BROWSER_TEST_F(ExtensionWebRequestApiTest, HostedAppRequest) {
+  ASSERT_TRUE(StartEmbeddedTestServer());
+  GURL hosted_app_url(
+      embedded_test_server()->GetURL(
+          "/extensions/api_test/webrequest_hosted_app/index.html"));
+  scoped_refptr<extensions::Extension> hosted_app =
+      extensions::ExtensionBuilder()
+      .SetManifest(extensions::DictionaryBuilder()
+          .Set("name", "Some hosted app")
+          .Set("version", "1")
+          .Set("manifest_version", 2)
+          .Set("app", extensions::DictionaryBuilder()
+              .Set("launch", extensions::DictionaryBuilder()
+                  .Set("web_url", hosted_app_url.spec()))))
+      .Build();
+  extensions::ExtensionSystem::Get(browser()->profile())->extension_service()
+      ->AddExtension(hosted_app.get());
+
+  ExtensionTestMessageListener listener1("main_frame", false);
+  ExtensionTestMessageListener listener2("xmlhttprequest", false);
+
+  ASSERT_TRUE(LoadExtension(
+          test_data_dir_.AppendASCII("webrequest_hosted_app")));
+
+  ui_test_utils::NavigateToURL(browser(), hosted_app_url);
+
+  EXPECT_TRUE(listener1.WaitUntilSatisfied());
+  EXPECT_TRUE(listener2.WaitUntilSatisfied());
+}
diff --git a/chrome/test/data/extensions/api_test/webrequest_hosted_app/background.js b/chrome/test/data/extensions/api_test/webrequest_hosted_app/background.js
new file mode 100644
index 0000000..7f2ee7e
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/webrequest_hosted_app/background.js
@@ -0,0 +1,8 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+chrome.webRequest.onBeforeRequest.addListener(function(details) {
+    chrome.test.sendMessage(details.type);
+}, {
+    urls: ['*://*/*webrequest_hosted_app*']
+});
diff --git a/chrome/test/data/extensions/api_test/webrequest_hosted_app/index.html b/chrome/test/data/extensions/api_test/webrequest_hosted_app/index.html
new file mode 100644
index 0000000..024d301d
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/webrequest_hosted_app/index.html
@@ -0,0 +1,12 @@
+<!--
+ * Copyright 2015 The Chromium Authors. All rights reserved.  Use of this
+ * source code is governed by a BSD-style license that can be found in the
+ * LICENSE file.
+-->
+<script>
+console.assert(chrome.app.isInstalled, 'This page should be a hosted app.');
+
+fetch('./index.html').catch(function() {
+  console.error('fetch unexpectedly failed!');
+});
+</script>
diff --git a/chrome/test/data/extensions/api_test/webrequest_hosted_app/manifest.json b/chrome/test/data/extensions/api_test/webrequest_hosted_app/manifest.json
new file mode 100644
index 0000000..8af4314
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/webrequest_hosted_app/manifest.json
@@ -0,0 +1,13 @@
+{
+    "name": "webRequest extension",
+    "version": "1",
+    "manifest_version": 2,
+    "background": {
+        "scripts": ["background.js"],
+        "persistent": true
+    },
+    "permissions": [
+        "webRequest",
+        "<all_urls>"
+    ]
+}
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc
index 9fb7cd4..95f69e2 100644
--- a/extensions/browser/api/web_request/web_request_api.cc
+++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -163,7 +163,20 @@
   if (!info)
     return false;
 
-  return extension_info_map->process_map().Contains(info->GetChildID());
+  const std::set<std::string> extension_ids =
+      extension_info_map->process_map().GetExtensionsInProcess(
+          info->GetChildID());
+  if (extension_ids.empty())
+    return false;
+
+  // Treat hosted apps as normal web pages (crbug.com/526413).
+  for (const std::string& extension_id : extension_ids) {
+    const Extension* extension =
+        extension_info_map->extensions().GetByID(extension_id);
+    if (extension && !extension->is_hosted_app())
+      return true;
+  }
+  return false;
 }
 
 void ExtractRequestRoutingInfo(net::URLRequest* request,