blob: 004452353d8e8d84c69fb56ca3724297f32b55a8 [file] [log] [blame]
// 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));
}
}