Home | History | Annotate | Download | only in webview
      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