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

Unified Diff: content/browser/loader/buffered_resource_handler.cc

Issue 953793003: Ensuring interception of stream get determined by plugin path before checking mime type. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing nits. Created 5 years, 8 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: content/browser/loader/buffered_resource_handler.cc
diff --git a/content/browser/loader/buffered_resource_handler.cc b/content/browser/loader/buffered_resource_handler.cc
index 67e74a586f5231d3290ee813674357ce1d43bc7a..83881562db5b3cddc5f67733b3556f8d4c5b5473 100644
--- a/content/browser/loader/buffered_resource_handler.cc
+++ b/content/browser/loader/buffered_resource_handler.cc
@@ -297,6 +297,58 @@ bool BufferedResourceHandler::DetermineMimeType() {
return made_final_decision;
}
+bool BufferedResourceHandler::IsHandledByPlugin(bool* defer,
+ bool* request_handled) {
+#if defined(ENABLE_PLUGINS)
+ bool stale;
+ WebPluginInfo plugin;
+ bool allow_wildcard = false;
+ ResourceRequestInfoImpl* info = GetRequestInfo();
+ bool has_plugin = plugin_service_->GetPluginInfo(
+ info->GetChildID(), info->GetRenderFrameID(), info->GetContext(),
+ request()->url(), GURL(), response_->head.mime_type, allow_wildcard,
+ &stale, &plugin, NULL);
+
+ if (stale) {
+ // Refresh the plugins asynchronously.
+ plugin_service_->GetPlugins(
+ base::Bind(&BufferedResourceHandler::OnPluginsLoaded,
+ weak_ptr_factory_.GetWeakPtr()));
+ request()->LogBlockedBy("BufferedResourceHandler");
+ *defer = true;
+ return true;
+ }
+
+ if (has_plugin) {
+ if (plugin.type == WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN) {
+ // If it is a MimeHandlerView plugin, intercept the stream.
+ std::string payload;
+ scoped_ptr<ResourceHandler> handler(host_->MaybeInterceptAsStream(
+ plugin.path, request(), response_.get(), &payload));
+ if (handler) {
+ *request_handled = UseAlternateNextHandler(handler.Pass(), payload);
+ return true;
+ }
+ return false;
+ } else {
+ return true;
+ }
+ }
+
+ // If execution reaches here then we should try intercepting the stream for
+ // the old streamsPrivate extensions API. This API is deprecated and should
+ // go away.
+ std::string payload;
+ scoped_ptr<ResourceHandler> handler(host_->MaybeInterceptAsStream(
+ base::FilePath(), request(), response_.get(), &payload));
+ if (handler) {
+ *request_handled = UseAlternateNextHandler(handler.Pass(), payload);
+ return true;
+ }
+#endif
+ return false;
+}
+
bool BufferedResourceHandler::SelectNextHandler(bool* defer) {
DCHECK(!response_->head.mime_type.empty());
@@ -314,13 +366,13 @@ bool BufferedResourceHandler::SelectNextHandler(bool* defer) {
// Allow requests for object/embed tags to be intercepted as streams.
if (info->GetResourceType() == content::RESOURCE_TYPE_OBJECT) {
DCHECK(!info->allow_download());
- std::string payload;
- scoped_ptr<ResourceHandler> handler(
- host_->MaybeInterceptAsStream(request(), response_.get(), &payload));
- if (handler) {
- DCHECK(!net::IsSupportedMimeType(mime_type));
- return UseAlternateNextHandler(handler.Pass(), payload);
- }
+
+ bool request_handled = true;
+ bool handled_by_plugin = IsHandledByPlugin(defer, &request_handled);
+ if (!request_handled)
+ return false;
+ if (handled_by_plugin)
+ return true;
}
if (!info->allow_download())
@@ -337,28 +389,12 @@ bool BufferedResourceHandler::SelectNextHandler(bool* defer) {
if (net::IsSupportedMimeType(mime_type))
return true;
- std::string payload;
- scoped_ptr<ResourceHandler> handler(
- host_->MaybeInterceptAsStream(request(), response_.get(), &payload));
- if (handler) {
- return UseAlternateNextHandler(handler.Pass(), payload);
- }
-
-#if defined(ENABLE_PLUGINS)
- bool stale;
- bool has_plugin = HasSupportingPlugin(&stale);
- if (stale) {
- // Refresh the plugins asynchronously.
- plugin_service_->GetPlugins(
- base::Bind(&BufferedResourceHandler::OnPluginsLoaded,
- weak_ptr_factory_.GetWeakPtr()));
- request()->LogBlockedBy("BufferedResourceHandler");
- *defer = true;
- return true;
- }
- if (has_plugin)
+ bool request_handled = true;
+ bool handled_by_plugin = IsHandledByPlugin(defer, &request_handled);
+ if (!request_handled)
+ return false;
+ if (handled_by_plugin)
return true;
-#endif
}
// Install download handler
@@ -475,23 +511,6 @@ bool BufferedResourceHandler::MustDownload() {
return must_download_;
}
-bool BufferedResourceHandler::HasSupportingPlugin(bool* stale) {
-#if defined(ENABLE_PLUGINS)
- ResourceRequestInfoImpl* info = GetRequestInfo();
-
- bool allow_wildcard = false;
- WebPluginInfo plugin;
- return plugin_service_->GetPluginInfo(
- info->GetChildID(), info->GetRenderFrameID(), info->GetContext(),
- request()->url(), GURL(), response_->head.mime_type, allow_wildcard,
- stale, &plugin, NULL);
-#else
- if (stale)
- *stale = false;
- return false;
-#endif
-}
-
bool BufferedResourceHandler::CopyReadBufferToNextHandler() {
if (!read_buffer_.get())
return true;
« no previous file with comments | « content/browser/loader/buffered_resource_handler.h ('k') | content/browser/loader/buffered_resource_handler_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698