| // Copyright (c) 2013 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/browser/guestview/webview/plugin_permission_helper.h" |
| |
| #include "chrome/browser/guestview/webview/webview_guest.h" |
| #include "chrome/browser/guestview/webview/webview_permission_types.h" |
| #include "chrome/browser/plugins/chrome_plugin_service_filter.h" |
| #include "chrome/common/render_messages.h" |
| #include "content/public/browser/render_process_host.h" |
| #include "content/public/browser/render_view_host.h" |
| #include "content/public/browser/user_metrics.h" |
| |
| using content::BrowserPluginGuestDelegate; |
| using content::RenderViewHost; |
| using content::WebContents; |
| |
| DEFINE_WEB_CONTENTS_USER_DATA_KEY(PluginPermissionHelper); |
| |
| PluginPermissionHelper::PluginPermissionHelper(WebContents* contents) |
| : content::WebContentsObserver(contents), |
| weak_factory_(this) { |
| } |
| |
| PluginPermissionHelper::~PluginPermissionHelper() { |
| } |
| |
| bool PluginPermissionHelper::OnMessageReceived(const IPC::Message& message) { |
| IPC_BEGIN_MESSAGE_MAP(PluginPermissionHelper, message) |
| IPC_MESSAGE_HANDLER(ChromeViewHostMsg_BlockedUnauthorizedPlugin, |
| OnBlockedUnauthorizedPlugin) |
| IPC_MESSAGE_HANDLER(ChromeViewHostMsg_CouldNotLoadPlugin, |
| OnCouldNotLoadPlugin) |
| IPC_MESSAGE_HANDLER(ChromeViewHostMsg_BlockedOutdatedPlugin, |
| OnBlockedOutdatedPlugin) |
| IPC_MESSAGE_HANDLER(ChromeViewHostMsg_NPAPINotSupported, |
| OnNPAPINotSupported) |
| IPC_MESSAGE_HANDLER(ChromeViewHostMsg_OpenAboutPlugins, |
| OnOpenAboutPlugins) |
| #if defined(ENABLE_PLUGIN_INSTALLATION) |
| IPC_MESSAGE_HANDLER(ChromeViewHostMsg_FindMissingPlugin, |
| OnFindMissingPlugin) |
| IPC_MESSAGE_HANDLER(ChromeViewHostMsg_RemovePluginPlaceholderHost, |
| OnRemovePluginPlaceholderHost) |
| #endif |
| IPC_MESSAGE_UNHANDLED(return false) |
| IPC_END_MESSAGE_MAP() |
| |
| return true; |
| } |
| |
| void PluginPermissionHelper::OnBlockedUnauthorizedPlugin( |
| const string16& name, |
| const std::string& identifier) { |
| const char kPluginName[] = "name"; |
| const char kPluginIdentifier[] = "identifier"; |
| |
| WebViewGuest* webview = WebViewGuest::FromWebContents(web_contents()); |
| if (!webview) |
| return; |
| |
| base::DictionaryValue info; |
| info.SetString(std::string(kPluginName), name); |
| info.SetString(std::string(kPluginIdentifier), identifier); |
| webview->RequestPermission(static_cast<BrowserPluginPermissionType>( |
| WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN), |
| info, |
| base::Bind(&PluginPermissionHelper::OnPermissionResponse, |
| weak_factory_.GetWeakPtr(), |
| identifier), |
| true /* allowed_by_default */); |
| content::RecordAction( |
| content::UserMetricsAction("WebView.Guest.PluginLoadRequest")); |
| } |
| |
| void PluginPermissionHelper::OnCouldNotLoadPlugin( |
| const base::FilePath& plugin_path) { |
| } |
| |
| void PluginPermissionHelper::OnBlockedOutdatedPlugin( |
| int placeholder_id, |
| const std::string& identifier) { |
| } |
| |
| void PluginPermissionHelper::OnNPAPINotSupported(const std::string& id) { |
| } |
| |
| void PluginPermissionHelper::OnOpenAboutPlugins() { |
| } |
| |
| #if defined(ENABLE_PLUGIN_INSTALLATION) |
| void PluginPermissionHelper::OnFindMissingPlugin(int placeholder_id, |
| const std::string& mime_type) { |
| } |
| |
| void PluginPermissionHelper::OnRemovePluginPlaceholderHost(int placeholder_id) { |
| } |
| #endif // defined(ENABLE_PLUGIN_INSTALLATION) |
| |
| void PluginPermissionHelper::OnPermissionResponse(const std::string& identifier, |
| bool allow, |
| const std::string& input) { |
| if (allow) { |
| RenderViewHost* host = web_contents()->GetRenderViewHost(); |
| ChromePluginServiceFilter::GetInstance()->AuthorizeAllPlugins( |
| host->GetProcess()->GetID()); |
| host->Send(new ChromeViewMsg_LoadBlockedPlugins( |
| host->GetRoutingID(), identifier)); |
| } |
| } |