1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/guestview/webview/plugin_permission_helper.h" 6 7 #include "chrome/browser/guestview/webview/webview_guest.h" 8 #include "chrome/browser/guestview/webview/webview_permission_types.h" 9 #include "chrome/browser/plugins/chrome_plugin_service_filter.h" 10 #include "chrome/common/render_messages.h" 11 #include "content/public/browser/render_process_host.h" 12 #include "content/public/browser/render_view_host.h" 13 #include "content/public/browser/user_metrics.h" 14 15 using content::BrowserPluginGuestDelegate; 16 using content::RenderViewHost; 17 using content::WebContents; 18 19 DEFINE_WEB_CONTENTS_USER_DATA_KEY(PluginPermissionHelper); 20 21 PluginPermissionHelper::PluginPermissionHelper(WebContents* contents) 22 : content::WebContentsObserver(contents), 23 weak_factory_(this) { 24 } 25 26 PluginPermissionHelper::~PluginPermissionHelper() { 27 } 28 29 bool PluginPermissionHelper::OnMessageReceived(const IPC::Message& message) { 30 IPC_BEGIN_MESSAGE_MAP(PluginPermissionHelper, message) 31 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_BlockedUnauthorizedPlugin, 32 OnBlockedUnauthorizedPlugin) 33 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_CouldNotLoadPlugin, 34 OnCouldNotLoadPlugin) 35 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_BlockedOutdatedPlugin, 36 OnBlockedOutdatedPlugin) 37 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_NPAPINotSupported, 38 OnNPAPINotSupported) 39 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_OpenAboutPlugins, 40 OnOpenAboutPlugins) 41 #if defined(ENABLE_PLUGIN_INSTALLATION) 42 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_FindMissingPlugin, 43 OnFindMissingPlugin) 44 IPC_MESSAGE_HANDLER(ChromeViewHostMsg_RemovePluginPlaceholderHost, 45 OnRemovePluginPlaceholderHost) 46 #endif 47 IPC_MESSAGE_UNHANDLED(return false) 48 IPC_END_MESSAGE_MAP() 49 50 return true; 51 } 52 53 void PluginPermissionHelper::OnBlockedUnauthorizedPlugin( 54 const base::string16& name, 55 const std::string& identifier) { 56 const char kPluginName[] = "name"; 57 const char kPluginIdentifier[] = "identifier"; 58 59 WebViewGuest* webview = WebViewGuest::FromWebContents(web_contents()); 60 if (!webview) 61 return; 62 63 base::DictionaryValue info; 64 info.SetString(std::string(kPluginName), name); 65 info.SetString(std::string(kPluginIdentifier), identifier); 66 webview->RequestPermission(static_cast<BrowserPluginPermissionType>( 67 WEB_VIEW_PERMISSION_TYPE_LOAD_PLUGIN), 68 info, 69 base::Bind(&PluginPermissionHelper::OnPermissionResponse, 70 weak_factory_.GetWeakPtr(), 71 identifier), 72 true /* allowed_by_default */); 73 content::RecordAction( 74 content::UserMetricsAction("WebView.Guest.PluginLoadRequest")); 75 } 76 77 void PluginPermissionHelper::OnCouldNotLoadPlugin( 78 const base::FilePath& plugin_path) { 79 } 80 81 void PluginPermissionHelper::OnBlockedOutdatedPlugin( 82 int placeholder_id, 83 const std::string& identifier) { 84 } 85 86 void PluginPermissionHelper::OnNPAPINotSupported(const std::string& id) { 87 } 88 89 void PluginPermissionHelper::OnOpenAboutPlugins() { 90 } 91 92 #if defined(ENABLE_PLUGIN_INSTALLATION) 93 void PluginPermissionHelper::OnFindMissingPlugin(int placeholder_id, 94 const std::string& mime_type) { 95 } 96 97 void PluginPermissionHelper::OnRemovePluginPlaceholderHost(int placeholder_id) { 98 } 99 #endif // defined(ENABLE_PLUGIN_INSTALLATION) 100 101 void PluginPermissionHelper::OnPermissionResponse(const std::string& identifier, 102 bool allow, 103 const std::string& input) { 104 if (allow) { 105 RenderViewHost* host = web_contents()->GetRenderViewHost(); 106 ChromePluginServiceFilter::GetInstance()->AuthorizeAllPlugins( 107 host->GetProcess()->GetID()); 108 host->Send(new ChromeViewMsg_LoadBlockedPlugins( 109 host->GetRoutingID(), identifier)); 110 } 111 } 112