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,