| Index: chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
|
| diff --git a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
|
| index d79ad2d6b277f3cd440215c06a454bb2b25751e7..03d06a481ceab2b13fcd8f7c83f3fc201a553f08 100644
|
| --- a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
|
| +++ b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc
|
| @@ -8,6 +8,7 @@
|
| #include <vector>
|
|
|
| #include "base/base64.h"
|
| +#include "base/guid.h"
|
| #include "base/logging.h"
|
| #include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/chrome_notification_types.h"
|
| @@ -156,23 +157,12 @@ void UpdatePrerenderNetworkBytesCallback(int render_process_id,
|
| }
|
|
|
| #if !defined(OS_ANDROID)
|
| -// Goes through the extension's file browser handlers and checks if there is one
|
| -// that can handle the |mime_type|.
|
| -// |extension| must not be NULL.
|
| -bool ExtensionCanHandleMimeType(const Extension* extension,
|
| - const std::string& mime_type) {
|
| - MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension);
|
| - if (!handler)
|
| - return false;
|
| -
|
| - return handler->CanHandleMIMEType(mime_type);
|
| -}
|
| -
|
| void SendExecuteMimeTypeHandlerEvent(scoped_ptr<content::StreamHandle> stream,
|
| int64 expected_content_size,
|
| int render_process_id,
|
| int render_view_id,
|
| - const std::string& extension_id) {
|
| + const std::string& extension_id,
|
| + const std::string& view_id) {
|
| DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
|
|
|
| content::WebContents* web_contents =
|
| @@ -196,7 +186,8 @@ void SendExecuteMimeTypeHandlerEvent(scoped_ptr<content::StreamHandle> stream,
|
| if (!streams_private)
|
| return;
|
| streams_private->ExecuteMimeTypeHandler(
|
| - extension_id, web_contents, stream.Pass(), expected_content_size);
|
| + extension_id, web_contents, stream.Pass(), view_id,
|
| + expected_content_size);
|
| }
|
|
|
| void LaunchURL(const GURL& url, int render_process_id, int render_view_id,
|
| @@ -264,6 +255,7 @@ ChromeResourceDispatcherHostDelegate::ChromeResourceDispatcherHostDelegate(
|
| }
|
|
|
| ChromeResourceDispatcherHostDelegate::~ChromeResourceDispatcherHostDelegate() {
|
| + CHECK(stream_target_info_.empty());
|
| }
|
|
|
| bool ChromeResourceDispatcherHostDelegate::ShouldBeginRequest(
|
| @@ -549,14 +541,14 @@ bool ChromeResourceDispatcherHostDelegate::ShouldForceDownloadResource(
|
| }
|
|
|
| bool ChromeResourceDispatcherHostDelegate::ShouldInterceptResourceAsStream(
|
| - content::ResourceContext* resource_context,
|
| - const GURL& url,
|
| + net::URLRequest* request,
|
| const std::string& mime_type,
|
| GURL* origin,
|
| - std::string* target_id) {
|
| + std::string* payload) {
|
| #if !defined(OS_ANDROID)
|
| + const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
|
| ProfileIOData* io_data =
|
| - ProfileIOData::FromResourceContext(resource_context);
|
| + ProfileIOData::FromResourceContext(info->GetContext());
|
| bool profile_is_off_the_record = io_data->IsOffTheRecord();
|
| const scoped_refptr<const extensions::InfoMap> extension_info_map(
|
| io_data->GetExtensionInfoMap());
|
| @@ -575,9 +567,17 @@ bool ChromeResourceDispatcherHostDelegate::ShouldInterceptResourceAsStream(
|
| continue;
|
| }
|
|
|
| - if (ExtensionCanHandleMimeType(extension, mime_type)) {
|
| + MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension);
|
| + if (handler && handler->CanHandleMIMEType(mime_type)) {
|
| + StreamTargetInfo target_info;
|
| *origin = Extension::GetBaseURLFromExtensionId(extension_id);
|
| - *target_id = extension_id;
|
| + target_info.extension_id = extension_id;
|
| + if (!handler->handler_url().empty()) {
|
| + target_info.view_id = base::GenerateGUID();
|
| + *payload = origin->spec() + handler->handler_url() +
|
| + "?id=" + target_info.view_id;
|
| + }
|
| + stream_target_info_[request] = target_info;
|
| return true;
|
| }
|
| }
|
| @@ -586,18 +586,20 @@ bool ChromeResourceDispatcherHostDelegate::ShouldInterceptResourceAsStream(
|
| }
|
|
|
| void ChromeResourceDispatcherHostDelegate::OnStreamCreated(
|
| - content::ResourceContext* resource_context,
|
| - int render_process_id,
|
| - int render_view_id,
|
| - const std::string& target_id,
|
| - scoped_ptr<content::StreamHandle> stream,
|
| - int64 expected_content_size) {
|
| + net::URLRequest* request,
|
| + scoped_ptr<content::StreamHandle> stream) {
|
| #if !defined(OS_ANDROID)
|
| + const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
|
| + std::map<net::URLRequest*, StreamTargetInfo>::iterator ix =
|
| + stream_target_info_.find(request);
|
| + CHECK(ix != stream_target_info_.end());
|
| content::BrowserThread::PostTask(
|
| content::BrowserThread::UI, FROM_HERE,
|
| base::Bind(&SendExecuteMimeTypeHandlerEvent, base::Passed(&stream),
|
| - expected_content_size, render_process_id, render_view_id,
|
| - target_id));
|
| + request->GetExpectedContentSize(),
|
| + info->GetChildID(), info->GetRouteID(),
|
| + ix->second.extension_id, ix->second.view_id));
|
| + stream_target_info_.erase(request);
|
| #endif
|
| }
|
|
|
|
|