summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorlazyboy <lazyboy@chromium.org>2014-09-06 06:22:51 -0700
committerCommit bot <commit-bot@chromium.org>2014-09-06 13:24:18 +0000
commitabce781d9bc37e60d95ed9504407169f845e056d (patch)
treef771ce06dd59b943734c0642cb3dff71587793fc /chrome/renderer
parent3b21259d93fdc6cd23ede873b15468bd35a047bf (diff)
downloadchromium_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')
-rw-r--r--chrome/renderer/browser_plugin/chrome_browser_plugin_delegate.cc68
-rw-r--r--chrome/renderer/browser_plugin/chrome_browser_plugin_delegate.h39
-rw-r--r--chrome/renderer/chrome_content_renderer_client.cc8
-rw-r--r--chrome/renderer/chrome_content_renderer_client.h4
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(