Use a placeholder instead of the default plugin for missing plug-ins on Mac and Linux.
BUG=62079 TEST=Missing plug-in placeholder looks different Review URL: http://codereview.chromium.org/7990005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@104144 0039d316-1c4b-4281-b951-d872f2087c98
This commit is contained in:
chrome
app
browser
common
renderer
content
browser
common
ipc
@ -4728,6 +4728,9 @@ Keep your key file in a safe place. You will need it to create new versions of y
|
||||
<message name="IDS_PLUGIN_NOT_AUTHORIZED" desc="The placeholder text for a plug-in that requires user permission to run.">
|
||||
The <ph name="PLUGIN_NAME">$1<ex>Java</ex></ph> plug-in needs your permission to run.
|
||||
</message>
|
||||
<message name="IDS_PLUGIN_NOT_FOUND" desc="The placeholder text for a plug-in that is not installed.">
|
||||
No plug-in available to display this content.
|
||||
</message>
|
||||
|
||||
<!-- Session Crashed Info Bar-->
|
||||
<message name="IDS_SESSION_CRASHED_VIEW_RESTORE_BUTTON" desc="Title of the restore button in the session crashed view.">
|
||||
|
@ -17,11 +17,7 @@ class DefaultPluginUITest : public UITest {
|
||||
};
|
||||
|
||||
#if defined(OS_WIN)
|
||||
#define MAYBE_DefaultPluginLoadTest DefaultPluginLoadTest
|
||||
#else
|
||||
#define MAYBE_DefaultPluginLoadTest DefaultPluginLoadTest
|
||||
#endif
|
||||
TEST_F(DefaultPluginUITest, MAYBE_DefaultPluginLoadTest) {
|
||||
TEST_F(DefaultPluginUITest, DefaultPluginLoadTest) {
|
||||
// Open page with default plugin.
|
||||
FilePath test_file(test_data_directory_);
|
||||
test_file = test_file.AppendASCII("default_plugin.html");
|
||||
@ -36,3 +32,4 @@ TEST_F(DefaultPluginUITest, MAYBE_DefaultPluginLoadTest) {
|
||||
L"document.getElementById('result').innerHTML)", &out));
|
||||
ASSERT_EQ(L"DONE", out);
|
||||
}
|
||||
#endif
|
||||
|
@ -4,6 +4,7 @@
|
||||
|
||||
#include "chrome/browser/renderer_host/chrome_render_message_filter.h"
|
||||
|
||||
#include "base/bind.h"
|
||||
#include "base/file_util.h"
|
||||
#include "base/metrics/histogram.h"
|
||||
#include "chrome/browser/automation/automation_resource_message_filter.h"
|
||||
@ -26,12 +27,15 @@
|
||||
#include "chrome/common/extensions/extension_messages.h"
|
||||
#include "chrome/common/pref_names.h"
|
||||
#include "chrome/common/render_messages.h"
|
||||
#include "content/browser/plugin_service.h"
|
||||
#include "content/browser/plugin_service_filter.h"
|
||||
#include "content/browser/renderer_host/render_process_host.h"
|
||||
#include "content/browser/renderer_host/resource_dispatcher_host.h"
|
||||
#include "content/common/url_constants.h"
|
||||
#include "googleurl/src/gurl.h"
|
||||
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSecurityOrigin.h"
|
||||
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
|
||||
#include "webkit/plugins/npapi/plugin_list.h"
|
||||
|
||||
#if defined(USE_TCMALLOC)
|
||||
#include "chrome/browser/browser_about_handler.h"
|
||||
@ -83,6 +87,7 @@ ChromeRenderMessageFilter::ChromeRenderMessageFilter(
|
||||
profile_(profile),
|
||||
request_context_(request_context),
|
||||
extension_info_map_(profile->GetExtensionInfoMap()),
|
||||
resource_context_(profile->GetResourceContext()),
|
||||
weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) {
|
||||
allow_outdated_plugins_.Init(prefs::kPluginsAllowOutdated,
|
||||
profile_->GetPrefs(), NULL);
|
||||
@ -134,6 +139,8 @@ bool ChromeRenderMessageFilter::OnMessageReceived(const IPC::Message& message,
|
||||
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_AllowIndexedDB, OnAllowIndexedDB)
|
||||
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_GetPluginContentSetting,
|
||||
OnGetPluginContentSetting)
|
||||
IPC_MESSAGE_HANDLER_DELAY_REPLY(ChromeViewHostMsg_GetPluginInfo,
|
||||
OnGetPluginInfo)
|
||||
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_CanTriggerClipboardRead,
|
||||
OnCanTriggerClipboardRead)
|
||||
IPC_MESSAGE_HANDLER(ChromeViewHostMsg_CanTriggerClipboardWrite,
|
||||
@ -491,6 +498,97 @@ void ChromeRenderMessageFilter::OnGetPluginContentSetting(
|
||||
resource);
|
||||
}
|
||||
|
||||
struct ChromeRenderMessageFilter::GetPluginInfo_Params {
|
||||
int render_view_id;
|
||||
GURL url;
|
||||
GURL top_origin_url;
|
||||
std::string mime_type;
|
||||
};
|
||||
|
||||
void ChromeRenderMessageFilter::OnGetPluginInfo(
|
||||
int render_view_id,
|
||||
const GURL& url,
|
||||
const GURL& top_origin_url,
|
||||
const std::string& mime_type,
|
||||
IPC::Message* reply_msg) {
|
||||
GetPluginInfo_Params params = {
|
||||
render_view_id,
|
||||
url,
|
||||
top_origin_url,
|
||||
mime_type
|
||||
};
|
||||
PluginService::GetInstance()->GetPlugins(
|
||||
base::Bind(&ChromeRenderMessageFilter::PluginsLoaded, this,
|
||||
params, reply_msg));
|
||||
}
|
||||
|
||||
void ChromeRenderMessageFilter::PluginsLoaded(
|
||||
const GetPluginInfo_Params& params,
|
||||
IPC::Message* reply_msg,
|
||||
const std::vector<webkit::WebPluginInfo>& plugins) {
|
||||
ChromeViewHostMsg_GetPluginInfo_Status status;
|
||||
webkit::WebPluginInfo plugin;
|
||||
std::string actual_mime_type;
|
||||
GetPluginInfo(params.render_view_id, params.url, params.top_origin_url,
|
||||
params.mime_type, &status, &plugin, &actual_mime_type);
|
||||
ChromeViewHostMsg_GetPluginInfo::WriteReplyParams(
|
||||
reply_msg, status, plugin, actual_mime_type);
|
||||
Send(reply_msg);
|
||||
}
|
||||
|
||||
void ChromeRenderMessageFilter::GetPluginInfo(
|
||||
int render_view_id,
|
||||
const GURL& url,
|
||||
const GURL& top_origin_url,
|
||||
const std::string& mime_type,
|
||||
ChromeViewHostMsg_GetPluginInfo_Status* status,
|
||||
webkit::WebPluginInfo* plugin,
|
||||
std::string* actual_mime_type) {
|
||||
bool allow_wildcard = true;
|
||||
std::vector<webkit::WebPluginInfo> matching_plugins;
|
||||
std::vector<std::string> mime_types;
|
||||
PluginService::GetInstance()->GetPluginInfoArray(
|
||||
url, mime_type, allow_wildcard, &matching_plugins, &mime_types);
|
||||
if (matching_plugins.empty()) {
|
||||
status->value = ChromeViewHostMsg_GetPluginInfo_Status::kNotFound;
|
||||
return;
|
||||
}
|
||||
|
||||
if (matching_plugins.size() > 1 &&
|
||||
matching_plugins.back().path ==
|
||||
FilePath(webkit::npapi::kDefaultPluginLibraryName)) {
|
||||
// If there is at least one plug-in handling the required MIME type (apart
|
||||
// from the default plug-in), we don't need the default plug-in.
|
||||
matching_plugins.pop_back();
|
||||
}
|
||||
|
||||
content::PluginServiceFilter* filter = PluginService::GetInstance()->filter();
|
||||
bool allowed = false;
|
||||
for (size_t i = 0; i < matching_plugins.size(); ++i) {
|
||||
if (!filter || filter->ShouldUsePlugin(render_process_id_,
|
||||
render_view_id,
|
||||
&resource_context_,
|
||||
url,
|
||||
top_origin_url,
|
||||
&matching_plugins[i])) {
|
||||
*plugin = matching_plugins[i];
|
||||
*actual_mime_type = mime_types[i];
|
||||
allowed = true;
|
||||
break;
|
||||
} else if (i == 0) {
|
||||
*plugin = matching_plugins[i];
|
||||
*actual_mime_type = mime_types[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (!allowed) {
|
||||
status->value = ChromeViewHostMsg_GetPluginInfo_Status::kDisabled;
|
||||
return;
|
||||
}
|
||||
|
||||
status->value = ChromeViewHostMsg_GetPluginInfo_Status::kAllowed;
|
||||
}
|
||||
|
||||
void ChromeRenderMessageFilter::OnCanTriggerClipboardRead(const GURL& url,
|
||||
bool* allowed) {
|
||||
const Extension* extension =
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "content/common/dom_storage_common.h"
|
||||
#include "third_party/WebKit/Source/WebKit/chromium/public/WebCache.h"
|
||||
|
||||
struct ChromeViewHostMsg_GetPluginInfo_Status;
|
||||
struct ExtensionHostMsg_Request_Params;
|
||||
class ExtensionInfoMap;
|
||||
class FilePath;
|
||||
@ -24,6 +25,10 @@ namespace net {
|
||||
class URLRequestContextGetter;
|
||||
}
|
||||
|
||||
namespace webkit {
|
||||
struct WebPluginInfo;
|
||||
}
|
||||
|
||||
// This class filters out incoming Chrome-specific IPC messages for the renderer
|
||||
// process on the IPC thread.
|
||||
class ChromeRenderMessageFilter : public BrowserMessageFilter {
|
||||
@ -43,6 +48,8 @@ class ChromeRenderMessageFilter : public BrowserMessageFilter {
|
||||
friend class BrowserThread;
|
||||
friend class DeleteTask<ChromeRenderMessageFilter>;
|
||||
|
||||
struct GetPluginInfo_Params;
|
||||
|
||||
virtual ~ChromeRenderMessageFilter();
|
||||
|
||||
void OnLaunchNaCl(const std::wstring& url,
|
||||
@ -117,6 +124,23 @@ class ChromeRenderMessageFilter : public BrowserMessageFilter {
|
||||
void OnGetPluginContentSetting(const GURL& policy_url,
|
||||
const std::string& resource,
|
||||
ContentSetting* setting);
|
||||
void OnGetPluginInfo(int render_view_id,
|
||||
const GURL& url,
|
||||
const GURL& top_origin_url,
|
||||
const std::string& mime_type,
|
||||
IPC::Message* reply_msg);
|
||||
// |params| wraps the parameters passed to |OnGetPluginInfo|, because
|
||||
// |base::Bind| doesn't support the required arity <http://crbug.com/98542>.
|
||||
void PluginsLoaded(const GetPluginInfo_Params& params,
|
||||
IPC::Message* reply_msg,
|
||||
const std::vector<webkit::WebPluginInfo>& plugins);
|
||||
void GetPluginInfo(int render_view_id,
|
||||
const GURL& url,
|
||||
const GURL& top_origin_url,
|
||||
const std::string& mime_type,
|
||||
ChromeViewHostMsg_GetPluginInfo_Status* status,
|
||||
webkit::WebPluginInfo* plugin,
|
||||
std::string* actual_mime_type);
|
||||
void OnCanTriggerClipboardRead(const GURL& url, bool* allowed);
|
||||
void OnCanTriggerClipboardWrite(const GURL& url, bool* allowed);
|
||||
void OnGetCookies(const GURL& url,
|
||||
@ -137,6 +161,8 @@ class ChromeRenderMessageFilter : public BrowserMessageFilter {
|
||||
// Used to look up permissions at database creation time.
|
||||
scoped_refptr<HostContentSettingsMap> host_content_settings_map_;
|
||||
|
||||
const content::ResourceContext& resource_context_;
|
||||
|
||||
BooleanPrefMember allow_outdated_plugins_;
|
||||
BooleanPrefMember always_authorize_plugins_;
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
||||
// Copyright (c) 2011 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.
|
||||
|
||||
@ -10,6 +10,10 @@
|
||||
namespace chrome {
|
||||
|
||||
void RegisterInternalDefaultPlugin() {
|
||||
#if defined(OS_WIN)
|
||||
// TODO(bauerb): On Windows the default plug-in can download and install
|
||||
// missing plug-ins, which we don't support in the browser yet, so keep
|
||||
// using the default plug-in on Windows until we do.
|
||||
const webkit::npapi::PluginEntryPoints entry_points = {
|
||||
#if !defined(OS_POSIX) || defined(OS_MACOSX)
|
||||
default_plugin::NP_GetEntryPoints,
|
||||
@ -24,6 +28,7 @@ void RegisterInternalDefaultPlugin() {
|
||||
"Provides functionality for installing third-party plug-ins",
|
||||
"*",
|
||||
entry_points);
|
||||
#endif // defined OS(WIN)
|
||||
}
|
||||
|
||||
} // namespace chrome
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "chrome/common/thumbnail_score.h"
|
||||
#include "chrome/common/translate_errors.h"
|
||||
#include "content/common/common_param_traits.h"
|
||||
#include "content/common/webkit_param_traits.h"
|
||||
#include "ipc/ipc_message_macros.h"
|
||||
#include "ipc/ipc_platform_file.h"
|
||||
#include "third_party/skia/include/core/SkBitmap.h"
|
||||
@ -50,6 +51,22 @@ enum ViewHostMsg_JavaScriptStressTestControl_Commands {
|
||||
kJavaScriptStressTestPrepareStressRun = 1,
|
||||
};
|
||||
|
||||
// This enum is inside a struct so that we can forward-declare the struct in
|
||||
// others headers without having to include this one.
|
||||
struct ChromeViewHostMsg_GetPluginInfo_Status {
|
||||
// TODO(bauerb): Add more status values (blocked, click-to-play, out of date,
|
||||
// requires authorization).
|
||||
enum Value {
|
||||
kAllowed,
|
||||
kDisabled,
|
||||
kNotFound,
|
||||
};
|
||||
|
||||
ChromeViewHostMsg_GetPluginInfo_Status() : value(kAllowed) {}
|
||||
|
||||
Value value;
|
||||
};
|
||||
|
||||
namespace IPC {
|
||||
|
||||
#if defined(OS_POSIX) && !defined(USE_AURA)
|
||||
@ -91,12 +108,17 @@ struct ParamTraits<ContentSettings> {
|
||||
|
||||
#define IPC_MESSAGE_START ChromeMsgStart
|
||||
|
||||
IPC_ENUM_TRAITS(ChromeViewHostMsg_GetPluginInfo_Status::Value)
|
||||
IPC_ENUM_TRAITS(InstantCompleteBehavior)
|
||||
IPC_ENUM_TRAITS(search_provider::OSDDType)
|
||||
IPC_ENUM_TRAITS(search_provider::InstallState)
|
||||
IPC_ENUM_TRAITS(TranslateErrors::Type)
|
||||
IPC_ENUM_TRAITS(WebKit::WebConsoleMessage::Level)
|
||||
|
||||
IPC_STRUCT_TRAITS_BEGIN(ChromeViewHostMsg_GetPluginInfo_Status)
|
||||
IPC_STRUCT_TRAITS_MEMBER(value)
|
||||
IPC_STRUCT_TRAITS_END()
|
||||
|
||||
IPC_STRUCT_TRAITS_BEGIN(ThumbnailScore)
|
||||
IPC_STRUCT_TRAITS_MEMBER(boring_score)
|
||||
IPC_STRUCT_TRAITS_MEMBER(good_clipping)
|
||||
@ -384,6 +406,19 @@ IPC_SYNC_MESSAGE_CONTROL2_1(ChromeViewHostMsg_GetPluginContentSetting,
|
||||
std::string /* resource */,
|
||||
ContentSetting /* setting */)
|
||||
|
||||
// Return information about a plugin for the given URL and MIME type.
|
||||
// In contrast to ViewHostMsg_GetPluginInfo in content/, this IPC call knows
|
||||
// about specific reasons why a plug-in can't be used, for example because it's
|
||||
// disabled.
|
||||
IPC_SYNC_MESSAGE_CONTROL4_3(ChromeViewHostMsg_GetPluginInfo,
|
||||
int /* render_view_id */,
|
||||
GURL /* url */,
|
||||
GURL /* top origin url */,
|
||||
std::string /* mime_type */,
|
||||
ChromeViewHostMsg_GetPluginInfo_Status /* status */,
|
||||
webkit::WebPluginInfo /* plugin */,
|
||||
std::string /* actual_mime_type */)
|
||||
|
||||
// Specifies the URL as the first parameter (a wstring) and thumbnail as
|
||||
// binary data as the second parameter.
|
||||
IPC_MESSAGE_ROUTED3(ChromeViewHostMsg_Thumbnail,
|
||||
|
@ -56,16 +56,17 @@ static const BlockedPlugin* g_last_active_menu;
|
||||
|
||||
BlockedPlugin::BlockedPlugin(RenderView* render_view,
|
||||
WebFrame* frame,
|
||||
const webkit::npapi::PluginGroup& info,
|
||||
const WebPluginParams& params,
|
||||
const WebPreferences& preferences,
|
||||
int template_id,
|
||||
const string16& name,
|
||||
const string16& message,
|
||||
bool is_blocked_for_prerendering,
|
||||
bool allow_loading)
|
||||
: content::RenderViewObserver(render_view),
|
||||
frame_(frame),
|
||||
plugin_params_(params),
|
||||
name_(name),
|
||||
is_blocked_for_prerendering_(is_blocked_for_prerendering),
|
||||
hidden_(false),
|
||||
allow_loading_(allow_loading) {
|
||||
@ -77,7 +78,6 @@ BlockedPlugin::BlockedPlugin(RenderView* render_view,
|
||||
|
||||
DictionaryValue values;
|
||||
values.SetString("message", message);
|
||||
name_ = info.GetGroupName();
|
||||
values.SetString("name", name_);
|
||||
values.SetString("hide", l10n_util::GetStringUTF8(IDS_PLUGIN_HIDE));
|
||||
|
||||
@ -106,17 +106,22 @@ void BlockedPlugin::WillDestroyPlugin() {
|
||||
|
||||
void BlockedPlugin::ShowContextMenu(const WebKit::WebMouseEvent& event) {
|
||||
WebContextMenuData menu_data;
|
||||
WebVector<WebMenuItemInfo> custom_items(static_cast<size_t>(4));
|
||||
|
||||
WebMenuItemInfo name_item;
|
||||
name_item.label = name_;
|
||||
name_item.hasTextDirectionOverride = false;
|
||||
name_item.textDirection = WebKit::WebTextDirectionDefault;
|
||||
custom_items[0] = name_item;
|
||||
size_t num_items = name_.empty() ? 2u : 4u;
|
||||
WebVector<WebMenuItemInfo> custom_items(num_items);
|
||||
|
||||
WebMenuItemInfo separator_item;
|
||||
separator_item.type = WebMenuItemInfo::Separator;
|
||||
custom_items[1] = separator_item;
|
||||
size_t i = 0;
|
||||
if (!name_.empty()) {
|
||||
WebMenuItemInfo name_item;
|
||||
name_item.label = name_;
|
||||
name_item.hasTextDirectionOverride = false;
|
||||
name_item.textDirection = WebKit::WebTextDirectionDefault;
|
||||
custom_items[i++] = name_item;
|
||||
|
||||
WebMenuItemInfo separator_item;
|
||||
separator_item.type = WebMenuItemInfo::Separator;
|
||||
custom_items[i++] = separator_item;
|
||||
}
|
||||
|
||||
WebMenuItemInfo run_item;
|
||||
run_item.action = kMenuActionLoad;
|
||||
@ -126,7 +131,7 @@ void BlockedPlugin::ShowContextMenu(const WebKit::WebMouseEvent& event) {
|
||||
l10n_util::GetStringUTF8(IDS_CONTENT_CONTEXT_PLUGIN_RUN).c_str());
|
||||
run_item.hasTextDirectionOverride = false;
|
||||
run_item.textDirection = WebKit::WebTextDirectionDefault;
|
||||
custom_items[2] = run_item;
|
||||
custom_items[i++] = run_item;
|
||||
|
||||
WebMenuItemInfo hide_item;
|
||||
hide_item.action = kMenuActionRemove;
|
||||
@ -135,7 +140,7 @@ void BlockedPlugin::ShowContextMenu(const WebKit::WebMouseEvent& event) {
|
||||
l10n_util::GetStringUTF8(IDS_CONTENT_CONTEXT_PLUGIN_HIDE).c_str());
|
||||
hide_item.hasTextDirectionOverride = false;
|
||||
hide_item.textDirection = WebKit::WebTextDirectionDefault;
|
||||
custom_items[3] = hide_item;
|
||||
custom_items[i++] = hide_item;
|
||||
|
||||
menu_data.customItems.swap(custom_items);
|
||||
menu_data.mousePosition = WebPoint(event.windowX, event.windowY);
|
||||
|
@ -29,10 +29,10 @@ class BlockedPlugin : public content::RenderViewObserver,
|
||||
public:
|
||||
BlockedPlugin(RenderView* render_view,
|
||||
WebKit::WebFrame* frame,
|
||||
const webkit::npapi::PluginGroup& info,
|
||||
const WebKit::WebPluginParams& params,
|
||||
const WebPreferences& settings,
|
||||
int template_id,
|
||||
const string16& name,
|
||||
const string16& message,
|
||||
bool is_blocked_for_prerendering,
|
||||
bool allow_loading);
|
||||
|
@ -267,39 +267,43 @@ std::string ChromeContentRendererClient::GetDefaultEncoding() {
|
||||
}
|
||||
|
||||
bool ChromeContentRendererClient::OverrideCreatePlugin(
|
||||
RenderView* render_view,
|
||||
WebFrame* frame,
|
||||
const WebPluginParams& params,
|
||||
WebKit::WebPlugin** plugin) {
|
||||
bool is_default_plugin;
|
||||
*plugin = CreatePlugin(render_view, frame, params, &is_default_plugin);
|
||||
if (!*plugin || is_default_plugin)
|
||||
MissingPluginReporter::GetInstance()->ReportPluginMissing(
|
||||
params.mimeType.utf8(), params.url);
|
||||
RenderView* render_view,
|
||||
WebFrame* frame,
|
||||
const WebPluginParams& params,
|
||||
WebKit::WebPlugin** plugin) {
|
||||
*plugin = CreatePlugin(render_view, frame, params);
|
||||
return true;
|
||||
}
|
||||
|
||||
WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
RenderView* render_view,
|
||||
WebFrame* frame,
|
||||
const WebPluginParams& original_params,
|
||||
bool* is_default_plugin) {
|
||||
*is_default_plugin = false;
|
||||
RenderView* render_view,
|
||||
WebFrame* frame,
|
||||
const WebPluginParams& original_params) {
|
||||
CommandLine* cmd = CommandLine::ForCurrentProcess();
|
||||
webkit::WebPluginInfo info;
|
||||
GURL url(original_params.url);
|
||||
std::string orig_mime_type = original_params.mimeType.utf8();
|
||||
ChromeViewHostMsg_GetPluginInfo_Status status;
|
||||
webkit::WebPluginInfo plugin;
|
||||
std::string actual_mime_type;
|
||||
render_view->Send(new ChromeViewHostMsg_GetPluginInfo(
|
||||
render_view->routing_id(), url, frame->top()->document().url(),
|
||||
orig_mime_type, &status, &plugin, &actual_mime_type));
|
||||
|
||||
bool found = render_view->GetPluginInfo(
|
||||
url, frame->top()->document().url(), orig_mime_type, &info,
|
||||
&actual_mime_type);
|
||||
if (status.value == ChromeViewHostMsg_GetPluginInfo_Status::kNotFound) {
|
||||
MissingPluginReporter::GetInstance()->ReportPluginMissing(
|
||||
orig_mime_type, url);
|
||||
return CreatePluginPlaceholder(
|
||||
render_view, frame, original_params, NULL, IDR_BLOCKED_PLUGIN_HTML,
|
||||
IDS_PLUGIN_NOT_FOUND, false, false);
|
||||
} else if (status.value ==
|
||||
ChromeViewHostMsg_GetPluginInfo_Status::kDisabled) {
|
||||
return NULL; // TODO(bauerb): Show a placeholder for a disabled plug-in.
|
||||
}
|
||||
|
||||
if (!found)
|
||||
return NULL;
|
||||
|
||||
*is_default_plugin =
|
||||
info.path.value() == webkit::npapi::kDefaultPluginLibraryName;
|
||||
if (plugin.path.value() == webkit::npapi::kDefaultPluginLibraryName) {
|
||||
MissingPluginReporter::GetInstance()->ReportPluginMissing(
|
||||
orig_mime_type, url);
|
||||
}
|
||||
|
||||
if (orig_mime_type == actual_mime_type) {
|
||||
UMA_HISTOGRAM_ENUMERATION(kPluginTypeMismatch,
|
||||
@ -327,7 +331,7 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
}
|
||||
|
||||
scoped_ptr<webkit::npapi::PluginGroup> group(
|
||||
webkit::npapi::PluginList::Singleton()->GetPluginGroup(info));
|
||||
webkit::npapi::PluginList::Singleton()->GetPluginGroup(plugin));
|
||||
|
||||
ContentSettingsType content_type = CONTENT_SETTINGS_TYPE_PLUGINS;
|
||||
ContentSetting plugin_setting = CONTENT_SETTING_DEFAULT;
|
||||
@ -339,10 +343,10 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
DCHECK(plugin_setting != CONTENT_SETTING_DEFAULT);
|
||||
|
||||
WebPluginParams params(original_params);
|
||||
for (size_t i = 0; i < info.mime_types.size(); ++i) {
|
||||
if (info.mime_types[i].mime_type == actual_mime_type) {
|
||||
AppendParams(info.mime_types[i].additional_param_names,
|
||||
info.mime_types[i].additional_param_values,
|
||||
for (size_t i = 0; i < plugin.mime_types.size(); ++i) {
|
||||
if (plugin.mime_types[i].mime_type == actual_mime_type) {
|
||||
AppendParams(plugin.mime_types[i].additional_param_names,
|
||||
plugin.mime_types[i].additional_param_values,
|
||||
¶ms.attributeNames,
|
||||
¶ms.attributeValues);
|
||||
break;
|
||||
@ -351,14 +355,15 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
|
||||
ContentSetting outdated_policy = CONTENT_SETTING_ASK;
|
||||
ContentSetting authorize_policy = CONTENT_SETTING_ASK;
|
||||
if (group->IsVulnerable(info) || group->RequiresAuthorization(info)) {
|
||||
if (group->IsVulnerable(plugin) ||
|
||||
group->RequiresAuthorization(plugin)) {
|
||||
// These policies are dynamic and can changed at runtime, so they aren't
|
||||
// cached here.
|
||||
render_view->Send(new ChromeViewHostMsg_GetPluginPolicies(
|
||||
&outdated_policy, &authorize_policy));
|
||||
}
|
||||
|
||||
if (group->IsVulnerable(info)) {
|
||||
if (group->IsVulnerable(plugin)) {
|
||||
if (outdated_policy == CONTENT_SETTING_ASK ||
|
||||
outdated_policy == CONTENT_SETTING_BLOCK) {
|
||||
if (outdated_policy == CONTENT_SETTING_ASK) {
|
||||
@ -367,7 +372,7 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
GURL(group->GetUpdateURL())));
|
||||
}
|
||||
return CreatePluginPlaceholder(
|
||||
render_view, frame, params, *group, IDR_BLOCKED_PLUGIN_HTML,
|
||||
render_view, frame, params, group.get(), IDR_BLOCKED_PLUGIN_HTML,
|
||||
IDS_PLUGIN_OUTDATED, false, outdated_policy == CONTENT_SETTING_ASK);
|
||||
} else {
|
||||
DCHECK(outdated_policy == CONTENT_SETTING_ALLOW);
|
||||
@ -378,7 +383,7 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
ContentSetting host_setting =
|
||||
observer->GetContentSetting(CONTENT_SETTINGS_TYPE_PLUGINS);
|
||||
|
||||
if (group->RequiresAuthorization(info) &&
|
||||
if (group->RequiresAuthorization(plugin) &&
|
||||
authorize_policy == CONTENT_SETTING_ASK &&
|
||||
(plugin_setting == CONTENT_SETTING_ALLOW ||
|
||||
plugin_setting == CONTENT_SETTING_ASK) &&
|
||||
@ -386,13 +391,13 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
render_view->Send(new ChromeViewHostMsg_BlockedOutdatedPlugin(
|
||||
render_view->routing_id(), group->GetGroupName(), GURL()));
|
||||
return CreatePluginPlaceholder(
|
||||
render_view, frame, params, *group, IDR_BLOCKED_PLUGIN_HTML,
|
||||
render_view, frame, params, group.get(), IDR_BLOCKED_PLUGIN_HTML,
|
||||
IDS_PLUGIN_NOT_AUTHORIZED, false, true);
|
||||
}
|
||||
|
||||
// Treat Native Client invocations like Javascript.
|
||||
bool is_nacl_plugin =
|
||||
info.name == ASCIIToUTF16(ChromeContentClient::kNaClPluginName);
|
||||
bool is_nacl_plugin = plugin.name ==
|
||||
ASCIIToUTF16(ChromeContentClient::kNaClPluginName);
|
||||
if (is_nacl_plugin) {
|
||||
content_type = CONTENT_SETTINGS_TYPE_JAVASCRIPT;
|
||||
plugin_setting =
|
||||
@ -401,12 +406,12 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
|
||||
if (plugin_setting == CONTENT_SETTING_ALLOW ||
|
||||
host_setting == CONTENT_SETTING_ALLOW ||
|
||||
info.path.value() == webkit::npapi::kDefaultPluginLibraryName) {
|
||||
plugin.path.value() == webkit::npapi::kDefaultPluginLibraryName) {
|
||||
// Delay loading plugins if prerendering.
|
||||
if (prerender::PrerenderHelper::IsPrerendering(render_view)) {
|
||||
return CreatePluginPlaceholder(
|
||||
render_view, frame, params, *group, IDR_CLICK_TO_PLAY_PLUGIN_HTML,
|
||||
IDS_PLUGIN_LOAD, true, true);
|
||||
render_view, frame, params, group.get(),
|
||||
IDR_CLICK_TO_PLAY_PLUGIN_HTML, IDS_PLUGIN_LOAD, true, true);
|
||||
}
|
||||
|
||||
// Enforce the Chrome WebStore restriction on the Native Client plugin.
|
||||
@ -423,10 +428,10 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
// Content type handling NaCl plugin; the "nacl" param on the
|
||||
// MIME type holds the nexe URL.
|
||||
string16 nacl_attr = ASCIIToUTF16(kNaClPluginManifestAttribute);
|
||||
for (size_t i = 0; i < info.mime_types.size(); ++i) {
|
||||
if (info.mime_types[i].mime_type == actual_mime_type) {
|
||||
for (size_t i = 0; i < plugin.mime_types.size(); ++i) {
|
||||
if (plugin.mime_types[i].mime_type == actual_mime_type) {
|
||||
const webkit::WebPluginMimeType& content_type =
|
||||
info.mime_types[i];
|
||||
plugin.mime_types[i];
|
||||
for (size_t i = 0;
|
||||
i < content_type.additional_param_names.size(); ++i) {
|
||||
if (content_type.additional_param_names[i] == nacl_attr) {
|
||||
@ -454,7 +459,7 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
// TODO(bbudge) Webkit will crash if this is a full-frame plug-in and
|
||||
// we return NULL. Prepare a patch to fix that, and return NULL here.
|
||||
return CreatePluginPlaceholder(
|
||||
render_view, frame, params, *group, IDR_BLOCKED_PLUGIN_HTML,
|
||||
render_view, frame, params, group.get(), IDR_BLOCKED_PLUGIN_HTML,
|
||||
IDS_PLUGIN_BLOCKED, false, false);
|
||||
}
|
||||
}
|
||||
@ -462,29 +467,29 @@ WebPlugin* ChromeContentRendererClient::CreatePlugin(
|
||||
bool pepper_plugin_was_registered = false;
|
||||
scoped_refptr<webkit::ppapi::PluginModule> pepper_module(
|
||||
render_view->pepper_delegate()->CreatePepperPluginModule(
|
||||
info, &pepper_plugin_was_registered));
|
||||
plugin, &pepper_plugin_was_registered));
|
||||
if (pepper_plugin_was_registered) {
|
||||
if (pepper_module) {
|
||||
return render_view->CreatePepperPlugin(
|
||||
frame, params, info.path, pepper_module.get());
|
||||
frame, params, plugin.path, pepper_module.get());
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return render_view->CreateNPAPIPlugin(
|
||||
frame, params, info.path, actual_mime_type);
|
||||
frame, params, plugin.path, actual_mime_type);
|
||||
}
|
||||
|
||||
observer->DidBlockContentType(content_type, resource);
|
||||
if (plugin_setting == CONTENT_SETTING_ASK) {
|
||||
RenderThread::RecordUserMetrics("Plugin_ClickToPlay");
|
||||
return CreatePluginPlaceholder(
|
||||
render_view, frame, params, *group, IDR_CLICK_TO_PLAY_PLUGIN_HTML,
|
||||
render_view, frame, params, group.get(), IDR_CLICK_TO_PLAY_PLUGIN_HTML,
|
||||
IDS_PLUGIN_LOAD, false, true);
|
||||
} else {
|
||||
RenderThread::RecordUserMetrics("Plugin_Blocked");
|
||||
return CreatePluginPlaceholder(
|
||||
render_view, frame, params, *group, IDR_BLOCKED_PLUGIN_HTML,
|
||||
render_view, frame, params, group.get(), IDR_BLOCKED_PLUGIN_HTML,
|
||||
IDS_PLUGIN_BLOCKED, false, true);
|
||||
}
|
||||
}
|
||||
@ -493,22 +498,30 @@ WebPlugin* ChromeContentRendererClient::CreatePluginPlaceholder(
|
||||
RenderView* render_view,
|
||||
WebFrame* frame,
|
||||
const WebPluginParams& params,
|
||||
const webkit::npapi::PluginGroup& group,
|
||||
const webkit::npapi::PluginGroup* group,
|
||||
int resource_id,
|
||||
int message_id,
|
||||
bool is_blocked_for_prerendering,
|
||||
bool allow_loading) {
|
||||
// |blocked_plugin| will delete itself when the WebViewPlugin
|
||||
// is destroyed.
|
||||
string16 name;
|
||||
string16 message;
|
||||
if (group) {
|
||||
name = group->GetGroupName();
|
||||
message = l10n_util::GetStringFUTF16(message_id, name);
|
||||
} else {
|
||||
message = l10n_util::GetStringUTF16(message_id);
|
||||
}
|
||||
|
||||
BlockedPlugin* blocked_plugin =
|
||||
new BlockedPlugin(render_view,
|
||||
frame,
|
||||
group,
|
||||
params,
|
||||
render_view->webkit_preferences(),
|
||||
resource_id,
|
||||
l10n_util::GetStringFUTF16(message_id,
|
||||
group.GetGroupName()),
|
||||
name,
|
||||
message,
|
||||
is_blocked_for_prerendering,
|
||||
allow_loading);
|
||||
return blocked_plugin->plugin();
|
||||
@ -710,7 +723,6 @@ bool ChromeContentRendererClient::IsProtocolSupportedForMedia(
|
||||
return url.SchemeIs(chrome::kExtensionScheme);
|
||||
}
|
||||
|
||||
|
||||
void ChromeContentRendererClient::SetExtensionDispatcher(
|
||||
ExtensionDispatcher* extension_dispatcher) {
|
||||
extension_dispatcher_.reset(extension_dispatcher);
|
||||
|
@ -98,14 +98,13 @@ class ChromeContentRendererClient : public content::ContentRendererClient {
|
||||
WebKit::WebPlugin* CreatePlugin(
|
||||
RenderView* render_view,
|
||||
WebKit::WebFrame* frame,
|
||||
const WebKit::WebPluginParams& params,
|
||||
bool* is_default_plugin);
|
||||
const WebKit::WebPluginParams& params);
|
||||
|
||||
WebKit::WebPlugin* CreatePluginPlaceholder(
|
||||
RenderView* render_view,
|
||||
WebKit::WebFrame* frame,
|
||||
const WebKit::WebPluginParams& params,
|
||||
const webkit::npapi::PluginGroup& group,
|
||||
const webkit::npapi::PluginGroup* group,
|
||||
int resource_id,
|
||||
int message_id,
|
||||
bool is_blocked_for_prerendering,
|
||||
|
@ -472,6 +472,18 @@ void PluginService::FinishOpenChannelToPlugin(
|
||||
}
|
||||
}
|
||||
|
||||
bool PluginService::GetPluginInfoArray(
|
||||
const GURL& url,
|
||||
const std::string& mime_type,
|
||||
bool allow_wildcard,
|
||||
std::vector<webkit::WebPluginInfo>* plugins,
|
||||
std::vector<std::string>* actual_mime_types) {
|
||||
bool use_stale = false;
|
||||
webkit::npapi::PluginList::Singleton()->GetPluginInfoArray(
|
||||
url, mime_type, allow_wildcard, &use_stale, plugins, actual_mime_types);
|
||||
return use_stale;
|
||||
}
|
||||
|
||||
bool PluginService::GetPluginInfo(int render_process_id,
|
||||
int render_view_id,
|
||||
const content::ResourceContext& context,
|
||||
|
@ -120,7 +120,17 @@ class CONTENT_EXPORT PluginService
|
||||
void CancelOpenChannelToNpapiPlugin(PluginProcessHost::Client* client);
|
||||
|
||||
// Gets the plugin in the list of plugins that matches the given url and mime
|
||||
// type. Must be called on the FILE thread if |use_stale| is NULL.
|
||||
// type. Returns true if the data is frome a stale plugin list, false if it
|
||||
// is up to date. This can be called from any thread.
|
||||
bool GetPluginInfoArray(const GURL& url,
|
||||
const std::string& mime_type,
|
||||
bool allow_wildcard,
|
||||
std::vector<webkit::WebPluginInfo>* info,
|
||||
std::vector<std::string>* actual_mime_types);
|
||||
|
||||
// Gets plugin info for an individual plugin and filters the plugins using
|
||||
// the |context| and renderer IDs. This will report whether the data is stale
|
||||
// via |is_stale| and returns whether or not the plugin can be found.
|
||||
bool GetPluginInfo(int render_process_id,
|
||||
int render_view_id,
|
||||
const content::ResourceContext& context,
|
||||
|
@ -39,7 +39,6 @@
|
||||
#include "webkit/glue/webpreferences.h"
|
||||
#include "webkit/glue/webaccessibility.h"
|
||||
#include "webkit/plugins/npapi/webplugin.h"
|
||||
#include "webkit/plugins/webplugininfo.h"
|
||||
|
||||
#if defined(OS_MACOSX)
|
||||
#include "content/common/mac/font_descriptor.h"
|
||||
@ -301,23 +300,6 @@ IPC_STRUCT_TRAITS_BEGIN(webkit::npapi::WebPluginGeometry)
|
||||
IPC_STRUCT_TRAITS_MEMBER(visible)
|
||||
IPC_STRUCT_TRAITS_END()
|
||||
|
||||
IPC_STRUCT_TRAITS_BEGIN(webkit::WebPluginMimeType)
|
||||
IPC_STRUCT_TRAITS_MEMBER(mime_type)
|
||||
IPC_STRUCT_TRAITS_MEMBER(file_extensions)
|
||||
IPC_STRUCT_TRAITS_MEMBER(description)
|
||||
IPC_STRUCT_TRAITS_MEMBER(additional_param_names)
|
||||
IPC_STRUCT_TRAITS_MEMBER(additional_param_values)
|
||||
IPC_STRUCT_TRAITS_END()
|
||||
|
||||
IPC_STRUCT_TRAITS_BEGIN(webkit::WebPluginInfo)
|
||||
IPC_STRUCT_TRAITS_MEMBER(name)
|
||||
IPC_STRUCT_TRAITS_MEMBER(path)
|
||||
IPC_STRUCT_TRAITS_MEMBER(version)
|
||||
IPC_STRUCT_TRAITS_MEMBER(desc)
|
||||
IPC_STRUCT_TRAITS_MEMBER(mime_types)
|
||||
IPC_STRUCT_TRAITS_MEMBER(type)
|
||||
IPC_STRUCT_TRAITS_END()
|
||||
|
||||
IPC_STRUCT_TRAITS_BEGIN(media::MediaLogEvent)
|
||||
IPC_STRUCT_TRAITS_MEMBER(id)
|
||||
IPC_STRUCT_TRAITS_MEMBER(type)
|
||||
@ -1478,8 +1460,7 @@ IPC_SYNC_MESSAGE_CONTROL1_1(ViewHostMsg_GetPlugins,
|
||||
// Return information about a plugin for the given URL and MIME
|
||||
// type. If there is no matching plugin, |found| is false.
|
||||
// |actual_mime_type| is the actual mime type supported by the
|
||||
// plugin found that match the URL given (one for each item in
|
||||
// |info|).
|
||||
// found plugin.
|
||||
IPC_SYNC_MESSAGE_CONTROL4_3(ViewHostMsg_GetPluginInfo,
|
||||
int /* routing_id */,
|
||||
GURL /* url */,
|
||||
|
@ -341,6 +341,70 @@ void ParamTraits<NPIdentifier_Param>::Log(const param_type& p, std::string* l) {
|
||||
}
|
||||
}
|
||||
|
||||
void ParamTraits<webkit::WebPluginMimeType>::Write(Message* m,
|
||||
const param_type& p) {
|
||||
WriteParam(m, p.mime_type);
|
||||
WriteParam(m, p.file_extensions);
|
||||
WriteParam(m, p.description);
|
||||
WriteParam(m, p.additional_param_names);
|
||||
WriteParam(m, p.additional_param_values);
|
||||
}
|
||||
|
||||
bool ParamTraits<webkit::WebPluginMimeType>::Read(const Message* m,
|
||||
void** iter,
|
||||
param_type* p) {
|
||||
return
|
||||
ReadParam(m, iter, &p->mime_type) &&
|
||||
ReadParam(m, iter, &p->file_extensions) &&
|
||||
ReadParam(m, iter, &p->description) &&
|
||||
ReadParam(m, iter, &p->additional_param_names) &&
|
||||
ReadParam(m, iter, &p->additional_param_values);
|
||||
}
|
||||
|
||||
void ParamTraits<webkit::WebPluginMimeType>::Log(
|
||||
const param_type& p, std::string* l) {
|
||||
l->append("(");
|
||||
LogParam(p.mime_type, l); l->append(", ");
|
||||
LogParam(p.file_extensions, l); l->append(", ");
|
||||
LogParam(p.description, l); l->append(", ");
|
||||
LogParam(p.additional_param_names, l); l->append(", ");
|
||||
LogParam(p.additional_param_values, l);
|
||||
l->append(")");
|
||||
}
|
||||
|
||||
void ParamTraits<webkit::WebPluginInfo>::Write(Message* m,
|
||||
const param_type& p) {
|
||||
WriteParam(m, p.name);
|
||||
WriteParam(m, p.path);
|
||||
WriteParam(m, p.version);
|
||||
WriteParam(m, p.desc);
|
||||
WriteParam(m, p.mime_types);
|
||||
WriteParam(m, p.type);
|
||||
}
|
||||
|
||||
bool ParamTraits<webkit::WebPluginInfo>::Read(const Message* m,
|
||||
void** iter,
|
||||
param_type* p) {
|
||||
return
|
||||
ReadParam(m, iter, &p->name) &&
|
||||
ReadParam(m, iter, &p->path) &&
|
||||
ReadParam(m, iter, &p->version) &&
|
||||
ReadParam(m, iter, &p->desc) &&
|
||||
ReadParam(m, iter, &p->mime_types) &&
|
||||
ReadParam(m, iter, &p->type);
|
||||
}
|
||||
void ParamTraits<webkit::WebPluginInfo>::Log(const param_type& p,
|
||||
std::string* l) {
|
||||
l->append("(");
|
||||
LogParam(p.name, l); l->append(", ");
|
||||
LogParam(p.path, l); l->append(", ");
|
||||
LogParam(p.version, l); l->append(", ");
|
||||
LogParam(p.desc, l); l->append(", ");
|
||||
LogParam(p.mime_types, l); l->append(", ");
|
||||
LogParam(p.type, l);
|
||||
l->append(")");
|
||||
}
|
||||
|
||||
void ParamTraits<webkit_glue::PasswordForm>::Write(Message* m,
|
||||
const param_type& p) {
|
||||
WriteParam(m, p.signon_realm);
|
||||
|
@ -26,6 +26,7 @@
|
||||
#include "webkit/glue/resource_type.h"
|
||||
#include "webkit/glue/webcursor.h"
|
||||
#include "webkit/glue/window_open_disposition.h"
|
||||
#include "webkit/plugins/webplugininfo.h"
|
||||
|
||||
namespace webkit_glue {
|
||||
struct PasswordForm;
|
||||
@ -112,6 +113,22 @@ struct ParamTraits<NPIdentifier_Param> {
|
||||
static void Log(const param_type& p, std::string* l);
|
||||
};
|
||||
|
||||
template <>
|
||||
struct ParamTraits<webkit::WebPluginMimeType> {
|
||||
typedef webkit::WebPluginMimeType param_type;
|
||||
static void Write(Message* m, const param_type& p);
|
||||
static bool Read(const Message* m, void** iter, param_type* r);
|
||||
static void Log(const param_type& p, std::string* l);
|
||||
};
|
||||
|
||||
template <>
|
||||
struct ParamTraits<webkit::WebPluginInfo> {
|
||||
typedef webkit::WebPluginInfo param_type;
|
||||
static void Write(Message* m, const param_type& p);
|
||||
static bool Read(const Message* m, void** iter, param_type* r);
|
||||
static void Log(const param_type& p, std::string* l);
|
||||
};
|
||||
|
||||
template <>
|
||||
struct ParamTraits<WebCursor> {
|
||||
typedef WebCursor param_type;
|
||||
|
@ -497,6 +497,37 @@ struct ParamTraits<std::vector<char> > {
|
||||
}
|
||||
};
|
||||
|
||||
template <>
|
||||
struct ParamTraits<std::vector<bool> > {
|
||||
typedef std::vector<bool> param_type;
|
||||
static void Write(Message* m, const param_type& p) {
|
||||
WriteParam(m, static_cast<int>(p.size()));
|
||||
for (size_t i = 0; i < p.size(); i++)
|
||||
WriteParam(m, p[i]);
|
||||
}
|
||||
static bool Read(const Message* m, void** iter, param_type* r) {
|
||||
int size;
|
||||
// ReadLength() checks for < 0 itself.
|
||||
if (!m->ReadLength(iter, &size))
|
||||
return false;
|
||||
r->resize(size);
|
||||
for (int i = 0; i < size; i++) {
|
||||
bool value;
|
||||
if (!ReadParam(m, iter, &value))
|
||||
return false;
|
||||
(*r)[i] = value;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
static void Log(const param_type& p, std::string* l) {
|
||||
for (size_t i = 0; i < p.size(); ++i) {
|
||||
if (i != 0)
|
||||
l->append(" ");
|
||||
LogParam((p[i]), l);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
template <class P>
|
||||
struct ParamTraits<std::vector<P> > {
|
||||
typedef std::vector<P> param_type;
|
||||
|
Reference in New Issue
Block a user