Commit abce781d authored by lazyboy's avatar lazyboy Committed by Commit bot

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}
parent 3b21259d
...@@ -1010,7 +1010,7 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, Focus_FocusRestored) { ...@@ -1010,7 +1010,7 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, Focus_FocusRestored) {
// ui::TextInputClient is NULL for mac and android. // ui::TextInputClient is NULL for mac and android.
#if !defined(OS_MACOSX) && !defined(OS_ANDROID) #if !defined(OS_MACOSX) && !defined(OS_ANDROID)
IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, Focus_InputMethod) { IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, DISABLED_Focus_InputMethod) {
content::WebContents* embedder_web_contents = NULL; content::WebContents* embedder_web_contents = NULL;
scoped_ptr<ExtensionTestMessageListener> done_listener( scoped_ptr<ExtensionTestMessageListener> done_listener(
RunAppHelper("testInputMethod", "web_view/focus", NO_TEST_SERVER, RunAppHelper("testInputMethod", "web_view/focus", NO_TEST_SERVER,
...@@ -1062,10 +1062,6 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, Focus_InputMethod) { ...@@ -1062,10 +1062,6 @@ IN_PROC_BROWSER_TEST_F(WebViewInteractiveTest, Focus_InputMethod) {
ui::CompositionText composition; ui::CompositionText composition;
composition.text = base::UTF8ToUTF16("InputTest789"); composition.text = base::UTF8ToUTF16("InputTest789");
text_input_client->SetCompositionText(composition); text_input_client->SetCompositionText(composition);
// Do a roundtrip to the renderer so that in-flight IPC from
// SetCompositionText() above gets routed before the next step.
// The test becomes flaky otherwise.
EXPECT_TRUE(content::ExecuteScript(embedder_web_contents, std::string()));
EXPECT_TRUE(content::ExecuteScript( EXPECT_TRUE(content::ExecuteScript(
embedder_web_contents, embedder_web_contents,
"window.runCommand('testInputMethodRunNextStep', 3);")); "window.runCommand('testInputMethodRunNextStep', 3);"));
......
...@@ -7,6 +7,8 @@ ...@@ -7,6 +7,8 @@
'chrome_renderer_sources': [ 'chrome_renderer_sources': [
'renderer/benchmarking_extension.cc', 'renderer/benchmarking_extension.cc',
'renderer/benchmarking_extension.h', 'renderer/benchmarking_extension.h',
'renderer/browser_plugin/chrome_browser_plugin_delegate.cc',
'renderer/browser_plugin/chrome_browser_plugin_delegate.h',
'renderer/extensions/chrome_extension_helper.cc', 'renderer/extensions/chrome_extension_helper.cc',
'renderer/extensions/chrome_extension_helper.h', 'renderer/extensions/chrome_extension_helper.h',
'renderer/extensions/chrome_extensions_dispatcher_delegate.cc', 'renderer/extensions/chrome_extensions_dispatcher_delegate.cc',
......
...@@ -581,6 +581,12 @@ ...@@ -581,6 +581,12 @@
"dependencies": ["permission:mdns"], "dependencies": ["permission:mdns"],
"contexts": ["blessed_extension"] "contexts": ["blessed_extension"]
}, },
"mimeHandlerViewGuestInternal": {
"internal": true,
"contexts": "all",
"channel": "dev",
"matches": ["<all_urls>"]
},
"musicManagerPrivate": { "musicManagerPrivate": {
"dependencies": ["permission:musicManagerPrivate"], "dependencies": ["permission:musicManagerPrivate"],
"contexts": ["blessed_extension"] "contexts": ["blessed_extension"]
......
// 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);
}
// 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_
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
#include "chrome/grit/locale_settings.h" #include "chrome/grit/locale_settings.h"
#include "chrome/grit/renderer_resources.h" #include "chrome/grit/renderer_resources.h"
#include "chrome/renderer/benchmarking_extension.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_frame_observer.h"
#include "chrome/renderer/chrome_render_process_observer.h" #include "chrome/renderer/chrome_render_process_observer.h"
#include "chrome/renderer/chrome_render_view_observer.h" #include "chrome/renderer/chrome_render_view_observer.h"
...@@ -1524,3 +1525,10 @@ bool ChromeContentRendererClient::IsPluginAllowedToUseVideoDecodeAPI( ...@@ -1524,3 +1525,10 @@ bool ChromeContentRendererClient::IsPluginAllowedToUseVideoDecodeAPI(
return false; return false;
#endif #endif
} }
content::BrowserPluginDelegate*
ChromeContentRendererClient::CreateBrowserPluginDelegate(
content::RenderFrame* render_frame,
const std::string& mime_type) {
return new ChromeBrowserPluginDelegate(render_frame, mime_type);
}
...@@ -31,6 +31,7 @@ class SpellCheckProvider; ...@@ -31,6 +31,7 @@ class SpellCheckProvider;
struct ChromeViewHostMsg_GetPluginInfo_Output; struct ChromeViewHostMsg_GetPluginInfo_Output;
namespace content { namespace content {
class BrowserPluginDelegate;
struct WebPluginInfo; struct WebPluginInfo;
} }
...@@ -139,6 +140,9 @@ class ChromeContentRendererClient : public content::ContentRendererClient { ...@@ -139,6 +140,9 @@ class ChromeContentRendererClient : public content::ContentRendererClient {
virtual bool IsPluginAllowedToUseDevChannelAPIs() OVERRIDE; virtual bool IsPluginAllowedToUseDevChannelAPIs() OVERRIDE;
virtual bool IsPluginAllowedToUseCompositorAPI(const GURL& url) OVERRIDE; virtual bool IsPluginAllowedToUseCompositorAPI(const GURL& url) OVERRIDE;
virtual bool IsPluginAllowedToUseVideoDecodeAPI(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. // Takes ownership.
void SetExtensionDispatcherForTest( void SetExtensionDispatcherForTest(
......
...@@ -15,18 +15,6 @@ var sendMessage = function(data) { ...@@ -15,18 +15,6 @@ var sendMessage = function(data) {
embedder.postMessage(JSON.stringify(data), '*'); embedder.postMessage(JSON.stringify(data), '*');
}; };
var waitingForInput = false;
var onInputFired = function() {
sendMessage(['response-waitForOnInput', onInputState.value]);
onInputState.fired = false;
if (inputElement1.value == 'InputTest456') {
// Prepare for next step, step 3.
inputElement1.value = '';
}
waitingForInput = false;
};
var onInputState = {fired: false, value: ''}; var onInputState = {fired: false, value: ''};
// Waits for oninput event to fire on |inputElement1|. // Waits for oninput event to fire on |inputElement1|.
// Upon receiving the event, we ping back the embedder with the value of // Upon receiving the event, we ping back the embedder with the value of
...@@ -35,9 +23,13 @@ var waitForOnInput = function() { ...@@ -35,9 +23,13 @@ var waitForOnInput = function() {
var inputElement1 = document.querySelector('input'); var inputElement1 = document.querySelector('input');
LOG('inputElement1: ' + inputElement1); LOG('inputElement1: ' + inputElement1);
if (onInputState.fired) { if (onInputState.fired) {
onInputFired(); sendMessage(['response-waitForOnInput', onInputState.value]);
} else {
waitingForInput = true; onInputState.fired = false;
if (inputElement1.value == 'InputTest456') {
// Prepare for next step, step 3.
inputElement1.value = '';
}
} }
}; };
...@@ -49,9 +41,6 @@ var waitForFocus = function() { ...@@ -49,9 +41,6 @@ var waitForFocus = function() {
LOG('inputElement1.oninput: ' + inputElement1.value); LOG('inputElement1.oninput: ' + inputElement1.value);
onInputState.fired = true; onInputState.fired = true;
onInputState.value = inputElement1.value; onInputState.value = inputElement1.value;
if (waitingForInput) {
onInputFired();
}
}; };
var inputElement1FocusListener = function() { var inputElement1FocusListener = function() {
LOG('inputElement1.focus'); LOG('inputElement1.focus');
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
'public_renderer_sources': [ 'public_renderer_sources': [
'public/renderer/android_content_detection_prefixes.cc', 'public/renderer/android_content_detection_prefixes.cc',
'public/renderer/android_content_detection_prefixes.h', 'public/renderer/android_content_detection_prefixes.h',
'public/renderer/browser_plugin_delegate.h',
'public/renderer/content_renderer_client.cc', 'public/renderer/content_renderer_client.cc',
'public/renderer/content_renderer_client.h', 'public/renderer/content_renderer_client.h',
'public/renderer/context_menu_client.h', 'public/renderer/context_menu_client.h',
......
// 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 CONTENT_PUBLIC_RENDERER_BROWSER_PLUGIN_DELEGATE_H_
#define CONTENT_PUBLIC_RENDERER_BROWSER_PLUGIN_DELEGATE_H_
#include <string>
#include "content/common/content_export.h"
namespace content {
class RenderFrame;
// A delegate for BrowserPlugin which gets notified about the plugin load.
// Implementations can provide additional steps necessary to change the load
// behavior of the plugin.
class CONTENT_EXPORT BrowserPluginDelegate {
public:
BrowserPluginDelegate(RenderFrame* render_frame,
const std::string& mime_type) {}
virtual ~BrowserPluginDelegate() {}
// Called when plugin document has finished loading.
virtual void DidFinishLoading() {}
// Called when plugin document receives data.
virtual void DidReceiveData(const char* data, int data_length) {}
// Sets the instance ID that idenfies the plugin within current render
// process.
virtual void SetElementInstanceID(int element_instance_id) {}
};
} // namespace content
#endif // CONTENT_PUBLIC_RENDERER_BROWSER_PLUGIN_DELEGATE_H_
...@@ -190,4 +190,10 @@ bool ContentRendererClient::IsPluginAllowedToUseDevChannelAPIs() { ...@@ -190,4 +190,10 @@ bool ContentRendererClient::IsPluginAllowedToUseDevChannelAPIs() {
return false; return false;
} }
BrowserPluginDelegate* ContentRendererClient::CreateBrowserPluginDelegate(
RenderFrame* render_frame,
const std::string& mime_type) {
return NULL;
}
} // namespace content } // namespace content
...@@ -50,6 +50,7 @@ struct WebURLError; ...@@ -50,6 +50,7 @@ struct WebURLError;
} }
namespace content { namespace content {
class BrowserPluginDelegate;
class DocumentState; class DocumentState;
class RenderFrame; class RenderFrame;
class RenderView; class RenderView;
...@@ -101,6 +102,11 @@ class CONTENT_EXPORT ContentRendererClient { ...@@ -101,6 +102,11 @@ class CONTENT_EXPORT ContentRendererClient {
RenderFrame* render_frame, RenderFrame* render_frame,
const base::FilePath& plugin_path); const base::FilePath& plugin_path);
// Creates a delegate for browser plugin.
virtual BrowserPluginDelegate* CreateBrowserPluginDelegate(
RenderFrame* render_frame,
const std::string& mime_type);
// Returns true if the embedder has an error page to show for the given http // Returns true if the embedder has an error page to show for the given http
// status code. If so |error_domain| should be set to according to WebURLError // status code. If so |error_domain| should be set to according to WebURLError
// and the embedder's GetNavigationErrorHtml will be called afterwards to get // and the embedder's GetNavigationErrorHtml will be called afterwards to get
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include "content/common/view_messages.h" #include "content/common/view_messages.h"
#include "content/public/common/content_client.h" #include "content/public/common/content_client.h"
#include "content/public/common/content_switches.h" #include "content/public/common/content_switches.h"
#include "content/public/renderer/browser_plugin_delegate.h"
#include "content/public/renderer/content_renderer_client.h" #include "content/public/renderer/content_renderer_client.h"
#include "content/renderer/browser_plugin/browser_plugin_bindings.h" #include "content/renderer/browser_plugin/browser_plugin_bindings.h"
#include "content/renderer/browser_plugin/browser_plugin_manager.h" #include "content/renderer/browser_plugin/browser_plugin_manager.h"
...@@ -44,7 +45,7 @@ namespace content { ...@@ -44,7 +45,7 @@ namespace content {
BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view, BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view,
blink::WebFrame* frame, blink::WebFrame* frame,
bool auto_navigate) scoped_ptr<BrowserPluginDelegate> delegate)
: attached_(false), : attached_(false),
attach_pending_(false), attach_pending_(false),
render_view_(render_view->AsWeakPtr()), render_view_(render_view->AsWeakPtr()),
...@@ -56,11 +57,15 @@ BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view, ...@@ -56,11 +57,15 @@ BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view,
content_window_routing_id_(MSG_ROUTING_NONE), content_window_routing_id_(MSG_ROUTING_NONE),
plugin_focused_(false), plugin_focused_(false),
visible_(true), visible_(true),
auto_navigate_(auto_navigate),
mouse_locked_(false), mouse_locked_(false),
browser_plugin_manager_(render_view->GetBrowserPluginManager()), browser_plugin_manager_(render_view->GetBrowserPluginManager()),
browser_plugin_instance_id_(browser_plugin::kInstanceIDNone), browser_plugin_instance_id_(browser_plugin::kInstanceIDNone),
delegate_(delegate.Pass()),
weak_ptr_factory_(this) { weak_ptr_factory_(this) {
browser_plugin_instance_id_ = browser_plugin_manager()->GetNextInstanceID();
if (delegate_)
delegate_->SetElementInstanceID(browser_plugin_instance_id_);
} }
BrowserPlugin::~BrowserPlugin() { BrowserPlugin::~BrowserPlugin() {
...@@ -375,7 +380,8 @@ bool BrowserPlugin::initialize(WebPluginContainer* container) { ...@@ -375,7 +380,8 @@ bool BrowserPlugin::initialize(WebPluginContainer* container) {
// This is a way to notify observers of our attributes that this plugin is // This is a way to notify observers of our attributes that this plugin is
// available in render tree. // available in render tree.
browser_plugin_instance_id_ = browser_plugin_manager()->GetNextInstanceID(); // TODO(lazyboy): This should be done through the delegate instead. Perhaps
// by firing an event from there.
UpdateDOMAttribute("internalinstanceid", UpdateDOMAttribute("internalinstanceid",
base::IntToString(browser_plugin_instance_id_)); base::IntToString(browser_plugin_instance_id_));
...@@ -656,17 +662,13 @@ void BrowserPlugin::didReceiveResponse( ...@@ -656,17 +662,13 @@ void BrowserPlugin::didReceiveResponse(
} }
void BrowserPlugin::didReceiveData(const char* data, int data_length) { void BrowserPlugin::didReceiveData(const char* data, int data_length) {
if (auto_navigate_) { if (delegate_)
std::string value(data, data_length); delegate_->DidReceiveData(data, data_length);
html_string_ += value;
}
} }
void BrowserPlugin::didFinishLoading() { void BrowserPlugin::didFinishLoading() {
if (auto_navigate_) { if (delegate_)
// TODO(lazyboy): Make |auto_navigate_| stuff work. delegate_->DidFinishLoading();
UpdateDOMAttribute(content::browser_plugin::kAttributeSrc, html_string_);
}
} }
void BrowserPlugin::didFailLoading(const blink::WebURLError& error) { void BrowserPlugin::didFailLoading(const blink::WebURLError& error) {
......
...@@ -23,6 +23,7 @@ struct FrameMsg_BuffersSwapped_Params; ...@@ -23,6 +23,7 @@ struct FrameMsg_BuffersSwapped_Params;
namespace content { namespace content {
class BrowserPluginDelegate;
class ChildFrameCompositingHelper; class ChildFrameCompositingHelper;
class BrowserPluginManager; class BrowserPluginManager;
class MockBrowserPlugin; class MockBrowserPlugin;
...@@ -165,7 +166,7 @@ class CONTENT_EXPORT BrowserPlugin : ...@@ -165,7 +166,7 @@ class CONTENT_EXPORT BrowserPlugin :
// BrowserPlugin. // BrowserPlugin.
BrowserPlugin(RenderViewImpl* render_view, BrowserPlugin(RenderViewImpl* render_view,
blink::WebFrame* frame, blink::WebFrame* frame,
bool auto_navigate); scoped_ptr<BrowserPluginDelegate> delegate);
virtual ~BrowserPlugin(); virtual ~BrowserPlugin();
...@@ -224,9 +225,6 @@ class CONTENT_EXPORT BrowserPlugin : ...@@ -224,9 +225,6 @@ class CONTENT_EXPORT BrowserPlugin :
// embedder RenderView's visibility. // embedder RenderView's visibility.
bool visible_; bool visible_;
const bool auto_navigate_;
std::string html_string_;
WebCursor cursor_; WebCursor cursor_;
gfx::Size last_view_size_; gfx::Size last_view_size_;
...@@ -248,6 +246,8 @@ class CONTENT_EXPORT BrowserPlugin : ...@@ -248,6 +246,8 @@ class CONTENT_EXPORT BrowserPlugin :
std::vector<EditCommand> edit_commands_; std::vector<EditCommand> edit_commands_;
scoped_ptr<BrowserPluginDelegate> delegate_;
// Weak factory used in v8 |MakeWeak| callback, since the v8 callback might // Weak factory used in v8 |MakeWeak| callback, since the v8 callback might
// get called after BrowserPlugin has been destroyed. // get called after BrowserPlugin has been destroyed.
base::WeakPtrFactory<BrowserPlugin> weak_ptr_factory_; base::WeakPtrFactory<BrowserPlugin> weak_ptr_factory_;
......
...@@ -25,6 +25,7 @@ struct WebPluginParams; ...@@ -25,6 +25,7 @@ struct WebPluginParams;
namespace content { namespace content {
class BrowserPlugin; class BrowserPlugin;
class BrowserPluginDelegate;
class BrowserPluginManagerFactory; class BrowserPluginManagerFactory;
class RenderViewImpl; class RenderViewImpl;
...@@ -52,7 +53,7 @@ class CONTENT_EXPORT BrowserPluginManager ...@@ -52,7 +53,7 @@ class CONTENT_EXPORT BrowserPluginManager
virtual BrowserPlugin* CreateBrowserPlugin( virtual BrowserPlugin* CreateBrowserPlugin(
RenderViewImpl* render_view, RenderViewImpl* render_view,
blink::WebFrame* frame, blink::WebFrame* frame,
bool auto_navigate) = 0; scoped_ptr<BrowserPluginDelegate> delegate) = 0;
void Attach(int browser_plugin_instance_id); void Attach(int browser_plugin_instance_id);
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "content/common/browser_plugin/browser_plugin_constants.h" #include "content/common/browser_plugin/browser_plugin_constants.h"
#include "content/common/browser_plugin/browser_plugin_messages.h" #include "content/common/browser_plugin/browser_plugin_messages.h"
#include "content/common/cursors/webcursor.h" #include "content/common/cursors/webcursor.h"
#include "content/public/renderer/browser_plugin_delegate.h"
#include "content/renderer/browser_plugin/browser_plugin.h" #include "content/renderer/browser_plugin/browser_plugin.h"
#include "content/renderer/render_thread_impl.h" #include "content/renderer/render_thread_impl.h"
#include "ui/gfx/point.h" #include "ui/gfx/point.h"
...@@ -23,8 +24,8 @@ BrowserPluginManagerImpl::~BrowserPluginManagerImpl() { ...@@ -23,8 +24,8 @@ BrowserPluginManagerImpl::~BrowserPluginManagerImpl() {
BrowserPlugin* BrowserPluginManagerImpl::CreateBrowserPlugin( BrowserPlugin* BrowserPluginManagerImpl::CreateBrowserPlugin(
RenderViewImpl* render_view, RenderViewImpl* render_view,
blink::WebFrame* frame, blink::WebFrame* frame,
bool auto_navigate) { scoped_ptr<BrowserPluginDelegate> delegate) {
return new BrowserPlugin(render_view, frame, auto_navigate); return new BrowserPlugin(render_view, frame, delegate.Pass());
} }
bool BrowserPluginManagerImpl::Send(IPC::Message* msg) { bool BrowserPluginManagerImpl::Send(IPC::Message* msg) {
......
...@@ -24,7 +24,7 @@ class BrowserPluginManagerImpl : public BrowserPluginManager { ...@@ -24,7 +24,7 @@ class BrowserPluginManagerImpl : public BrowserPluginManager {
virtual BrowserPlugin* CreateBrowserPlugin( virtual BrowserPlugin* CreateBrowserPlugin(
RenderViewImpl* render_view, RenderViewImpl* render_view,
blink::WebFrame* frame, blink::WebFrame* frame,
bool auto_navigate) OVERRIDE; scoped_ptr<BrowserPluginDelegate> delegate) OVERRIDE;
// IPC::Sender implementation. // IPC::Sender implementation.
virtual bool Send(IPC::Message* msg) OVERRIDE; virtual bool Send(IPC::Message* msg) OVERRIDE;
......
...@@ -3,14 +3,16 @@ ...@@ -3,14 +3,16 @@
// found in the LICENSE file. // found in the LICENSE file.
#include "content/renderer/browser_plugin/mock_browser_plugin.h" #include "content/renderer/browser_plugin/mock_browser_plugin.h"
#include "content/public/renderer/browser_plugin_delegate.h"
#include "content/renderer/render_process_impl.h" #include "content/renderer/render_process_impl.h"
namespace content { namespace content {
MockBrowserPlugin::MockBrowserPlugin(RenderViewImpl* render_view, MockBrowserPlugin::MockBrowserPlugin(RenderViewImpl* render_view,
blink::WebFrame* frame, blink::WebFrame* frame,
bool auto_navigate) scoped_ptr<BrowserPluginDelegate> delegate)
: BrowserPlugin(render_view, frame, auto_navigate) { : BrowserPlugin(render_view, frame, delegate.Pass()) {
} }
MockBrowserPlugin::~MockBrowserPlugin() {} MockBrowserPlugin::~MockBrowserPlugin() {}
......
...@@ -13,7 +13,7 @@ class MockBrowserPlugin : public BrowserPlugin { ...@@ -13,7 +13,7 @@ class MockBrowserPlugin : public BrowserPlugin {
public: public:
MockBrowserPlugin(RenderViewImpl* render_view, MockBrowserPlugin(RenderViewImpl* render_view,
blink::WebFrame* frame, blink::WebFrame* frame,
bool auto_navigate); scoped_ptr<BrowserPluginDelegate> delegate);
virtual ~MockBrowserPlugin(); virtual ~MockBrowserPlugin();
......
...@@ -23,8 +23,8 @@ MockBrowserPluginManager::~MockBrowserPluginManager() { ...@@ -23,8 +23,8 @@ MockBrowserPluginManager::~MockBrowserPluginManager() {
BrowserPlugin* MockBrowserPluginManager::CreateBrowserPlugin( BrowserPlugin* MockBrowserPluginManager::CreateBrowserPlugin(
RenderViewImpl* render_view, RenderViewImpl* render_view,
blink::WebFrame* frame, blink::WebFrame* frame,
bool auto_navigate) { scoped_ptr<BrowserPluginDelegate> delegate) {
last_plugin_ = new MockBrowserPlugin(render_view, frame, auto_navigate); last_plugin_ = new MockBrowserPlugin(render_view, frame, delegate.Pass());
return last_plugin_; return last_plugin_;
} }
......
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include "content/renderer/browser_plugin/browser_plugin_manager.h" #include "content/renderer/browser_plugin/browser_plugin_manager.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "content/public/renderer/browser_plugin_delegate.h"
#include "ipc/ipc_message_utils.h" #include "ipc/ipc_message_utils.h"
#include "ipc/ipc_test_sink.h" #include "ipc/ipc_test_sink.h"
...@@ -23,7 +24,7 @@ class MockBrowserPluginManager : public BrowserPluginManager { ...@@ -23,7 +24,7 @@ class MockBrowserPluginManager : public BrowserPluginManager {
virtual BrowserPlugin* CreateBrowserPlugin( virtual BrowserPlugin* CreateBrowserPlugin(
RenderViewImpl* render_view, RenderViewImpl* render_view,
blink::WebFrame* frame, blink::WebFrame* frame,
bool auto_navigate) OVERRIDE; scoped_ptr<BrowserPluginDelegate> delegate) OVERRIDE;
// Provides access to the messages that have been received by this thread. // Provides access to the messages that have been received by this thread.
IPC::TestSink& sink() { return sink_; } IPC::TestSink& sink() { return sink_; }
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include "content/public/common/context_menu_params.h" #include "content/public/common/context_menu_params.h"
#include "content/public/common/url_constants.h" #include "content/public/common/url_constants.h"
#include "content/public/common/url_utils.h" #include "content/public/common/url_utils.h"
#include "content/public/renderer/browser_plugin_delegate.h"
#include "content/public/renderer/content_renderer_client.h" #include "content/public/renderer/content_renderer_client.h"
#include "content/public/renderer/context_menu_client.h" #include "content/public/renderer/context_menu_client.h"
#include "content/public/renderer/document_state.h" #include "content/public/renderer/document_state.h"
...@@ -1551,7 +1552,7 @@ blink::WebPlugin* RenderFrameImpl::createPlugin( ...@@ -1551,7 +1552,7 @@ blink::WebPlugin* RenderFrameImpl::createPlugin(
if (base::UTF16ToUTF8(params.mimeType) == kBrowserPluginMimeType) { if (base::UTF16ToUTF8(params.mimeType) == kBrowserPluginMimeType) {
return render_view_->GetBrowserPluginManager()->CreateBrowserPlugin( return render_view_->GetBrowserPluginManager()->CreateBrowserPlugin(
render_view_.get(), frame, false); render_view_.get(), frame, scoped_ptr<BrowserPluginDelegate>());
} }
#if defined(ENABLE_PLUGINS) #if defined(ENABLE_PLUGINS)
...@@ -1565,8 +1566,11 @@ blink::WebPlugin* RenderFrameImpl::createPlugin( ...@@ -1565,8 +1566,11 @@ blink::WebPlugin* RenderFrameImpl::createPlugin(
return NULL; return NULL;
if (info.type == content::WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN) { if (info.type == content::WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN) {
scoped_ptr<BrowserPluginDelegate> browser_plugin_delegate(
GetContentClient()->renderer()->CreateBrowserPluginDelegate(
this, base::UTF16ToUTF8(params.mimeType)));
return render_view_->GetBrowserPluginManager()->CreateBrowserPlugin( return render_view_->GetBrowserPluginManager()->CreateBrowserPlugin(
render_view_.get(), frame, true); render_view_.get(), frame, browser_plugin_delegate.Pass());
} }
......
...@@ -298,6 +298,10 @@ source_set("browser") { ...@@ -298,6 +298,10 @@ source_set("browser") {
"guest_view/guest_view_manager.cc", "guest_view/guest_view_manager.cc",
"guest_view/guest_view_manager.h", "guest_view/guest_view_manager.h",
"guest_view/guest_view.h", "guest_view/guest_view.h",
"guest_view/mime_handler_view/mime_handler_view_constants.cc",
"guest_view/mime_handler_view/mime_handler_view_constants.h",
"guest_view/mime_handler_view/mime_handler_view_guest.h",
"guest_view/mime_handler_view/mime_handler_view_guest.cc",
"guest_view/web_view/javascript_dialog_helper.cc", "guest_view/web_view/javascript_dialog_helper.cc",
"guest_view/web_view/javascript_dialog_helper.h", "guest_view/web_view/javascript_dialog_helper.h",
"guest_view/web_view/web_view_constants.cc", "guest_view/web_view/web_view_constants.cc",
......
...@@ -6,13 +6,18 @@ ...@@ -6,13 +6,18 @@
#include "components/crx_file/id_util.h" #include "components/crx_file/id_util.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/render_process_host.h" #include "content/public/browser/render_process_host.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/browser/resource_dispatcher_host.h" #include "content/public/browser/resource_dispatcher_host.h"
#include "extensions/browser/blob_holder.h" #include "extensions/browser/blob_holder.h"
#include "extensions/browser/event_router.h" #include "extensions/browser/event_router.h"
#include "extensions/browser/extension_function_dispatcher.h" #include "extensions/browser/extension_function_dispatcher.h"
#include "extensions/browser/extension_system.h" #include "extensions/browser/extension_system.h"
#include "extensions/browser/guest_view/guest_view_base.h"
#include "extensions/browser/guest_view/guest_view_manager.h" #include "extensions/browser/guest_view/guest_view_manager.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_constants.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
#include "extensions/browser/info_map.h" #include "extensions/browser/info_map.h"
#include "extensions/browser/process_manager.h" #include "extensions/browser/process_manager.h"
#include "extensions/common/extension.h" #include "extensions/common/extension.h"
...@@ -46,6 +51,7 @@ void ExtensionMessageFilter::OverrideThreadForMessage( ...@@ -46,6 +51,7 @@ void ExtensionMessageFilter::OverrideThreadForMessage(
case ExtensionHostMsg_AttachGuest::ID: case ExtensionHostMsg_AttachGuest::ID:
case ExtensionHostMsg_RemoveListener::ID: case ExtensionHostMsg_RemoveListener::ID:
case ExtensionHostMsg_AddLazyListener::ID: case ExtensionHostMsg_AddLazyListener::ID:
case ExtensionHostMsg_CreateMimeHandlerViewGuest::ID:
case ExtensionHostMsg_RemoveLazyListener::ID: case ExtensionHostMsg_RemoveLazyListener::ID:
case ExtensionHostMsg_AddFilteredListener::ID: case ExtensionHostMsg_AddFilteredListener::ID:
case ExtensionHostMsg_RemoveFilteredListener::ID: case ExtensionHostMsg_RemoveFilteredListener::ID:
...@@ -76,6 +82,8 @@ bool ExtensionMessageFilter::OnMessageReceived(const IPC::Message& message) { ...@@ -76,6 +82,8 @@ bool ExtensionMessageFilter::OnMessageReceived(const IPC::Message& message) {
OnExtensionAddLazyListener) OnExtensionAddLazyListener)
IPC_MESSAGE_HANDLER(ExtensionHostMsg_AttachGuest, IPC_MESSAGE_HANDLER(ExtensionHostMsg_AttachGuest,
OnExtensionAttachGuest) OnExtensionAttachGuest)
IPC_MESSAGE_HANDLER(ExtensionHostMsg_CreateMimeHandlerViewGuest,
OnExtensionCreateMimeHandlerViewGuest)
IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveLazyListener, IPC_MESSAGE_HANDLER(ExtensionHostMsg_RemoveLazyListener,
OnExtensionRemoveLazyListener) OnExtensionRemoveLazyListener)
IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddFilteredListener, IPC_MESSAGE_HANDLER(ExtensionHostMsg_AddFilteredListener,
...@@ -155,8 +163,8 @@ void ExtensionMessageFilter::OnExtensionAttachGuest( ...@@ -155,8 +163,8 @@ void ExtensionMessageFilter::OnExtensionAttachGuest(
int guest_instance_id, int guest_instance_id,
const base::DictionaryValue& params) { const base::DictionaryValue& params) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
extensions::GuestViewManager* manager = GuestViewManager* manager =
extensions::GuestViewManager::FromBrowserContext(browser_context_); GuestViewManager::FromBrowserContext(browser_context_);
if (!manager) if (!manager)
return; return;
...@@ -167,6 +175,40 @@ void ExtensionMessageFilter::OnExtensionAttachGuest( ...@@ -167,6 +175,40 @@ void ExtensionMessageFilter::OnExtensionAttachGuest(
params); params);
} }
void ExtensionMessageFilter::OnExtensionCreateMimeHandlerViewGuest(
int render_frame_id,
const std::string& src,
const std::string& mime_type,
int element_instance_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
GuestViewManager* manager =
GuestViewManager::FromBrowserContext(browser_context_);
if (!manager)
return;
content::RenderFrameHost* rfh =
content::RenderFrameHost::FromID(render_process_id_, render_frame_id);
content::WebContents* embedder_web_contents =
content::WebContents::FromRenderFrameHost(rfh);
if (!embedder_web_contents)
return;
GuestViewManager::WebContentsCreatedCallback callback =
base::Bind(&ExtensionMessageFilter::MimeHandlerViewGuestCreatedCallback,
this,
element_instance_id,
render_process_id_,
render_frame_id,
src);
base::DictionaryValue create_params;
create_params.SetString(mime_handler_view::kMimeType, mime_type);
manager->CreateGuest(MimeHandlerViewGuest::Type,
"",
embedder_web_contents,
create_params,
callback);
}
void ExtensionMessageFilter::OnExtensionRemoveLazyListener( void ExtensionMessageFilter::OnExtensionRemoveLazyListener(
const std::string& extension_id, const std::string& event_name) { const std::string& extension_id, const std::string& event_name) {
EventRouter* router = EventRouter::Get(browser_context_); EventRouter* router = EventRouter::Get(browser_context_);
...@@ -252,4 +294,40 @@ void ExtensionMessageFilter::OnExtensionRequestForIOThread( ...@@ -252,4 +294,40 @@ void ExtensionMessageFilter::OnExtensionRequestForIOThread(
params); params);
} }
void ExtensionMessageFilter::MimeHandlerViewGuestCreatedCallback(
int element_instance_id,
int embedder_render_process_id,
int embedder_render_frame_id,
const std::string& src,
content::WebContents* web_contents) {
GuestViewManager* manager =
GuestViewManager::FromBrowserContext(browser_context_);
if (!manager)
return;
MimeHandlerViewGuest* guest_view =
MimeHandlerViewGuest::FromWebContents(web_contents);
if (!guest_view)
return;
int guest_instance_id = guest_view->guest_instance_id();
content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
embedder_render_process_id, embedder_render_frame_id);
if (!rfh)
return;
base::DictionaryValue attach_params;
attach_params.SetString(mime_handler_view::kSrc, src);
manager->AttachGuest(embedder_render_process_id,
rfh->GetRenderViewHost()->GetRoutingID(),
element_instance_id,
guest_instance_id,
attach_params);
IPC::Message* msg =
new ExtensionMsg_CreateMimeHandlerViewGuestACK(element_instance_id);
msg->set_routing_id(rfh->GetRoutingID());
rfh->Send(msg);
}
} // namespace extensions } // namespace extensions
...@@ -22,6 +22,7 @@ class DictionaryValue; ...@@ -22,6 +22,7 @@ class DictionaryValue;
namespace content { namespace content {
class BrowserContext; class BrowserContext;
class WebContents;
} }
namespace extensions { namespace extensions {
...@@ -64,6 +65,10 @@ class ExtensionMessageFilter : public content::BrowserMessageFilter { ...@@ -64,6 +65,10 @@ class ExtensionMessageFilter : public content::BrowserMessageFilter {
int element_instance_id, int element_instance_id,
int guest_instance_id, int guest_instance_id,
const base::DictionaryValue& attach_params); const base::DictionaryValue& attach_params);
void OnExtensionCreateMimeHandlerViewGuest(int render_frame_id,
const std::string& url,
const std::string& mime_type,
int element_instance_id);
void OnExtensionRemoveLazyListener(const std::string& extension_id, void OnExtensionRemoveLazyListener(const std::string& extension_id,
const std::string& event_name); const std::string& event_name);
void OnExtensionAddFilteredListener(const std::string& extension_id, void OnExtensionAddFilteredListener(const std::string& extension_id,
...@@ -86,6 +91,13 @@ class ExtensionMessageFilter : public content::BrowserMessageFilter { ...@@ -86,6 +91,13 @@ class ExtensionMessageFilter : public content::BrowserMessageFilter {
int routing_id, int routing_id,
const ExtensionHostMsg_Request_Params& params); const ExtensionHostMsg_Request_Params& params);
// Runs on UI thread.
void MimeHandlerViewGuestCreatedCallback(int element_instance_id,
int embedder_render_process_id,
int embedder_render_frame_id,
const std::string& src,
content::WebContents* web_contents);
const int render_process_id_; const int render_process_id_;
// Should only be accessed on the UI thread. // Should only be accessed on the UI thread.
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
#include "extensions/browser/guest_view/app_view/app_view_guest.h" #include "extensions/browser/guest_view/app_view/app_view_guest.h"
#include "extensions/browser/guest_view/guest_view_constants.h" #include "extensions/browser/guest_view/guest_view_constants.h"
#include "extensions/browser/guest_view/guest_view_manager.h" #include "extensions/browser/guest_view/guest_view_manager.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
#include "extensions/browser/guest_view/web_view/web_view_guest.h" #include "extensions/browser/guest_view/web_view/web_view_guest.h"
#include "extensions/browser/process_map.h" #include "extensions/browser/process_map.h"
#include "extensions/common/features/feature.h" #include "extensions/common/features/feature.h"
...@@ -459,6 +460,7 @@ void GuestViewBase::CompleteInit(const std::string& embedder_extension_id, ...@@ -459,6 +460,7 @@ void GuestViewBase::CompleteInit(const std::string& embedder_extension_id,
// static // static
void GuestViewBase::RegisterGuestViewTypes() { void GuestViewBase::RegisterGuestViewTypes() {
AppViewGuest::Register(); AppViewGuest::Register();
MimeHandlerViewGuest::Register();
WebViewGuest::Register(); WebViewGuest::Register();
ExtensionsAPIClient::Get()->RegisterGuestViewTypes(); ExtensionsAPIClient::Get()->RegisterGuestViewTypes();
} }
......
// 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 "extensions/browser/guest_view/mime_handler_view/mime_handler_view_constants.h"
namespace mime_handler_view {
const char kMimeType[] = "mimeType";
const char kSrc[] = "src";
} // namespace mime_handler_view
// 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.
// Constants used by MimeHandlerView..
#ifndef EXTENSIONS_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_MIME_HANDLER_VIEW_CONSTANTS_H_
#define EXTENSIONS_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_MIME_HANDLER_VIEW_CONSTANTS_H_
namespace mime_handler_view {
extern const char kMimeType[];
extern const char kSrc[];
} // namespace mime_handler_view
#endif // EXTENSIONS_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_MIME_HANDLER_VIEW_CONSTANTS_H_
// 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 "extensions/browser/guest_view/mime_handler_view/mime_handler_view_guest.h"
#include "base/strings/stringprintf.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_process_host.h"
#include "content/public/common/url_constants.h"
#include "extensions/browser/guest_view/guest_view_constants.h"
#include "extensions/browser/guest_view/guest_view_manager.h"
#include "extensions/browser/guest_view/mime_handler_view/mime_handler_view_constants.h"
#include "extensions/common/feature_switch.h"
#include "extensions/strings/grit/extensions_strings.h"
#include "net/base/url_util.h"
using content::WebContents;
namespace extensions {
// static
const char MimeHandlerViewGuest::Type[] = "mimehandler";
// static
GuestViewBase* MimeHandlerViewGuest::Create(
content::BrowserContext* browser_context,
int guest_instance_id) {
if (!extensions::FeatureSwitch::mime_handler_view()->IsEnabled())
return NULL;
return new MimeHandlerViewGuest(browser_context, guest_instance_id);
}
MimeHandlerViewGuest::MimeHandlerViewGuest(
content::BrowserContext* browser_context,
int guest_instance_id)
: GuestView<MimeHandlerViewGuest>(browser_context, guest_instance_id) {
}
MimeHandlerViewGuest::~MimeHandlerViewGuest() {
}
const char* MimeHandlerViewGuest::GetAPINamespace() const {
return "mimeHandlerViewGuestInternal";
}
int MimeHandlerViewGuest::GetTaskPrefix() const {
return IDS_EXTENSION_TASK_MANAGER_MIMEHANDLERVIEW_TAG_PREFIX;
}
void MimeHandlerViewGuest::CreateWebContents(
const std::string& embedder_extension_id,
int embedder_render_process_id,
const base::DictionaryValue& create_params,
const WebContentsCreatedCallback& callback) {
std::string orig_mime_type;
DCHECK(
create_params.GetString(mime_handler_view::kMimeType, &orig_mime_type) &&
!orig_mime_type.empty());
std::string guest_site_str;
// Note that we put a prefix "mime-" before the mime type so that this
// can never collide with an extension ID.
guest_site_str = base::StringPrintf(
"%s://mime-%s", content::kGuestScheme, orig_mime_type.c_str());
GURL guest_site(guest_site_str);
// If we already have a mime handler view for the same mime type, we should
// use the same SiteInstance so they go under same process.
GuestViewManager* guest_view_manager =
GuestViewManager::FromBrowserContext(browser_context());
content::SiteInstance* guest_site_instance =
guest_view_manager->GetGuestSiteInstance(guest_site);
if (!guest_site_instance) {
// Create the SiteInstance in a new BrowsingInstance, which will ensure
// that guests from different render process are not allowed to send
// messages to each other.
guest_site_instance =
content::SiteInstance::CreateForURL(browser_context(), guest_site);
}
WebContents::CreateParams params(browser_context(), guest_site_instance);
params.guest_delegate = this;
callback.Run(WebContents::Create(params));
}
void MimeHandlerViewGuest::DidAttachToEmbedder() {
std::string src;
DCHECK(attach_params()->GetString(mime_handler_view::kSrc, &src) &&
!src.empty());
web_contents()->GetController().LoadURL(
GURL(src),
content::Referrer(),
content::PAGE_TRANSITION_AUTO_TOPLEVEL,
std::string());
}
} // namespace extensions
// 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 EXTENSIONS_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_MIME_HANDLER_VIEW_GUEST_H_
#define EXTENSIONS_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_MIME_HANDLER_VIEW_GUEST_H_
#include "extensions/browser/guest_view/guest_view.h"
namespace extensions {
class MimeHandlerViewGuest : public GuestView<MimeHandlerViewGuest> {
public:
static GuestViewBase* Create(content::BrowserContext* browser_context,
int guest_instance_id);
static const char Type[];
// GuestViewBase implementation.
virtual const char* GetAPINamespace() const OVERRIDE;
virtual int GetTaskPrefix() const OVERRIDE;
virtual void CreateWebContents(
const std::string& embedder_extension_id,
int embedder_render_process_id,
const base::DictionaryValue& create_params,
const WebContentsCreatedCallback& callback) OVERRIDE;
virtual void DidAttachToEmbedder() OVERRIDE;
private:
MimeHandlerViewGuest(content::BrowserContext* browser_context,
int guest_instance_id);
virtual ~MimeHandlerViewGuest();
DISALLOW_COPY_AND_ASSIGN(MimeHandlerViewGuest);
};
} // namespace extensions
#endif // EXTENSIONS_BROWSER_GUEST_VIEW_MIME_HANDLER_VIEW_MIME_HANDLER_VIEW_GUEST_H_
// 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.
[
{
"namespace": "mimeHandlerViewGuestInternal",
"description": "Placeholder for mime handler view guest API, currently unused."
}
]
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
'extension_types.json', 'extension_types.json',
'guest_view_internal.json', 'guest_view_internal.json',
'hid.idl', 'hid.idl',
'mime_handler_view_guest_internal.json',
'power.idl', 'power.idl',
'runtime.json', 'runtime.json',
'serial.idl', 'serial.idl',
......
...@@ -512,6 +512,10 @@ IPC_MESSAGE_CONTROL1(ExtensionMsg_WatchPages, ...@@ -512,6 +512,10 @@ IPC_MESSAGE_CONTROL1(ExtensionMsg_WatchPages,
IPC_MESSAGE_CONTROL1(ExtensionMsg_TransferBlobs, IPC_MESSAGE_CONTROL1(ExtensionMsg_TransferBlobs,
std::vector<std::string> /* blob_uuids */) std::vector<std::string> /* blob_uuids */)
// The ACK for ExtensionHostMsg_CreateMimeHandlerViewGuest.
IPC_MESSAGE_CONTROL1(ExtensionMsg_CreateMimeHandlerViewGuestACK,
int /* element_instance_id */)
// Messages sent from the renderer to the browser. // Messages sent from the renderer to the browser.
// A renderer sends this message when an extension process starts an API // A renderer sends this message when an extension process starts an API
...@@ -733,3 +737,10 @@ IPC_MESSAGE_CONTROL4(ExtensionHostMsg_AttachGuest, ...@@ -733,3 +737,10 @@ IPC_MESSAGE_CONTROL4(ExtensionHostMsg_AttachGuest,
int /* element_instance_id */, int /* element_instance_id */,
int /* guest_instance_id */, int /* guest_instance_id */,
base::DictionaryValue /* attach_params */) base::DictionaryValue /* attach_params */)
// Tells the browser to create a mime handler guest view for a plugin.
IPC_MESSAGE_CONTROL4(ExtensionHostMsg_CreateMimeHandlerViewGuest,
int /* render_frame_id */,
std::string /* embedder_url */,
std::string /* mime_type */,
int /* element_instance_id */)
...@@ -45,7 +45,9 @@ class CommonSwitches { ...@@ -45,7 +45,9 @@ class CommonSwitches {
switches::kEmbeddedExtensionOptions, switches::kEmbeddedExtensionOptions,
FeatureSwitch::DEFAULT_DISABLED), FeatureSwitch::DEFAULT_DISABLED),
app_view(switches::kAppView, app_view(switches::kAppView,
FeatureSwitch::DEFAULT_DISABLED) {} FeatureSwitch::DEFAULT_DISABLED),
mime_handler_view(switches::kMimeHandlerView,
FeatureSwitch::DEFAULT_DISABLED) {}
// Enables extensions to be easily installed from sites other than the web // Enables extensions to be easily installed from sites other than the web
// store. // store.
...@@ -63,6 +65,7 @@ class CommonSwitches { ...@@ -63,6 +65,7 @@ class CommonSwitches {
FeatureSwitch scripts_require_action; FeatureSwitch scripts_require_action;
FeatureSwitch embedded_extension_options; FeatureSwitch embedded_extension_options;
FeatureSwitch app_view; FeatureSwitch app_view;
FeatureSwitch mime_handler_view;
}; };
base::LazyInstance<CommonSwitches> g_common_switches = base::LazyInstance<CommonSwitches> g_common_switches =
...@@ -97,6 +100,9 @@ FeatureSwitch* FeatureSwitch::embedded_extension_options() { ...@@ -97,6 +100,9 @@ FeatureSwitch* FeatureSwitch::embedded_extension_options() {
FeatureSwitch* FeatureSwitch::app_view() { FeatureSwitch* FeatureSwitch::app_view() {
return &g_common_switches.Get().app_view; return &g_common_switches.Get().app_view;
} }
FeatureSwitch* FeatureSwitch::mime_handler_view() {
return &g_common_switches.Get().mime_handler_view;
}
FeatureSwitch::ScopedOverride::ScopedOverride(FeatureSwitch* feature, FeatureSwitch::ScopedOverride::ScopedOverride(FeatureSwitch* feature,
bool override_value) bool override_value)
......
...@@ -28,6 +28,7 @@ class FeatureSwitch { ...@@ -28,6 +28,7 @@ class FeatureSwitch {
static FeatureSwitch* scripts_require_action(); static FeatureSwitch* scripts_require_action();
static FeatureSwitch* embedded_extension_options(); static FeatureSwitch* embedded_extension_options();
static FeatureSwitch* app_view(); static FeatureSwitch* app_view();
static FeatureSwitch* mime_handler_view();
enum DefaultValue { enum DefaultValue {
DEFAULT_ENABLED, DEFAULT_ENABLED,
......
...@@ -49,6 +49,10 @@ const char kEnableExperimentalExtensionApis[] = ...@@ -49,6 +49,10 @@ const char kEnableExperimentalExtensionApis[] =
const char kEnableExtensionActionRedesign[] = const char kEnableExtensionActionRedesign[] =
"enable-extension-action-redesign"; "enable-extension-action-redesign";
// Hack so that feature switch can work with about_flags. See
// kEnableScriptsRequireAction.
const char kEnableMimeHandlerView[] = "enable-mime-handler-view";
// Enables extensions to hide bookmarks UI elements. // Enables extensions to hide bookmarks UI elements.
const char kEnableOverrideBookmarksUI[] = "enable-override-bookmarks-ui"; const char kEnableOverrideBookmarksUI[] = "enable-override-bookmarks-ui";
...@@ -78,6 +82,9 @@ const char kExtensionsOnChromeURLs[] = "extensions-on-chrome-urls"; ...@@ -78,6 +82,9 @@ const char kExtensionsOnChromeURLs[] = "extensions-on-chrome-urls";
// Whether to force developer mode extensions highlighting. // Whether to force developer mode extensions highlighting.
const char kForceDevModeHighlighting[] = "force-dev-mode-highlighting"; const char kForceDevModeHighlighting[] = "force-dev-mode-highlighting";
// Whether or not mime handler view guests are enabled.
const char kMimeHandlerView[] = "mime-handler-view";
// Notify the user and require consent for extensions running scripts. // Notify the user and require consent for extensions running scripts.
// Appending --scripts-require-action=1 has the same effect as // Appending --scripts-require-action=1 has the same effect as
// --enable-scripts-require-action (see below). // --enable-scripts-require-action (see below).
......
...@@ -21,6 +21,7 @@ extern const char kEnableAppWindowControls[]; ...@@ -21,6 +21,7 @@ extern const char kEnableAppWindowControls[];
extern const char kEnableEmbeddedExtensionOptions[]; extern const char kEnableEmbeddedExtensionOptions[];
extern const char kEnableExperimentalExtensionApis[]; extern const char kEnableExperimentalExtensionApis[];
extern const char kEnableExtensionActionRedesign[]; extern const char kEnableExtensionActionRedesign[];
extern const char kEnableMimeHandlerView[];
extern const char kEnableOverrideBookmarksUI[]; extern const char kEnableOverrideBookmarksUI[];
extern const char kErrorConsole[]; extern const char kErrorConsole[];
extern const char kEventPageIdleTime[]; extern const char kEventPageIdleTime[];
...@@ -29,6 +30,7 @@ extern const char kExtensionActionRedesign[]; ...@@ -29,6 +30,7 @@ extern const char kExtensionActionRedesign[];
extern const char kExtensionProcess[]; extern const char kExtensionProcess[];
extern const char kExtensionsOnChromeURLs[]; extern const char kExtensionsOnChromeURLs[];
extern const char kForceDevModeHighlighting[]; extern const char kForceDevModeHighlighting[];
extern const char kMimeHandlerView[];
extern const char kScriptsRequireAction[]; extern const char kScriptsRequireAction[];
extern const char kEnableScriptsRequireAction[]; extern const char kEnableScriptsRequireAction[];
extern const char kShowComponentExtensionOptions[]; extern const char kShowComponentExtensionOptions[];
......
...@@ -560,6 +560,10 @@ ...@@ -560,6 +560,10 @@
'browser/guest_view/guest_view_manager.cc', 'browser/guest_view/guest_view_manager.cc',
'browser/guest_view/guest_view_manager.h', 'browser/guest_view/guest_view_manager.h',
'browser/guest_view/guest_view.h', 'browser/guest_view/guest_view.h',
'browser/guest_view/mime_handler_view/mime_handler_view_constants.cc',
'browser/guest_view/mime_handler_view/mime_handler_view_constants.h',
'browser/guest_view/mime_handler_view/mime_handler_view_guest.cc',
'browser/guest_view/mime_handler_view/mime_handler_view_guest.h',
'browser/guest_view/web_view/javascript_dialog_helper.cc', 'browser/guest_view/web_view/javascript_dialog_helper.cc',
'browser/guest_view/web_view/javascript_dialog_helper.h', 'browser/guest_view/web_view/javascript_dialog_helper.h',
'browser/guest_view/web_view/web_view_constants.cc', 'browser/guest_view/web_view/web_view_constants.cc',
......
...@@ -311,6 +311,9 @@ ...@@ -311,6 +311,9 @@
<message name="IDS_EXTENSION_TASK_MANAGER_EXTENSIONOPTIONS_TAG_PREFIX" desc="The prefix for a guest page loaded in an extensionoptions tag in the Task Manager"> <message name="IDS_EXTENSION_TASK_MANAGER_EXTENSIONOPTIONS_TAG_PREFIX" desc="The prefix for a guest page loaded in an extensionoptions tag in the Task Manager">
Options: <ph name="EXTENSIONOPTIONS_TAG_NAME">$1<ex>Google Hangouts</ex></ph> Options: <ph name="EXTENSIONOPTIONS_TAG_NAME">$1<ex>Google Hangouts</ex></ph>
</message> </message>
<message name="IDS_EXTENSION_TASK_MANAGER_MIMEHANDLERVIEW_TAG_PREFIX" desc="The prefix for a guest page loaded in a mime handler view page in the task manager">
Mimehandler: <ph name="MIMEHANDLERVIEW_TAG_NAME">$1<ex>My mime handler view</ex></ph>
</message>
<message name="IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX" desc="The prefix for a guest page loaded in a webview tag in the Task Manager"> <message name="IDS_EXTENSION_TASK_MANAGER_WEBVIEW_TAG_PREFIX" desc="The prefix for a guest page loaded in a webview tag in the Task Manager">
Webview: <ph name="WEBVIEW_TAG_NAME">$1<ex>Google</ex></ph> Webview: <ph name="WEBVIEW_TAG_NAME">$1<ex>Google</ex></ph>
</message> </message>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment