Index: chrome/browser/plugins/plugin_info_message_filter.cc |
diff --git a/chrome/browser/plugins/plugin_info_message_filter.cc b/chrome/browser/plugins/plugin_info_message_filter.cc |
index 634e4bc6dfde697fc60249ae0e4e95af09e57b26..14b9a0ffe41a914bec385b0ce2d3d1f75cd914d7 100644 |
--- a/chrome/browser/plugins/plugin_info_message_filter.cc |
+++ b/chrome/browser/plugins/plugin_info_message_filter.cc |
@@ -11,6 +11,9 @@ |
#include "base/strings/utf_string_conversions.h" |
#include "chrome/browser/content_settings/content_settings_utils.h" |
#include "chrome/browser/content_settings/host_content_settings_map.h" |
+#include "chrome/browser/guest_view/guest_view_manager.h" |
+#include "chrome/browser/guest_view/mime_handler_view/mime_handler_view_guest.h" |
+#include "chrome/browser/guest_view/web_view/web_view_guest.h" |
#include "chrome/browser/plugins/chrome_plugin_service_filter.h" |
#include "chrome/browser/plugins/plugin_finder.h" |
#include "chrome/browser/plugins/plugin_metadata.h" |
@@ -20,9 +23,11 @@ |
#include "chrome/common/content_settings.h" |
#include "chrome/common/pref_names.h" |
#include "chrome/common/render_messages.h" |
+#include "content/common/browser_plugin/browser_plugin_constants.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/plugin_service.h" |
#include "content/public/browser/plugin_service_filter.h" |
+#include "content/public/common/webplugininfo.h" |
#include "url/gurl.h" |
#include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. |
@@ -90,6 +95,7 @@ PluginInfoMessageFilter::PluginInfoMessageFilter( |
Profile* profile) |
: BrowserMessageFilter(ChromeMsgStart), |
context_(render_process_id, profile), |
+ profile_(profile), |
weak_ptr_factory_(this) { |
} |
@@ -124,6 +130,56 @@ struct PluginInfoMessageFilter::GetPluginInfo_Params { |
std::string mime_type; |
}; |
+void PluginInfoMessageFilter::CreateGuestOnUI( |
+ Profile* profile, |
+ int render_process_id, |
+ GURL top_origin_url, |
+ scoped_ptr<ChromeViewHostMsg_GetPluginInfo_Output> output, |
+ IPC::Message* reply_msg) { |
+ GuestViewManager* guest_view_manager = |
+ GuestViewManager::FromBrowserContext(profile); |
+ DCHECK(guest_view_manager); |
+ base::DictionaryValue create_params; |
+ guest_view_manager->CreateGuest( |
+ MimeHandlerViewGuest::Type, |
+ // TODO(lazyboy): CreateGuest should take GURL instead of std::string. |
+ top_origin_url.possibly_invalid_spec(), |
Fady Samuel
2014/07/21 14:47:35
CreateGuest doesn't take a URL. It takes in an ext
lazyboy
2014/07/21 17:28:21
Right.
For mime handler view, we don't have an ext
|
+ render_process_id, |
+ create_params, |
+ base::Bind(&PluginInfoMessageFilter::GuestCreatedOnUICallback, |
+ weak_ptr_factory_.GetWeakPtr(), |
+ base::Passed(&output), |
+ reply_msg)); |
+} |
+ |
+void PluginInfoMessageFilter::GuestCreatedOnUICallback( |
+ scoped_ptr<ChromeViewHostMsg_GetPluginInfo_Output> output, |
+ IPC::Message* reply_msg, |
+ content::WebContents* guest_web_contents) { |
+ int plugin_instance_id = content::browser_plugin::kInstanceIDNone; |
+ MimeHandlerViewGuest* guest = MimeHandlerViewGuest::FromWebContents( |
+ guest_web_contents); |
+ if (guest) |
+ plugin_instance_id = guest->GetGuestInstanceID(); |
+ |
+ // Set the instance ID so content/ can call attach. |
+ output->instance_id = plugin_instance_id; |
+ |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::IO, |
+ FROM_HERE, |
+ base::Bind(&PluginInfoMessageFilter::GuestCreatedOnIO, |
+ this, base::Passed(&output), reply_msg)); |
+} |
+ |
+void PluginInfoMessageFilter::GuestCreatedOnIO( |
+ const scoped_ptr<ChromeViewHostMsg_GetPluginInfo_Output>& output, |
+ IPC::Message* reply_msg) { |
+ DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO)); |
+ ChromeViewHostMsg_GetPluginInfo::WriteReplyParams(reply_msg, *output); |
+ Send(reply_msg); |
+} |
+ |
void PluginInfoMessageFilter::OnGetPluginInfo( |
int render_frame_id, |
const GURL& url, |
@@ -146,26 +202,42 @@ void PluginInfoMessageFilter::PluginsLoaded( |
const GetPluginInfo_Params& params, |
IPC::Message* reply_msg, |
const std::vector<WebPluginInfo>& plugins) { |
- ChromeViewHostMsg_GetPluginInfo_Output output; |
+ scoped_ptr<ChromeViewHostMsg_GetPluginInfo_Output> output( |
+ new ChromeViewHostMsg_GetPluginInfo_Output); |
// This also fills in |actual_mime_type|. |
scoped_ptr<PluginMetadata> plugin_metadata; |
if (context_.FindEnabledPlugin(params.render_frame_id, params.url, |
params.top_origin_url, params.mime_type, |
- &output.status, &output.plugin, |
- &output.actual_mime_type, |
+ &output->status, &output->plugin, |
+ &output->actual_mime_type, |
&plugin_metadata)) { |
- context_.DecidePluginStatus(params, output.plugin, plugin_metadata.get(), |
- &output.status); |
+ context_.DecidePluginStatus(params, output->plugin, plugin_metadata.get(), |
+ &output->status); |
} |
if (plugin_metadata) { |
- output.group_identifier = plugin_metadata->identifier(); |
- output.group_name = plugin_metadata->name(); |
+ output->group_identifier = plugin_metadata->identifier(); |
+ output->group_name = plugin_metadata->name(); |
} |
- context_.MaybeGrantAccess(output.status, output.plugin.path); |
+ context_.MaybeGrantAccess(output->status, output->plugin.path); |
+ |
+ if (output->plugin.type == |
+ content::WebPluginInfo::PluginType::PLUGIN_TYPE_BROWSER_PLUGIN) { |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::UI, |
+ FROM_HERE, |
+ base::Bind(&PluginInfoMessageFilter::CreateGuestOnUI, |
+ this, |
+ profile_, |
+ context_.render_process_id(), |
+ params.top_origin_url, |
+ base::Passed(&output), |
+ reply_msg)); |
+ return; |
+ } |
- ChromeViewHostMsg_GetPluginInfo::WriteReplyParams(reply_msg, output); |
+ ChromeViewHostMsg_GetPluginInfo::WriteReplyParams(reply_msg, *output); |
Send(reply_msg); |
} |