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 819a3811e22463e099d0b0af08b6adf50e807980..723579ee80ffbce2297354a197107ff3e443def0 100644 |
--- a/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc |
+++ b/chrome/browser/renderer_host/chrome_resource_dispatcher_host_delegate.cc |
@@ -7,6 +7,7 @@ |
#include <string> |
#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" |
@@ -155,25 +156,19 @@ 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::RenderViewHost* render_view_host = |
+ content::RenderViewHost::FromID(render_process_id, render_view_id); |
+ if (!render_view_host) |
+ return; |
+ |
content::WebContents* web_contents = |
tab_util::GetWebContentsByID(render_process_id, render_view_id); |
if (!web_contents) |
@@ -195,7 +190,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, |
@@ -545,7 +541,9 @@ bool ChromeResourceDispatcherHostDelegate::ShouldInterceptResourceAsStream( |
const GURL& url, |
const std::string& mime_type, |
GURL* origin, |
- std::string* target_id) { |
+ std::string* target_id, |
+ std::string* payload, |
+ std::string* view_id) { |
#if !defined(OS_ANDROID) |
ProfileIOData* io_data = |
ProfileIOData::FromResourceContext(resource_context); |
@@ -567,9 +565,14 @@ bool ChromeResourceDispatcherHostDelegate::ShouldInterceptResourceAsStream( |
continue; |
} |
- if (ExtensionCanHandleMimeType(extension, mime_type)) { |
+ MimeTypesHandler* handler = MimeTypesHandler::GetHandler(extension); |
+ if (handler && handler->CanHandleMIMEType(mime_type)) { |
*origin = Extension::GetBaseURLFromExtensionId(extension_id); |
*target_id = extension_id; |
+ if (!handler->handler_url().empty()) { |
+ *view_id = base::GenerateGUID(); |
+ *payload = origin->spec() + handler->handler_url() + "?id=" + *view_id; |
+ } |
return true; |
} |
} |
@@ -582,6 +585,7 @@ void ChromeResourceDispatcherHostDelegate::OnStreamCreated( |
int render_process_id, |
int render_view_id, |
const std::string& target_id, |
+ const std::string& view_id, |
scoped_ptr<content::StreamHandle> stream, |
int64 expected_content_size) { |
#if !defined(OS_ANDROID) |
@@ -589,7 +593,7 @@ void ChromeResourceDispatcherHostDelegate::OnStreamCreated( |
content::BrowserThread::UI, FROM_HERE, |
base::Bind(&SendExecuteMimeTypeHandlerEvent, base::Passed(&stream), |
expected_content_size, render_process_id, render_view_id, |
- target_id)); |
+ target_id, view_id)); |
#endif |
} |