diff options
author | lazyboy <lazyboy@chromium.org> | 2014-09-06 06:22:51 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-09-06 13:24:18 +0000 |
commit | abce781d9bc37e60d95ed9504407169f845e056d (patch) | |
tree | f771ce06dd59b943734c0642cb3dff71587793fc /chrome/renderer | |
parent | 3b21259d93fdc6cd23ede873b15468bd35a047bf (diff) | |
download | chromium_src-abce781d9bc37e60d95ed9504407169f845e056d.zip chromium_src-abce781d9bc37e60d95ed9504407169f845e056d.tar.gz chromium_src-abce781d9bc37e60d95ed9504407169f845e056d.tar.bz2 |
Adding MimeHandlerView.
This GuestView type would be used to render out of process pdf through extension.
This introduces BrowserPluginDelegate in content/renderer,
because we need a way to create a MimeHandlerView guest (extensions/ concept)
from BrowserPlugin (content/ concept).
MimeHandlerView is behind --enable-mime-handler-view flag.
BUG=303491
Test=Apply http://crrev.com/392813003/ on top of this CL,
Launch chrome with --out-of-process-pdf flag and --enable-mime-handler-view flag
Navigate to a PDF
Check PDF is served using BrowserPlugin, probably easier to see process associated with the BrowserPlugin from Chrome's task manager.
Review URL: https://codereview.chromium.org/376033002
Cr-Commit-Position: refs/heads/master@{#293613}
Diffstat (limited to 'chrome/renderer')
4 files changed, 119 insertions, 0 deletions
diff --git a/chrome/renderer/browser_plugin/chrome_browser_plugin_delegate.cc b/chrome/renderer/browser_plugin/chrome_browser_plugin_delegate.cc new file mode 100644 index 0000000..fe5fd0c --- /dev/null +++ b/chrome/renderer/browser_plugin/chrome_browser_plugin_delegate.cc @@ -0,0 +1,68 @@ +// Copyright 2014 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. + +#include "chrome/renderer/browser_plugin/chrome_browser_plugin_delegate.h" + +#include "content/public/renderer/browser_plugin_delegate.h" +#include "content/public/renderer/render_frame.h" +#include "extensions/common/extension_messages.h" + +ChromeBrowserPluginDelegate::ChromeBrowserPluginDelegate( + content::RenderFrame* render_frame, + const std::string& mime_type) + : content::BrowserPluginDelegate(render_frame, mime_type), + content::RenderFrameObserver(render_frame), + mime_type_(mime_type), + // TODO(lazyboy): Use browser_plugin::kInstanceIDNone. + element_instance_id_(0) { +} + +ChromeBrowserPluginDelegate::~ChromeBrowserPluginDelegate() { +} + +void ChromeBrowserPluginDelegate::SetElementInstanceID( + int element_instance_id) { + element_instance_id_ = element_instance_id; +} + +void ChromeBrowserPluginDelegate::DidFinishLoading() { + DCHECK_NE(element_instance_id_, 0); + render_frame()->Send(new ExtensionHostMsg_CreateMimeHandlerViewGuest( + routing_id(), html_string_, mime_type_, element_instance_id_)); +} + +void ChromeBrowserPluginDelegate::DidReceiveData(const char* data, + int data_length) { + std::string value(data, data_length); + html_string_ += value; +} + +bool ChromeBrowserPluginDelegate::OnMessageReceived( + const IPC::Message& message) { + if (message.type() != ExtensionMsg_CreateMimeHandlerViewGuestACK::ID) + return false; + + DCHECK_NE(element_instance_id_, 0); + int element_instance_id = 0; + PickleIterator iter(message); + bool success = iter.ReadInt(&element_instance_id); + DCHECK(success); + if (element_instance_id != element_instance_id_) + return false; + + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(ChromeBrowserPluginDelegate, message) + IPC_MESSAGE_HANDLER(ExtensionMsg_CreateMimeHandlerViewGuestACK, + OnCreateMimeHandlerViewGuestACK) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled; +} + +void ChromeBrowserPluginDelegate::OnCreateMimeHandlerViewGuestACK( + int element_instance_id) { + DCHECK_NE(element_instance_id_, 0); + DCHECK_EQ(element_instance_id_, element_instance_id); + render_frame()->AttachGuest(element_instance_id); +} diff --git a/chrome/renderer/browser_plugin/chrome_browser_plugin_delegate.h b/chrome/renderer/browser_plugin/chrome_browser_plugin_delegate.h new file mode 100644 index 0000000..fa08dbd --- /dev/null +++ b/chrome/renderer/browser_plugin/chrome_browser_plugin_delegate.h @@ -0,0 +1,39 @@ +// Copyright 2014 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. + +#ifndef CHROME_RENDERER_BROWSER_PLUGIN_CHROME_BROWSER_PLUGIN_DELEGATE_H_ +#define CHROME_RENDERER_BROWSER_PLUGIN_CHROME_BROWSER_PLUGIN_DELEGATE_H_ + +#include "content/public/renderer/browser_plugin_delegate.h" + +#include "content/public/renderer/render_frame_observer.h" +#include "ipc/ipc_listener.h" + +// TODO(lazyboy): This should live under /extensions. +class ChromeBrowserPluginDelegate : public content::BrowserPluginDelegate, + public content::RenderFrameObserver { + public: + ChromeBrowserPluginDelegate(content::RenderFrame* render_frame, + const std::string& mime_type); + virtual ~ChromeBrowserPluginDelegate(); + + // BrowserPluginDelegate implementation. + virtual void SetElementInstanceID(int element_instance_id) OVERRIDE; + virtual void DidFinishLoading() OVERRIDE; + virtual void DidReceiveData(const char* data, int data_length) OVERRIDE; + + // RenderFrameObserver override. + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; + + private: + void OnCreateMimeHandlerViewGuestACK(int browser_plugin_delegate); + + const std::string mime_type_; + int element_instance_id_; + std::string html_string_; + + DISALLOW_COPY_AND_ASSIGN(ChromeBrowserPluginDelegate); +}; + +#endif // CHROME_RENDERER_BROWSER_PLUGIN_CHROME_BROWSER_PLUGIN_DELEGATE_H_ diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index 079eeb5..367426a 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc @@ -30,6 +30,7 @@ #include "chrome/grit/locale_settings.h" #include "chrome/grit/renderer_resources.h" #include "chrome/renderer/benchmarking_extension.h" +#include "chrome/renderer/browser_plugin/chrome_browser_plugin_delegate.h" #include "chrome/renderer/chrome_render_frame_observer.h" #include "chrome/renderer/chrome_render_process_observer.h" #include "chrome/renderer/chrome_render_view_observer.h" @@ -1524,3 +1525,10 @@ bool ChromeContentRendererClient::IsPluginAllowedToUseVideoDecodeAPI( return false; #endif } + +content::BrowserPluginDelegate* +ChromeContentRendererClient::CreateBrowserPluginDelegate( + content::RenderFrame* render_frame, + const std::string& mime_type) { + return new ChromeBrowserPluginDelegate(render_frame, mime_type); +} diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h index 7b06cbc..c8792c1 100644 --- a/chrome/renderer/chrome_content_renderer_client.h +++ b/chrome/renderer/chrome_content_renderer_client.h @@ -31,6 +31,7 @@ class SpellCheckProvider; struct ChromeViewHostMsg_GetPluginInfo_Output; namespace content { +class BrowserPluginDelegate; struct WebPluginInfo; } @@ -139,6 +140,9 @@ class ChromeContentRendererClient : public content::ContentRendererClient { virtual bool IsPluginAllowedToUseDevChannelAPIs() OVERRIDE; virtual bool IsPluginAllowedToUseCompositorAPI(const GURL& url) OVERRIDE; virtual bool IsPluginAllowedToUseVideoDecodeAPI(const GURL& url) OVERRIDE; + virtual content::BrowserPluginDelegate* CreateBrowserPluginDelegate( + content::RenderFrame* render_frame, + const std::string& mime_type) OVERRIDE; // Takes ownership. void SetExtensionDispatcherForTest( |