Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4402)

Unified Diff: chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc

Issue 2222723002: Avoid calling into the ContentBrowserClient interface from ResourceDispatcherHostImpl to determine … (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix compile failures Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
diff --git a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
index 8adeb96f87829a4b0395e697e12325fb4b7ac245..296bb99ef533e2e30411972ecd1e80038cc7271e 100644
--- a/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
+++ b/chrome/browser/extensions/chrome_content_browser_client_extensions_part.cc
@@ -27,12 +27,15 @@
#include "content/public/browser/browser_url_handler.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
+#include "content/public/browser/resource_dispatcher_host.h"
+#include "content/public/browser/resource_dispatcher_host_interceptor.h"
#include "content/public/browser/site_instance.h"
#include "content/public/browser/vpn_service_proxy.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_switches.h"
#include "extensions/browser/api/web_request/web_request_api.h"
#include "extensions/browser/api/web_request/web_request_api_helpers.h"
+#include "extensions/browser/bad_message.h"
#include "extensions/browser/extension_host.h"
#include "extensions/browser/extension_message_filter.h"
#include "extensions/browser/extension_registry.h"
@@ -127,6 +130,44 @@ RenderProcessHostPrivilege GetProcessPrivilege(
} // namespace
+// Registers a HTTP origin header interceptor on the ResourceDispatcherHost
+// for the chrome extension scheme. On getting invoked it invokes the
+// |callback in the OnHttpHeaderReceived function with success or failure
+// based on whether the extension origin is valid. For more information on
+// how we determine whether the origins are valid, please see the
+// ChromeContentBrowserClientExtensionsPart::IsIllegalOrigin() function.
+class ChromeExtensionOriginInterceptor
+ : public content::ResourceDispatcherHostInterceptor {
+ public:
+ ChromeExtensionOriginInterceptor() {
+ content::ResourceDispatcherHost::Get()->RegisterInterceptor(
+ "Origin", kExtensionScheme, this);
+ }
+
+ ~ChromeExtensionOriginInterceptor() override {
+ content::ResourceDispatcherHost::Get()->UnregisterInterceptor(
+ "Origin", this);
+ }
+
+ void OnHttpHeaderReceived(const std::string& header,
+ const std::string& value,
+ int child_id,
+ content::ResourceContext* resource_context,
+ OnHeaderProcessedCallback callback) override {
+ DCHECK_CURRENTLY_ON(BrowserThread::IO);
+
+ GURL origin(value);
+ DCHECK(origin.SchemeIs(extensions::kExtensionScheme));
+
+ if (ChromeContentBrowserClientExtensionsPart::IsIllegalOrigin(
+ resource_context, child_id, origin)) {
+ callback.Run(false, bad_message::INVALID_ORIGIN);
+ } else {
+ callback.Run(true, 0);
+ }
+ }
+};
+
ChromeContentBrowserClientExtensionsPart::
ChromeContentBrowserClientExtensionsPart() {
}
@@ -662,4 +703,9 @@ void ChromeContentBrowserClientExtensionsPart::
}
}
+void ChromeContentBrowserClientExtensionsPart::
+ ResourceDispatcherHostCreated() {
+ extension_origin_interceptor_.reset(new ChromeExtensionOriginInterceptor);
+}
+
} // namespace extensions

Powered by Google App Engine
This is Rietveld 408576698