diff options
author | zork@chromium.org <zork@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-11 07:47:07 +0000 |
---|---|---|
committer | zork@chromium.org <zork@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-04-11 07:47:07 +0000 |
commit | dbebd54f13fa149507a929d94a2bf5bc07317c77 (patch) | |
tree | 357c8ab32d31486037422a4f9719979bdf69a7b4 | |
parent | 02d57a61080179535f028d63483ccdf10de5e003 (diff) | |
download | chromium_src-dbebd54f13fa149507a929d94a2bf5bc07317c77.zip chromium_src-dbebd54f13fa149507a929d94a2bf5bc07317c77.tar.gz chromium_src-dbebd54f13fa149507a929d94a2bf5bc07317c77.tar.bz2 |
Support new plugin type in BrowserPlugin that navigates to a set URL.
BUG=351835
Review URL: https://codereview.chromium.org/226473006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@263181 0039d316-1c4b-4281-b951-d872f2087c98
14 files changed, 69 insertions, 16 deletions
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 1e87a41..d867cd158 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -5591,6 +5591,9 @@ Keep your key file in a safe place. You will need it to create new versions of y <message name="IDS_PLUGINS_PPAPI_UNSANDBOXED" desc="Text that indicates the plugin is an unsandboxed out-of-process PPAPI plugin."> PPAPI (unsandboxed) </message> + <message name="IDS_PLUGINS_BROWSER_PLUGIN" desc="Text that indicates the plugin is a browser plugin."> + BROWSER PLUGIN + </message> </if> <!-- about:flags --> diff --git a/chrome/browser/ui/webui/plugins_ui.cc b/chrome/browser/ui/webui/plugins_ui.cc index dd38da0..3dac5cb 100644 --- a/chrome/browser/ui/webui/plugins_ui.cc +++ b/chrome/browser/ui/webui/plugins_ui.cc @@ -119,6 +119,8 @@ base::string16 PluginTypeToString(int type) { return l10n_util::GetStringUTF16(IDS_PLUGINS_PPAPI_OUT_OF_PROCESS); case WebPluginInfo::PLUGIN_TYPE_PEPPER_UNSANDBOXED: return l10n_util::GetStringUTF16(IDS_PLUGINS_PPAPI_UNSANDBOXED); + case WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN: + return l10n_util::GetStringUTF16(IDS_PLUGINS_BROWSER_PLUGIN); } NOTREACHED(); return base::string16(); diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index 77d6c34..22b207c6 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc @@ -494,6 +494,9 @@ bool ChromeContentRendererClient::OverrideCreatePlugin( render_frame->Send(new ChromeViewHostMsg_GetPluginInfo( render_frame->GetRoutingID(), GURL(params.url), frame->top()->document().url(), orig_mime_type, &output)); + + if (output.plugin.type == content::WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN) + return false; #else output.status.value = ChromeViewHostMsg_GetPluginInfo_Status::kNotFound; #endif diff --git a/content/public/common/webplugininfo.h b/content/public/common/webplugininfo.h index 75b4033..2912cef 100644 --- a/content/public/common/webplugininfo.h +++ b/content/public/common/webplugininfo.h @@ -47,7 +47,8 @@ struct CONTENT_EXPORT WebPluginInfo { PLUGIN_TYPE_NPAPI, PLUGIN_TYPE_PEPPER_IN_PROCESS, PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS, - PLUGIN_TYPE_PEPPER_UNSANDBOXED + PLUGIN_TYPE_PEPPER_UNSANDBOXED, + PLUGIN_TYPE_BROWSER_PLUGIN }; WebPluginInfo(); diff --git a/content/renderer/browser_plugin/browser_plugin.cc b/content/renderer/browser_plugin/browser_plugin.cc index 3f9d3af..faf2e00 100644 --- a/content/renderer/browser_plugin/browser_plugin.cc +++ b/content/renderer/browser_plugin/browser_plugin.cc @@ -55,6 +55,8 @@ namespace content { namespace { +const char* kCustomPersistPartition = "persist:custom_plugin"; + static std::string GetInternalEventName(const char* event_name) { return base::StringPrintf("-internal-%s", event_name); } @@ -67,7 +69,8 @@ static base::LazyInstance<PluginContainerMap> g_plugin_container_map = } // namespace BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view, - blink::WebFrame* frame) + blink::WebFrame* frame, + bool auto_navigate) : guest_instance_id_(browser_plugin::kInstanceIDNone), attached_(false), render_view_(render_view->AsWeakPtr()), @@ -84,6 +87,7 @@ BrowserPlugin::BrowserPlugin(RenderViewImpl* render_view, content_window_routing_id_(MSG_ROUTING_NONE), plugin_focused_(false), visible_(true), + auto_navigate_(auto_navigate), before_first_navigation_(true), mouse_locked_(false), browser_plugin_manager_(render_view->GetBrowserPluginManager()), @@ -380,6 +384,12 @@ void BrowserPlugin::OnInstanceIDAllocated(int guest_instance_id) { guest_instance_id_ = guest_instance_id; browser_plugin_manager()->AddBrowserPlugin(guest_instance_id, this); + if (auto_navigate_) { + scoped_ptr<base::DictionaryValue> params(new base::DictionaryValue()); + Attach(params.Pass()); + return; + } + std::map<std::string, base::Value*> props; props[browser_plugin::kWindowID] = new base::FundamentalValue(guest_instance_id); @@ -750,7 +760,11 @@ bool BrowserPlugin::ParsePartitionAttribute(std::string* error_message) { return false; } - std::string input = GetPartitionAttribute(); + std::string input; + if (auto_navigate_) + input = kCustomPersistPartition; + else + input = GetPartitionAttribute(); // Since the "persist:" prefix is in ASCII, StartsWith will work fine on // UTF-8 encoded |partition_id|. If the prefix is a match, we can safely @@ -890,7 +904,8 @@ bool BrowserPlugin::initialize(WebPluginContainer* container) { if (!container) return false; - if (!GetContentClient()->renderer()->AllowBrowserPlugin(container)) + if (!GetContentClient()->renderer()->AllowBrowserPlugin(container) && + !auto_navigate_) return false; // Tell |container| to allow this plugin to use script objects. @@ -1277,9 +1292,17 @@ void BrowserPlugin::didReceiveResponse( } void BrowserPlugin::didReceiveData(const char* data, int data_length) { + if (auto_navigate_) { + std::string value(data, data_length); + html_string_ += value; + } } void BrowserPlugin::didFinishLoading() { + if (auto_navigate_) { + UpdateDOMAttribute(content::browser_plugin::kAttributeSrc, html_string_); + ParseAttributes(); + } } void BrowserPlugin::didFailLoading(const blink::WebURLError& error) { diff --git a/content/renderer/browser_plugin/browser_plugin.h b/content/renderer/browser_plugin/browser_plugin.h index 8079210..1325ac4 100644 --- a/content/renderer/browser_plugin/browser_plugin.h +++ b/content/renderer/browser_plugin/browser_plugin.h @@ -214,7 +214,9 @@ class CONTENT_EXPORT BrowserPlugin : // does an initial navigation or is attached to a newly created guest, it // acquires a guest_instance_id as well. The guest instance ID uniquely // identifies a guest WebContents that's hosted by this BrowserPlugin. - BrowserPlugin(RenderViewImpl* render_view, blink::WebFrame* frame); + BrowserPlugin(RenderViewImpl* render_view, + blink::WebFrame* frame, + bool auto_navigate); virtual ~BrowserPlugin(); @@ -340,6 +342,9 @@ class CONTENT_EXPORT BrowserPlugin : // embedder RenderView's visibility. bool visible_; + bool auto_navigate_; + std::string html_string_; + WebCursor cursor_; gfx::Size last_view_size_; diff --git a/content/renderer/browser_plugin/browser_plugin_manager.h b/content/renderer/browser_plugin/browser_plugin_manager.h index 8a57c3d..1f71ea6 100644 --- a/content/renderer/browser_plugin/browser_plugin_manager.h +++ b/content/renderer/browser_plugin/browser_plugin_manager.h @@ -45,7 +45,9 @@ class CONTENT_EXPORT BrowserPluginManager // BrowserPluginManager via AddBrowserPlugin. When it is destroyed, it is // responsible for removing its association via RemoveBrowserPlugin. virtual BrowserPlugin* CreateBrowserPlugin( - RenderViewImpl* render_view, blink::WebFrame* frame) = 0; + RenderViewImpl* render_view, + blink::WebFrame* frame, + bool auto_navigate) = 0; // Asynchronously requests a new browser-process-allocated instance ID. // After the browser process allocates an ID, it calls back into the diff --git a/content/renderer/browser_plugin/browser_plugin_manager_impl.cc b/content/renderer/browser_plugin/browser_plugin_manager_impl.cc index d084148..4f0bed0 100644 --- a/content/renderer/browser_plugin/browser_plugin_manager_impl.cc +++ b/content/renderer/browser_plugin/browser_plugin_manager_impl.cc @@ -24,8 +24,9 @@ BrowserPluginManagerImpl::~BrowserPluginManagerImpl() { BrowserPlugin* BrowserPluginManagerImpl::CreateBrowserPlugin( RenderViewImpl* render_view, - blink::WebFrame* frame) { - return new BrowserPlugin(render_view, frame); + blink::WebFrame* frame, + bool auto_navigate) { + return new BrowserPlugin(render_view, frame, auto_navigate); } void BrowserPluginManagerImpl::AllocateInstanceID( diff --git a/content/renderer/browser_plugin/browser_plugin_manager_impl.h b/content/renderer/browser_plugin/browser_plugin_manager_impl.h index bc47cc8..2ed4135 100644 --- a/content/renderer/browser_plugin/browser_plugin_manager_impl.h +++ b/content/renderer/browser_plugin/browser_plugin_manager_impl.h @@ -23,7 +23,8 @@ class BrowserPluginManagerImpl : public BrowserPluginManager { // BrowserPluginManager implementation. virtual BrowserPlugin* CreateBrowserPlugin( RenderViewImpl* render_view, - blink::WebFrame* frame) OVERRIDE; + blink::WebFrame* frame, + bool auto_navigate) OVERRIDE; virtual void AllocateInstanceID( const base::WeakPtr<BrowserPlugin>& browser_plugin) OVERRIDE; diff --git a/content/renderer/browser_plugin/mock_browser_plugin.cc b/content/renderer/browser_plugin/mock_browser_plugin.cc index a19d0aa..1d7df15 100644 --- a/content/renderer/browser_plugin/mock_browser_plugin.cc +++ b/content/renderer/browser_plugin/mock_browser_plugin.cc @@ -8,8 +8,9 @@ namespace content { MockBrowserPlugin::MockBrowserPlugin(RenderViewImpl* render_view, - blink::WebFrame* frame) - : BrowserPlugin(render_view, frame) { + blink::WebFrame* frame, + bool auto_navigate) + : BrowserPlugin(render_view, frame, auto_navigate) { } MockBrowserPlugin::~MockBrowserPlugin() {} diff --git a/content/renderer/browser_plugin/mock_browser_plugin.h b/content/renderer/browser_plugin/mock_browser_plugin.h index ee0f554..c0d70a4 100644 --- a/content/renderer/browser_plugin/mock_browser_plugin.h +++ b/content/renderer/browser_plugin/mock_browser_plugin.h @@ -12,7 +12,8 @@ namespace content { class MockBrowserPlugin : public BrowserPlugin { public: MockBrowserPlugin(RenderViewImpl* render_view, - blink::WebFrame* frame); + blink::WebFrame* frame, + bool auto_navigate); virtual ~MockBrowserPlugin(); diff --git a/content/renderer/browser_plugin/mock_browser_plugin_manager.cc b/content/renderer/browser_plugin/mock_browser_plugin_manager.cc index 4a60686..197930e 100644 --- a/content/renderer/browser_plugin/mock_browser_plugin_manager.cc +++ b/content/renderer/browser_plugin/mock_browser_plugin_manager.cc @@ -21,8 +21,10 @@ MockBrowserPluginManager::~MockBrowserPluginManager() { } BrowserPlugin* MockBrowserPluginManager::CreateBrowserPlugin( - RenderViewImpl* render_view, blink::WebFrame* frame) { - return new MockBrowserPlugin(render_view, frame); + RenderViewImpl* render_view, + blink::WebFrame* frame, + bool auto_navigate) { + return new MockBrowserPlugin(render_view, frame, auto_navigate); } void MockBrowserPluginManager::AllocateInstanceID( diff --git a/content/renderer/browser_plugin/mock_browser_plugin_manager.h b/content/renderer/browser_plugin/mock_browser_plugin_manager.h index 83d55a5..1ec85e3 100644 --- a/content/renderer/browser_plugin/mock_browser_plugin_manager.h +++ b/content/renderer/browser_plugin/mock_browser_plugin_manager.h @@ -19,7 +19,9 @@ class MockBrowserPluginManager : public BrowserPluginManager { // BrowserPluginManager implementation. virtual BrowserPlugin* CreateBrowserPlugin( - RenderViewImpl* render_view, blink::WebFrame* frame) OVERRIDE; + RenderViewImpl* render_view, + blink::WebFrame* frame, + bool auto_navigate) OVERRIDE; virtual void AllocateInstanceID( const base::WeakPtr<BrowserPlugin>& browser_plugin) OVERRIDE; diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index b95f4a8..b011a7b 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -1212,7 +1212,7 @@ blink::WebPlugin* RenderFrameImpl::createPlugin( if (base::UTF16ToASCII(params.mimeType) == kBrowserPluginMimeType) { return render_view_->GetBrowserPluginManager()->CreateBrowserPlugin( - render_view_.get(), frame); + render_view_.get(), frame, false); } #if defined(ENABLE_PLUGINS) @@ -1225,6 +1225,12 @@ blink::WebPlugin* RenderFrameImpl::createPlugin( if (!found) return NULL; + if (info.type == content::WebPluginInfo::PLUGIN_TYPE_BROWSER_PLUGIN) { + return render_view_->GetBrowserPluginManager()->CreateBrowserPlugin( + render_view_.get(), frame, true); + } + + WebPluginParams params_to_use = params; params_to_use.mimeType = WebString::fromUTF8(mime_type); return CreatePlugin(frame, info, params_to_use); |