diff options
author | bauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-28 16:21:11 +0000 |
---|---|---|
committer | bauerb@chromium.org <bauerb@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-03-28 16:21:11 +0000 |
commit | 79fa3363afd7282bcde23b532b95e93e46eb55f3 (patch) | |
tree | 7127a544eb1c4b8152c777491c397577952bfbee | |
parent | f10e3c034464f49566faee354e6bcf64647d536b (diff) | |
download | chromium_src-79fa3363afd7282bcde23b532b95e93e46eb55f3.zip chromium_src-79fa3363afd7282bcde23b532b95e93e46eb55f3.tar.gz chromium_src-79fa3363afd7282bcde23b532b95e93e46eb55f3.tar.bz2 |
Revert 129322 - revert 128949 (and dependent 129252)
Original review URL: http://codereview.chromium.org/9874001
BUG=120273
TEST=none
TBR=thakis@chromium.org
Review URL: https://chromiumcodereview.appspot.com/9844016
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@129423 0039d316-1c4b-4281-b951-d872f2087c98
22 files changed, 772 insertions, 802 deletions
diff --git a/chrome/browser/extensions/extension_content_settings_apitest.cc b/chrome/browser/extensions/extension_content_settings_apitest.cc index 6938c12..a593fa7 100644 --- a/chrome/browser/extensions/extension_content_settings_apitest.cc +++ b/chrome/browser/extensions/extension_content_settings_apitest.cc @@ -103,8 +103,7 @@ IN_PROC_BROWSER_TEST_F(ExtensionApiTest, const char* kFooName = "Foo Plugin"; const char* kBarName = "Bar Plugin"; const webkit::npapi::PluginGroupDefinition kPluginDefinitions[] = { - { "foo", "Foo", kFooName, NULL, 0, - "http://example.com/foo" }, + { "foo", "Foo", kFooName, NULL, 0 }, }; webkit::npapi::MockPluginList plugin_list(kPluginDefinitions, diff --git a/chrome/browser/plugin_finder.cc b/chrome/browser/plugin_finder.cc index 2e90b54..2b66754 100644 --- a/chrome/browser/plugin_finder.cc +++ b/chrome/browser/plugin_finder.cc @@ -18,24 +18,35 @@ #include "grit/browser_resources.h" #include "ui/base/resource/resource_bundle.h" +using base::DictionaryValue; + +// static +void PluginFinder::Get(const base::Callback<void(PluginFinder*)>& cb) { + // At a later point we might want to do intialization here that needs to be + // done asynchronously, like loading the plug-in list from disk or from a URL. + MessageLoop::current()->PostTask(FROM_HERE, base::Bind(cb, GetInstance())); +} + // static PluginFinder* PluginFinder::GetInstance() { + // PluginFinder::GetInstance() is the only method that's allowed to call + // Singleton<PluginFinder>::get(). return Singleton<PluginFinder>::get(); } PluginFinder::PluginFinder() : plugin_list_(LoadPluginList()) { if (!plugin_list_.get()) { NOTREACHED(); - plugin_list_.reset(new base::ListValue()); + plugin_list_.reset(new DictionaryValue()); } } // static -scoped_ptr<base::ListValue> PluginFinder::LoadPluginList() { - return scoped_ptr<base::ListValue>(LoadPluginListInternal()).Pass(); +scoped_ptr<DictionaryValue> PluginFinder::LoadPluginList() { + return scoped_ptr<DictionaryValue>(LoadPluginListInternal()); } -base::ListValue* PluginFinder::LoadPluginListInternal() { +DictionaryValue* PluginFinder::LoadPluginListInternal() { #if defined(OS_WIN) || defined(OS_MACOSX) || defined(OS_LINUX) base::StringPiece json_resource( ResourceBundle::GetSharedInstance().GetRawDataResource( @@ -51,15 +62,11 @@ base::ListValue* PluginFinder::LoadPluginListInternal() { DLOG(ERROR) << error_str; return NULL; } - base::DictionaryValue* dict = NULL; - if (!value->GetAsDictionary(&dict)) + if (value->GetType() != base::Value::TYPE_DICTIONARY) return NULL; - base::ListValue* list = NULL; - if (!dict->GetList("plugins", &list)) - return NULL; - return list->DeepCopy(); + return static_cast<base::DictionaryValue*>(value.release()); #else - return new base::ListValue(); + return new DictionaryValue(); #endif } @@ -67,46 +74,58 @@ PluginFinder::~PluginFinder() { STLDeleteValues(&installers_); } -void PluginFinder::FindPlugin( - const std::string& mime_type, - const std::string& language, - const FindPluginCallback& callback) { - PluginInstaller* installer = FindPluginInternal(mime_type, language); - MessageLoop::current()->PostTask(FROM_HERE, base::Bind(callback, installer)); -} - -void PluginFinder::FindPluginWithIdentifier( - const std::string& identifier, - const FindPluginCallback& found_callback) { - PluginInstaller* installer = NULL; - std::map<std::string, PluginInstaller*>::const_iterator it = - installers_.find(identifier); - if (it != installers_.end()) { - installer = it->second; - } else { - for (ListValue::const_iterator plugin_it = plugin_list_->begin(); - plugin_it != plugin_list_->end(); ++plugin_it) { - const base::DictionaryValue* plugin = NULL; - if (!(*plugin_it)->GetAsDictionary(&plugin)) { - NOTREACHED(); - continue; - } - std::string id; - bool success = plugin->GetString("identifier", &id); +PluginInstaller* PluginFinder::FindPlugin(const std::string& mime_type, + const std::string& language) { + if (g_browser_process->local_state()->GetBoolean(prefs::kDisablePluginFinder)) + return NULL; + for (DictionaryValue::Iterator plugin_it(*plugin_list_); + plugin_it.HasNext(); plugin_it.Advance()) { + const DictionaryValue* plugin = NULL; + if (!plugin_it.value().GetAsDictionary(&plugin)) { + NOTREACHED(); + continue; + } + std::string language_str; + bool success = plugin->GetString("lang", &language_str); + DCHECK(success); + if (language_str != language) + continue; + ListValue* mime_types = NULL; + plugin->GetList("mime_types", &mime_types); + DCHECK(success); + for (ListValue::const_iterator mime_type_it = mime_types->begin(); + mime_type_it != mime_types->end(); ++mime_type_it) { + std::string mime_type_str; + success = (*mime_type_it)->GetAsString(&mime_type_str); DCHECK(success); - if (id == identifier) { - installer = CreateInstaller(identifier, plugin); - break; + if (mime_type_str == mime_type) { + std::string identifier = plugin_it.key(); + std::map<std::string, PluginInstaller*>::const_iterator installer = + installers_.find(identifier); + if (installer != installers_.end()) + return installer->second; + return CreateInstaller(identifier, plugin); } } } - MessageLoop::current()->PostTask(FROM_HERE, - base::Bind(found_callback, installer)); + return NULL; +} + +PluginInstaller* PluginFinder::FindPluginWithIdentifier( + const std::string& identifier) { + std::map<std::string, PluginInstaller*>::const_iterator it = + installers_.find(identifier); + if (it != installers_.end()) + return it->second; + DictionaryValue* plugin = NULL; + if (plugin_list_->GetDictionaryWithoutPathExpansion(identifier, &plugin)) + return CreateInstaller(identifier, plugin); + return NULL; } PluginInstaller* PluginFinder::CreateInstaller( const std::string& identifier, - const base::DictionaryValue* plugin_dict) { + const DictionaryValue* plugin_dict) { DCHECK(!installers_[identifier]); std::string url; bool success = plugin_dict->GetString("url", &url); @@ -118,52 +137,14 @@ PluginInstaller* PluginFinder::CreateInstaller( DCHECK(success); bool display_url = false; plugin_dict->GetBoolean("displayurl", &display_url); - PluginInstaller*installer = new PluginInstaller(identifier, - GURL(url), - GURL(help_url), - name, - display_url); + bool requires_authorization = true; + plugin_dict->GetBoolean("requires_authorization", &requires_authorization); + PluginInstaller* installer = new PluginInstaller(identifier, + GURL(url), + GURL(help_url), + name, + display_url, + requires_authorization); installers_[identifier] = installer; return installer; } - -PluginInstaller* PluginFinder::FindPluginInternal( - const std::string& mime_type, - const std::string& language) { - if (!g_browser_process->local_state()->GetBoolean( - prefs::kDisablePluginFinder)) { - for (ListValue::const_iterator plugin_it = plugin_list_->begin(); - plugin_it != plugin_list_->end(); ++plugin_it) { - const base::DictionaryValue* plugin = NULL; - if (!(*plugin_it)->GetAsDictionary(&plugin)) { - NOTREACHED(); - continue; - } - std::string language_str; - bool success = plugin->GetString("lang", &language_str); - DCHECK(success); - if (language_str != language) - continue; - ListValue* mime_types = NULL; - success = plugin->GetList("mime_types", &mime_types); - DCHECK(success); - for (ListValue::const_iterator mime_type_it = mime_types->begin(); - mime_type_it != mime_types->end(); ++mime_type_it) { - std::string mime_type_str; - success = (*mime_type_it)->GetAsString(&mime_type_str); - DCHECK(success); - if (mime_type_str == mime_type) { - std::string identifier; - bool success = plugin->GetString("identifier", &identifier); - DCHECK(success); - std::map<std::string, PluginInstaller*>::const_iterator it = - installers_.find(identifier); - if (it != installers_.end()) - return it->second; - return CreateInstaller(identifier, plugin); - } - } - } - } - return NULL; -} diff --git a/chrome/browser/plugin_finder.h b/chrome/browser/plugin_finder.h index 2b1bd49..1667411e 100644 --- a/chrome/browser/plugin_finder.h +++ b/chrome/browser/plugin_finder.h @@ -16,7 +16,6 @@ namespace base { class DictionaryValue; -class ListValue; } class GURL; @@ -24,39 +23,36 @@ class PluginInstaller; class PluginFinder { public: - typedef base::Callback<void(PluginInstaller*)> FindPluginCallback; - - static PluginFinder* GetInstance(); + static void Get(const base::Callback<void(PluginFinder*)>& cb); // Loads the plug-in information from the browser resources and parses it. // Returns NULL if the plug-in list couldn't be parsed. - static scoped_ptr<base::ListValue> LoadPluginList(); + static scoped_ptr<base::DictionaryValue> LoadPluginList(); // Finds a plug-in for the given MIME type and language (specified as an IETF - // language tag, i.e. en-US) and calls the callback with the PluginInstaller - // for the plug-in, or NULL if no plug-in is found. - void FindPlugin(const std::string& mime_type, - const std::string& language, - const FindPluginCallback& callback); + // language tag, i.e. en-US) and returns the PluginInstaller for the plug-in, + // or NULL if no plug-in is found. + PluginInstaller* FindPlugin(const std::string& mime_type, + const std::string& language); - // Finds the plug-in with the given identifier and calls the callback. - void FindPluginWithIdentifier(const std::string& identifier, - const FindPluginCallback& callback); + // Returns the plug-in with the given identifier. + PluginInstaller* FindPluginWithIdentifier(const std::string& identifier); private: friend struct DefaultSingletonTraits<PluginFinder>; + friend class Singleton<PluginFinder>; + + static PluginFinder* GetInstance(); PluginFinder(); ~PluginFinder(); - static base::ListValue* LoadPluginListInternal(); + static base::DictionaryValue* LoadPluginListInternal(); PluginInstaller* CreateInstaller(const std::string& identifier, const base::DictionaryValue* plugin_dict); - PluginInstaller* FindPluginInternal(const std::string& mime_type, - const std::string& language); - scoped_ptr<base::ListValue> plugin_list_; + scoped_ptr<base::DictionaryValue> plugin_list_; std::map<std::string, PluginInstaller*> installers_; DISALLOW_COPY_AND_ASSIGN(PluginFinder); diff --git a/chrome/browser/plugin_finder_unittest.cc b/chrome/browser/plugin_finder_unittest.cc index e69036d..8a07769 100644 --- a/chrome/browser/plugin_finder_unittest.cc +++ b/chrome/browser/plugin_finder_unittest.cc @@ -8,20 +8,25 @@ #include "testing/gtest/include/gtest/gtest.h" using base::DictionaryValue; -using base::ListValue; TEST(PluginFinderTest, JsonSyntax) { - scoped_ptr<ListValue> plugin_list(PluginFinder::LoadPluginList()); + scoped_ptr<DictionaryValue> plugin_list(PluginFinder::LoadPluginList()); ASSERT_TRUE(plugin_list.get()); - for (ListValue::const_iterator plugin_it = plugin_list->begin(); - plugin_it != plugin_list->end(); ++plugin_it) { + for (DictionaryValue::Iterator plugin_it(*plugin_list); + plugin_it.HasNext(); plugin_it.Advance()) { const DictionaryValue* plugin = NULL; - ASSERT_TRUE((*plugin_it)->GetAsDictionary(&plugin)); + ASSERT_TRUE(plugin_it.value().GetAsDictionary(&plugin)); std::string dummy_str; + bool dummy_bool; EXPECT_TRUE(plugin->GetString("lang", &dummy_str)); - EXPECT_TRUE(plugin->GetString("identifier", &dummy_str)); EXPECT_TRUE(plugin->GetString("url", &dummy_str)); EXPECT_TRUE(plugin->GetString("name", &dummy_str)); + if (plugin->HasKey("help_url")) + EXPECT_TRUE(plugin->GetString("help_url", &dummy_str)); + if (plugin->HasKey("displayurl")) + EXPECT_TRUE(plugin->GetBoolean("displayurl", &dummy_bool)); + if (plugin->HasKey("requires_authorization")) + EXPECT_TRUE(plugin->GetBoolean("requires_authorization", &dummy_bool)); ListValue* mime_types = NULL; ASSERT_TRUE(plugin->GetList("mime_types", &mime_types)); for (ListValue::const_iterator mime_type_it = mime_types->begin(); diff --git a/chrome/browser/plugin_installer.cc b/chrome/browser/plugin_installer.cc index 80c45c9..7f2f66a 100644 --- a/chrome/browser/plugin_installer.cc +++ b/chrome/browser/plugin_installer.cc @@ -64,13 +64,15 @@ PluginInstaller::PluginInstaller(const std::string& identifier, const GURL& plugin_url, const GURL& help_url, const string16& name, - bool url_for_display) + bool url_for_display, + bool requires_authorization) : state_(kStateIdle), identifier_(identifier), plugin_url_(plugin_url), help_url_(help_url), name_(name), - url_for_display_(url_for_display) { + url_for_display_(url_for_display), + requires_authorization_(requires_authorization) { } PluginInstaller::~PluginInstaller() { diff --git a/chrome/browser/plugin_installer.h b/chrome/browser/plugin_installer.h index 0b43113..b3a9f53 100644 --- a/chrome/browser/plugin_installer.h +++ b/chrome/browser/plugin_installer.h @@ -33,7 +33,8 @@ class PluginInstaller : public content::DownloadItem::Observer { const GURL& plugin_url, const GURL& help_url, const string16& name, - bool url_for_display); + bool url_for_display, + bool requires_authorization); virtual ~PluginInstaller(); virtual void OnDownloadUpdated(content::DownloadItem* download) OVERRIDE; @@ -55,6 +56,9 @@ class PluginInstaller : public content::DownloadItem::Observer { // Human-readable name of the plug-in. const string16& name() const { return name_; } + // Whether the plug-in requires user authorization to run. + bool requires_authorization() const { return requires_authorization_; } + // If |url_for_display| is false, |plugin_url| is the URL of the download page // for the plug-in, which should be opened in a new tab. If it is true, // |plugin_url| is the URL of the plug-in installer binary, which can be @@ -90,6 +94,7 @@ class PluginInstaller : public content::DownloadItem::Observer { GURL help_url_; string16 name_; bool url_for_display_; + bool requires_authorization_; DISALLOW_COPY_AND_ASSIGN(PluginInstaller); }; diff --git a/chrome/browser/plugin_observer.cc b/chrome/browser/plugin_observer.cc index 3660d2f..25fd4af 100644 --- a/chrome/browser/plugin_observer.cc +++ b/chrome/browser/plugin_observer.cc @@ -118,6 +118,7 @@ class PluginObserver::PluginPlaceholderHost : public PluginInstallerObserver { : PluginInstallerObserver(installer), observer_(observer), routing_id_(routing_id) { + DCHECK(installer); switch (installer->state()) { case PluginInstaller::kStateIdle: { observer->Send(new ChromeViewMsg_FoundMissingPlugin(routing_id_, @@ -201,11 +202,9 @@ void PluginObserver::OnBlockedUnauthorizedPlugin(const string16& name) { void PluginObserver::OnBlockedOutdatedPlugin(int placeholder_id, const std::string& identifier) { #if defined(ENABLE_PLUGIN_INSTALLATION) - PluginFinder* plugin_finder = PluginFinder::GetInstance(); - plugin_finder->FindPluginWithIdentifier( - identifier, - base::Bind(&PluginObserver::FoundPluginToUpdate, - weak_ptr_factory_.GetWeakPtr(), placeholder_id)); + PluginFinder::Get(base::Bind(&PluginObserver::FindPluginToUpdate, + weak_ptr_factory_.GetWeakPtr(), + placeholder_id, identifier)); #else // If we don't support third-party plug-in installation, we shouldn't have // outdated plug-ins. @@ -214,8 +213,11 @@ void PluginObserver::OnBlockedOutdatedPlugin(int placeholder_id, } #if defined(ENABLE_PLUGIN_INSTALLATION) -void PluginObserver::FoundPluginToUpdate(int placeholder_id, - PluginInstaller* installer) { +void PluginObserver::FindPluginToUpdate(int placeholder_id, + const std::string& identifier, + PluginFinder* plugin_finder) { + PluginInstaller* installer = + plugin_finder->FindPluginWithIdentifier(identifier); plugin_placeholders_[placeholder_id] = new PluginPlaceholderHost(this, placeholder_id, installer); InfoBarTabHelper* infobar_helper = tab_contents_->infobar_tab_helper(); @@ -225,17 +227,16 @@ void PluginObserver::FoundPluginToUpdate(int placeholder_id, void PluginObserver::OnFindMissingPlugin(int placeholder_id, const std::string& mime_type) { - PluginFinder* plugin_finder = PluginFinder::GetInstance(); - std::string lang = "en-US"; // Oh yes. - plugin_finder->FindPlugin( - mime_type, lang, - base::Bind(&PluginObserver::FoundMissingPlugin, - weak_ptr_factory_.GetWeakPtr(), placeholder_id, mime_type)); +PluginFinder::Get(base::Bind(&PluginObserver::FindMissingPlugin, + weak_ptr_factory_.GetWeakPtr(), + placeholder_id, mime_type)); } -void PluginObserver::FoundMissingPlugin(int placeholder_id, - const std::string& mime_type, - PluginInstaller* installer) { +void PluginObserver::FindMissingPlugin(int placeholder_id, + const std::string& mime_type, + PluginFinder* plugin_finder) { + std::string lang = "en-US"; // Oh yes. + PluginInstaller* installer = plugin_finder->FindPlugin(mime_type, lang); if (!installer) { Send(new ChromeViewMsg_DidNotFindMissingPlugin(placeholder_id)); return; diff --git a/chrome/browser/plugin_observer.h b/chrome/browser/plugin_observer.h index 44f7b03..4cce117 100644 --- a/chrome/browser/plugin_observer.h +++ b/chrome/browser/plugin_observer.h @@ -15,7 +15,7 @@ class GURL; class InfoBarDelegate; -class PluginInstaller; +class PluginFinder; class TabContentsWrapper; #if defined(ENABLE_PLUGIN_INSTALLATION) @@ -46,11 +46,12 @@ class PluginObserver : public content::WebContentsObserver { #if defined(ENABLE_PLUGIN_INSTALLATION) void OnFindMissingPlugin(int placeholder_id, const std::string& mime_type); - void FoundMissingPlugin(int placeholder_id, - const std::string& mime_type, - PluginInstaller* installer); - void FoundPluginToUpdate(int placeholder_id, - PluginInstaller* installer); + void FindMissingPlugin(int placeholder_id, + const std::string& mime_type, + PluginFinder* plugin_finder); + void FindPluginToUpdate(int placeholder_id, + const std::string& identifier, + PluginFinder* plugin_finder); void OnRemovePluginPlaceholderHost(int placeholder_id); #endif void OnOpenAboutPlugins(); diff --git a/chrome/browser/renderer_host/plugin_info_message_filter.cc b/chrome/browser/renderer_host/plugin_info_message_filter.cc index cc13c86..11864a7 100644 --- a/chrome/browser/renderer_host/plugin_info_message_filter.cc +++ b/chrome/browser/renderer_host/plugin_info_message_filter.cc @@ -21,6 +21,11 @@ #include "webkit/plugins/npapi/plugin_group.h" #include "webkit/plugins/npapi/plugin_list.h" +#if defined(ENABLE_PLUGIN_INSTALLATION) +#include "chrome/browser/plugin_finder.h" +#include "chrome/browser/plugin_installer.h" +#endif + #if defined(OS_WIN) // These includes are only necessary for the PluginInfobarExperiment. #include "chrome/common/attrition_experiments.h" @@ -143,7 +148,31 @@ void PluginInfoMessageFilter::PluginsLoaded( ChromeViewHostMsg_GetPluginInfo_Status status; webkit::WebPluginInfo plugin; std::string actual_mime_type; - context_.DecidePluginStatus(params, &status, &plugin, &actual_mime_type); + // This also fills in |actual_mime_type|. + if (!context_.FindEnabledPlugin(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); + return; + } +#if defined(ENABLE_PLUGIN_INSTALLATION) + PluginFinder::Get(base::Bind(&PluginInfoMessageFilter::GotPluginFinder, this, + params, reply_msg, plugin, actual_mime_type)); +#else + GotPluginFinder(params, reply_msg, plugin, actual_mime_type, NULL); +#endif +} + +void PluginInfoMessageFilter::GotPluginFinder( + const GetPluginInfo_Params& params, + IPC::Message* reply_msg, + const webkit::WebPluginInfo& plugin, + const std::string& actual_mime_type, + PluginFinder* plugin_finder) { + ChromeViewHostMsg_GetPluginInfo_Status status; + context_.DecidePluginStatus(params, plugin, plugin_finder, &status); ChromeViewHostMsg_GetPluginInfo::WriteReplyParams( reply_msg, status, plugin, actual_mime_type); Send(reply_msg); @@ -151,24 +180,16 @@ void PluginInfoMessageFilter::PluginsLoaded( void PluginInfoMessageFilter::Context::DecidePluginStatus( const GetPluginInfo_Params& params, - ChromeViewHostMsg_GetPluginInfo_Status* status, - webkit::WebPluginInfo* plugin, - std::string* actual_mime_type) const { - status->value = ChromeViewHostMsg_GetPluginInfo_Status::kAllowed; - // This also fills in |actual_mime_type|. - if (FindEnabledPlugin(params.render_view_id, params.url, - params.top_origin_url, params.mime_type, - status, plugin, actual_mime_type)) { - return; - } + const webkit::WebPluginInfo& plugin, + PluginFinder* plugin_finder, + ChromeViewHostMsg_GetPluginInfo_Status* status) const { + scoped_ptr<webkit::npapi::PluginGroup> group( + webkit::npapi::PluginList::Singleton()->GetPluginGroup(plugin)); ContentSetting plugin_setting = CONTENT_SETTING_DEFAULT; bool uses_default_content_setting = true; // Check plug-in content settings. The primary URL is the top origin URL and // the secondary URL is the plug-in URL. - scoped_ptr<webkit::npapi::PluginGroup> group( - webkit::npapi::PluginList::Singleton()->GetPluginGroup(*plugin)); - GetPluginContentSetting(plugin, params.top_origin_url, params.url, group->identifier(), &plugin_setting, &uses_default_content_setting); @@ -180,7 +201,7 @@ void PluginInfoMessageFilter::Context::DecidePluginStatus( PluginInfobarExperiment(&allow_outdated, &always_authorize); // Check if the plug-in is outdated. - if (group->IsVulnerable(*plugin) && !allow_outdated) { + if (group->IsVulnerable(plugin) && !allow_outdated) { if (allow_outdated_plugins_.IsManaged()) { status->value = ChromeViewHostMsg_GetPluginInfo_Status::kOutdatedDisallowed; @@ -191,9 +212,13 @@ void PluginInfoMessageFilter::Context::DecidePluginStatus( return; } +#if defined(ENABLE_PLUGIN_INSTALLATION) // Check if the plug-in requires authorization. - if ((group->RequiresAuthorization(*plugin) || - PluginService::GetInstance()->IsPluginUnstable(plugin->path)) && + // TODO(bauerb): This should be a plain struct with the plug-in information. + PluginInstaller* installer = + plugin_finder->FindPluginWithIdentifier(group->identifier()); + if (((installer && installer->requires_authorization()) || + PluginService::GetInstance()->IsPluginUnstable(plugin.path)) && !always_authorize && plugin_setting != CONTENT_SETTING_BLOCK && uses_default_content_setting) { @@ -201,6 +226,7 @@ void PluginInfoMessageFilter::Context::DecidePluginStatus( ChromeViewHostMsg_GetPluginInfo_Status::kUnauthorized; return; } +#endif if (plugin_setting == CONTENT_SETTING_ASK) status->value = ChromeViewHostMsg_GetPluginInfo_Status::kClickToPlay; @@ -236,7 +262,7 @@ bool PluginInfoMessageFilter::Context::FindEnabledPlugin( *actual_mime_type = mime_types[i]; if (enabled) { // We have found an enabled plug-in. Return immediately. - return false; + return true; } // We have found a plug-in, but it's disabled. Keep looking for an // enabled one. @@ -250,18 +276,18 @@ bool PluginInfoMessageFilter::Context::FindEnabledPlugin( status->value = ChromeViewHostMsg_GetPluginInfo_Status::kDisabled; else status->value = ChromeViewHostMsg_GetPluginInfo_Status::kNotFound; - return true; + return false; } void PluginInfoMessageFilter::Context::GetPluginContentSetting( - const webkit::WebPluginInfo* plugin, + const webkit::WebPluginInfo& plugin, const GURL& policy_url, const GURL& plugin_url, const std::string& resource, ContentSetting* setting, bool* uses_default_content_setting) const { // Treat Native Client invocations like Javascript. - bool is_nacl_plugin = (plugin->name == ASCIIToUTF16( + bool is_nacl_plugin = (plugin.name == ASCIIToUTF16( chrome::ChromeContentClient::kNaClPluginName)); scoped_ptr<base::Value> value; diff --git a/chrome/browser/renderer_host/plugin_info_message_filter.h b/chrome/browser/renderer_host/plugin_info_message_filter.h index 8cade72..f0f6e35 100644 --- a/chrome/browser/renderer_host/plugin_info_message_filter.h +++ b/chrome/browser/renderer_host/plugin_info_message_filter.h @@ -18,6 +18,7 @@ struct ChromeViewHostMsg_GetPluginInfo_Status; class GURL; class HostContentSettingsMap; +class PluginFinder; class Profile; namespace content { @@ -26,6 +27,9 @@ class ResourceContext; namespace webkit { struct WebPluginInfo; +namespace npapi { +class PluginGroup; +} } // This class filters out incoming IPC messages requesting plug-in information. @@ -41,10 +45,11 @@ class PluginInfoMessageFilter : public content::BrowserMessageFilter { Context(); ~Context(); - void DecidePluginStatus(const GetPluginInfo_Params& params, - ChromeViewHostMsg_GetPluginInfo_Status* status, - webkit::WebPluginInfo* plugin, - std::string* actual_mime_type) const; + void DecidePluginStatus( + const GetPluginInfo_Params& params, + const webkit::WebPluginInfo& plugin, + PluginFinder* plugin_finder, + ChromeViewHostMsg_GetPluginInfo_Status* status) const; bool FindEnabledPlugin(int render_view_id, const GURL& url, const GURL& top_origin_url, @@ -52,7 +57,7 @@ class PluginInfoMessageFilter : public content::BrowserMessageFilter { ChromeViewHostMsg_GetPluginInfo_Status* status, webkit::WebPluginInfo* plugin, std::string* actual_mime_type) const; - void GetPluginContentSetting(const webkit::WebPluginInfo* plugin, + void GetPluginContentSetting(const webkit::WebPluginInfo& plugin, const GURL& policy_url, const GURL& plugin_url, const std::string& resource, @@ -89,6 +94,12 @@ class PluginInfoMessageFilter : public content::BrowserMessageFilter { IPC::Message* reply_msg, const std::vector<webkit::WebPluginInfo>& plugins); + void GotPluginFinder(const GetPluginInfo_Params& params, + IPC::Message* reply_msg, + const webkit::WebPluginInfo& plugin, + const std::string& actual_mime_type, + PluginFinder* plugin_finder); + Context context_; base::WeakPtrFactory<PluginInfoMessageFilter> weak_ptr_factory_; diff --git a/chrome/browser/renderer_host/plugin_info_message_filter_unittest.cc b/chrome/browser/renderer_host/plugin_info_message_filter_unittest.cc index 9950e4f..b822dd1 100644 --- a/chrome/browser/renderer_host/plugin_info_message_filter_unittest.cc +++ b/chrome/browser/renderer_host/plugin_info_message_filter_unittest.cc @@ -120,7 +120,7 @@ TEST_F(PluginInfoMessageFilterTest, FindEnabledPlugin) { ChromeViewHostMsg_GetPluginInfo_Status status; webkit::WebPluginInfo plugin; std::string actual_mime_type; - EXPECT_FALSE(context_.FindEnabledPlugin( + EXPECT_TRUE(context_.FindEnabledPlugin( 0, GURL(), GURL(), "foo/bar", &status, &plugin, &actual_mime_type)); EXPECT_EQ(ChromeViewHostMsg_GetPluginInfo_Status::kAllowed, status.value); EXPECT_EQ(foo_plugin_path_.value(), plugin.path.value()); @@ -131,7 +131,7 @@ TEST_F(PluginInfoMessageFilterTest, FindEnabledPlugin) { ChromeViewHostMsg_GetPluginInfo_Status status; webkit::WebPluginInfo plugin; std::string actual_mime_type; - EXPECT_FALSE(context_.FindEnabledPlugin( + EXPECT_TRUE(context_.FindEnabledPlugin( 0, GURL(), GURL(), "foo/bar", &status, &plugin, &actual_mime_type)); EXPECT_EQ(ChromeViewHostMsg_GetPluginInfo_Status::kAllowed, status.value); EXPECT_EQ(bar_plugin_path_.value(), plugin.path.value()); @@ -142,7 +142,7 @@ TEST_F(PluginInfoMessageFilterTest, FindEnabledPlugin) { ChromeViewHostMsg_GetPluginInfo_Status status; webkit::WebPluginInfo plugin; std::string actual_mime_type; - EXPECT_TRUE(context_.FindEnabledPlugin( + EXPECT_FALSE(context_.FindEnabledPlugin( 0, GURL(), GURL(), "foo/bar", &status, &plugin, &actual_mime_type)); EXPECT_EQ(ChromeViewHostMsg_GetPluginInfo_Status::kDisabled, status.value); EXPECT_EQ(foo_plugin_path_.value(), plugin.path.value()); @@ -151,7 +151,7 @@ TEST_F(PluginInfoMessageFilterTest, FindEnabledPlugin) { ChromeViewHostMsg_GetPluginInfo_Status status; webkit::WebPluginInfo plugin; std::string actual_mime_type; - EXPECT_TRUE(context_.FindEnabledPlugin( + EXPECT_FALSE(context_.FindEnabledPlugin( 0, GURL(), GURL(), "baz/blurp", &status, &plugin, &actual_mime_type)); EXPECT_EQ(ChromeViewHostMsg_GetPluginInfo_Status::kNotFound, status.value); EXPECT_EQ(FILE_PATH_LITERAL(""), plugin.path.value()); diff --git a/chrome/browser/resources/plugins_linux.json b/chrome/browser/resources/plugins_linux.json index d410de0..e56f226 100644 --- a/chrome/browser/resources/plugins_linux.json +++ b/chrome/browser/resources/plugins_linux.json @@ -1,66 +1,62 @@ { - "plugins": [ - { - "mime_types": [ - "application/x-java-applet", - "application/x-java-applet,version=1.1", - "application/x-java-applet,version=1.1.1", - "application/x-java-applet,version=1.1.2", - "application/x-java-applet,version=1.1.3", - "application/x-java-applet,version=1.2", - "application/x-java-applet,version=1.2.1", - "application/x-java-applet,version=1.2.2", - "application/x-java-applet,version=1.3", - "application/x-java-applet,version=1.3.1", - "application/x-java-applet,version=1.4", - "application/x-java-applet,version=1.4.1", - "application/x-java-applet,version=1.4.2", - "application/x-java-applet,version=1.5", - "application/x-java-applet,version=1.6", - "application/x-java-bean", - "application/x-java-bean,version=1.1", - "application/x-java-bean,version=1.1.1", - "application/x-java-bean,version=1.1.2", - "application/x-java-bean,version=1.1.3", - "application/x-java-bean,version=1.2", - "application/x-java-bean,version=1.2.1", - "application/x-java-bean,version=1.2.2", - "application/x-java-bean,version=1.3", - "application/x-java-bean,version=1.3.1", - "application/x-java-bean,version=1.4", - "application/x-java-bean,version=1.4.1", - "application/x-java-bean,version=1.4.2", - "application/x-java-bean,version=1.5", - "application/x-java-bean,version=1.6", - "application/x-java-vm" - ], - "lang": "en-US", - "name": "Java(TM)", - "identifier": "java-runtime-environment", - "help_url": "https://support.google.com/chrome/?p=plugin_java", - "url": "http://java.com/download", - "displayurl": true - }, - { - "mime_types": [ - "application/futuresplash", - "application/x-shockwave-flash" - ], - "lang": "en-US", - "name": "Adobe Flash Player", - "identifier": "adobe-flash-player", - "help_url": "https://support.google.com/chrome/?p=plugin_flash", - "url": "http://get.adobe.com/flashplayer/", - "displayurl": true - }, - { - "mime_types": [ - ], - "lang": "en-US", - "name": "IcedTea", - "identifier": "redhat-icetea-java", - "url": "http://icedtea.classpath.org/", - "displayurl": true - } - ] + "java-runtime-environment": { + "mime_types": [ + "application/x-java-applet", + "application/x-java-applet,version=1.1", + "application/x-java-applet,version=1.1.1", + "application/x-java-applet,version=1.1.2", + "application/x-java-applet,version=1.1.3", + "application/x-java-applet,version=1.2", + "application/x-java-applet,version=1.2.1", + "application/x-java-applet,version=1.2.2", + "application/x-java-applet,version=1.3", + "application/x-java-applet,version=1.3.1", + "application/x-java-applet,version=1.4", + "application/x-java-applet,version=1.4.1", + "application/x-java-applet,version=1.4.2", + "application/x-java-applet,version=1.5", + "application/x-java-applet,version=1.6", + "application/x-java-bean", + "application/x-java-bean,version=1.1", + "application/x-java-bean,version=1.1.1", + "application/x-java-bean,version=1.1.2", + "application/x-java-bean,version=1.1.3", + "application/x-java-bean,version=1.2", + "application/x-java-bean,version=1.2.1", + "application/x-java-bean,version=1.2.2", + "application/x-java-bean,version=1.3", + "application/x-java-bean,version=1.3.1", + "application/x-java-bean,version=1.4", + "application/x-java-bean,version=1.4.1", + "application/x-java-bean,version=1.4.2", + "application/x-java-bean,version=1.5", + "application/x-java-bean,version=1.6", + "application/x-java-vm" + ], + "lang": "en-US", + "name": "Java(TM)", + "help_url": "https://support.google.com/chrome/?p=plugin_java", + "url": "http://java.com/download", + "displayurl": true + }, + "adobe-flash-player": { + "mime_types": [ + "application/futuresplash", + "application/x-shockwave-flash" + ], + "lang": "en-US", + "name": "Adobe Flash Player", + "help_url": "https://support.google.com/chrome/?p=plugin_flash", + "url": "http://get.adobe.com/flashplayer/", + "requires_authorization": false, + "displayurl": true + }, + "redhat-icetea-java": { + "mime_types": [ + ], + "lang": "en-US", + "name": "IcedTea", + "url": "http://icedtea.classpath.org/", + "displayurl": true + } } diff --git a/chrome/browser/resources/plugins_mac.json b/chrome/browser/resources/plugins_mac.json index ad1f70d..2465ece 100644 --- a/chrome/browser/resources/plugins_mac.json +++ b/chrome/browser/resources/plugins_mac.json @@ -1,198 +1,190 @@ { - "plugins": [ - { - "mime_types": [ - "application/x-java-applet", - "application/x-java-applet,version=1.1", - "application/x-java-applet,version=1.1.1", - "application/x-java-applet,version=1.1.2", - "application/x-java-applet,version=1.1.3", - "application/x-java-applet,version=1.2", - "application/x-java-applet,version=1.2.1", - "application/x-java-applet,version=1.2.2", - "application/x-java-applet,version=1.3", - "application/x-java-applet,version=1.3.1", - "application/x-java-applet,version=1.4", - "application/x-java-applet,version=1.4.1", - "application/x-java-applet,version=1.4.2", - "application/x-java-applet,version=1.5", - "application/x-java-applet,version=1.6", - "application/x-java-bean", - "application/x-java-bean,version=1.1", - "application/x-java-bean,version=1.1.1", - "application/x-java-bean,version=1.1.2", - "application/x-java-bean,version=1.1.3", - "application/x-java-bean,version=1.2", - "application/x-java-bean,version=1.2.1", - "application/x-java-bean,version=1.2.2", - "application/x-java-bean,version=1.3", - "application/x-java-bean,version=1.3.1", - "application/x-java-bean,version=1.4", - "application/x-java-bean,version=1.4.1", - "application/x-java-bean,version=1.4.2", - "application/x-java-bean,version=1.5", - "application/x-java-bean,version=1.6", - "application/x-java-vm" - ], - "lang": "en-US", - "name": "Java(TM)", - "identifier": "java-runtime-environment", - "url": "http://java.com/en/download/apple_manual.jsp", - "help_url": "https://support.google.com/chrome/?p=plugin_java", - "displayurl": true - }, - { - "mime_types": [ - "audio/vnd.rn-realaudio", - "video/vnd.rn-realvideo", - "audio/x-pn-realaudio-plugin", - "audio/x-pn-realaudio" - ], - "lang": "en-US", - "name": "RealPlayer", - "identifier": "realplayer", - "url": "http://director.real.com/realplayer?type=rpsp_mac", - "help_url": "https://support.google.com/chrome/?p=plugin_real" - }, - { - "mime_types": [ - "application/futuresplash", - "application/x-shockwave-flash" - ], - "lang": "en-US", - "name": "Adobe Flash Player", - "identifier": "adobe-flash-player", - "url": "http://get.adobe.com/flashplayer/", - "help_url": "https://support.google.com/chrome/?p=plugin_flash", - "displayurl": true - }, - { - "mime_types": [ - "application/x-director" - ], - "lang": "en-US", - "name": "Adobe Shockwave Player", - "identifier": "shockwave", - "url": "http://www.adobe.com/shockwave/download/", - "help_url": "https://support.google.com/chrome/?p=plugin_shockwave", - "displayurl": true - }, - { - "mime_types": [ - "application/pdf", - "application/vnd.adobe.x-mars", - "application/vnd.adobe.xdp+xml", - "application/vnd.adobe.xfd+xml", - "application/vnd.adobe.xfdf", - "application/vnd.fdf" - ], - "lang": "en-US", - "name": "Adobe Reader", - "identifier": "adobe-reader", - "url": "http://get.adobe.com/reader/", - "help_url": "https://support.google.com/chrome/?p=plugin_pdf", - "displayurl": true - }, - { - "mime_types": [ - "application/sdp", - "application/x-mpeg", - "application/x-rtsp", - "application/x-sdp", - "audio/3ggp", - "audio/3ggp2", - "audio/aac", - "audio/ac3", - "audio/aiff", - "audio/amr", - "audio/basic", - "audio/mid", - "audio/midi", - "audio/mp4", - "audio/mpeg", - "audio/vnd.qcelp", - "audio/wav", - "audio/x-aac", - "audio/x-ac3", - "audio/x-aiff", - "audio/x-caf", - "audio/x-gsm", - "audio/x-m4a", - "audio/x-m4b", - "audio/x-m4p", - "audio/x-midi", - "audio/x-mpeg", - "audio/x-wav", - "image/jp2", - "image/jpeg2000", - "image/jpeg2000-image", - "image/pict", - "image/png", - "image/x-jpeg2000-image", - "image/x-macpaint", - "image/x-pict", - "image/x-png", - "image/x-quicktime", - "image/x-sgi", - "image/x-targa", - "video/3ggp", - "video/3ggp2", - "video/flc", - "video/mp4", - "video/mpeg", - "video/quicktime", - "video/sd-video", - "video/x-m4v", - "video/x-mpeg" - ], - "lang": "en-US", - "name": "QuickTime Player", - "identifier": "apple-quicktime", - "url": "http://www.apple.com/quicktime/download/", - "help_url": "https://support.google.com/chrome/?p=plugin_quicktime", - "displayurl": true - }, - { - "mime_types": [ - "application/asx", - "application/x-mplayer2", - "application/x-ms-wmp", - "audio/x-ms-wax", - "audio/x-ms-wma", - "video/x-ms-asf", - "video/x-ms-asf-plugin", - "video/x-ms-wm", - "video/x-ms-wmv", - "video/x-ms-wvx" - ], - "lang": "en-US", - "name": "Flip4Mac", - "identifier": "flip4mac", - "url": "http://www.microsoft.com/download/en/confirmation.aspx?id=9442", - "help_url": "https://support.google.com/chrome/?p=plugin_wmp", - "displayurl": true - }, - { - "mime_types": [ - "video/divx", - "video/x-matroska" - ], - "lang": "en-US", - "name": "DivX Web Player", - "identifier": "divx-player", - "url": "http://www.divx.com/en/downloads/divx/mac", - "help_url": "https://support.google.com/chrome/?p=plugin_divx" - }, - { - "mime_types": [ - "application/x-silverlight", - "application/x-silverlight-2" - ], - "lang": "en-US", - "name": "Silverlight", - "identifier": "silverlight", - "url": "http://go.microsoft.com/fwlink/?LinkID=149156", - "displayurl": true - } - ] + "java-runtime-environment": { + "mime_types": [ + "application/x-java-applet", + "application/x-java-applet,version=1.1", + "application/x-java-applet,version=1.1.1", + "application/x-java-applet,version=1.1.2", + "application/x-java-applet,version=1.1.3", + "application/x-java-applet,version=1.2", + "application/x-java-applet,version=1.2.1", + "application/x-java-applet,version=1.2.2", + "application/x-java-applet,version=1.3", + "application/x-java-applet,version=1.3.1", + "application/x-java-applet,version=1.4", + "application/x-java-applet,version=1.4.1", + "application/x-java-applet,version=1.4.2", + "application/x-java-applet,version=1.5", + "application/x-java-applet,version=1.6", + "application/x-java-bean", + "application/x-java-bean,version=1.1", + "application/x-java-bean,version=1.1.1", + "application/x-java-bean,version=1.1.2", + "application/x-java-bean,version=1.1.3", + "application/x-java-bean,version=1.2", + "application/x-java-bean,version=1.2.1", + "application/x-java-bean,version=1.2.2", + "application/x-java-bean,version=1.3", + "application/x-java-bean,version=1.3.1", + "application/x-java-bean,version=1.4", + "application/x-java-bean,version=1.4.1", + "application/x-java-bean,version=1.4.2", + "application/x-java-bean,version=1.5", + "application/x-java-bean,version=1.6", + "application/x-java-vm" + ], + "lang": "en-US", + "name": "Java(TM)", + "url": "http://java.com/en/download/apple_manual.jsp", + "help_url": "https://support.google.com/chrome/?p=plugin_java", + "displayurl": true + }, + "realplayer": { + "mime_types": [ + "audio/vnd.rn-realaudio", + "video/vnd.rn-realvideo", + "audio/x-pn-realaudio-plugin", + "audio/x-pn-realaudio" + ], + "lang": "en-US", + "name": "RealPlayer", + "url": "http://director.real.com/realplayer?type=rpsp_mac", + "help_url": "https://support.google.com/chrome/?p=plugin_real" + }, + "adobe-flash-player": { + "mime_types": [ + "application/futuresplash", + "application/x-shockwave-flash" + ], + "lang": "en-US", + "name": "Adobe Flash Player", + "url": "http://get.adobe.com/flashplayer/", + "help_url": "https://support.google.com/chrome/?p=plugin_flash", + "requires_authorization": false, + "displayurl": true + }, + "adobe-shockwave": { + "mime_types": [ + "application/x-director" + ], + "lang": "en-US", + "name": "Adobe Shockwave Player", + "url": "http://www.adobe.com/shockwave/download/", + "help_url": "https://support.google.com/chrome/?p=plugin_shockwave", + "displayurl": true + }, + "adobe-reader": { + "mime_types": [ + "application/pdf", + "application/vnd.adobe.x-mars", + "application/vnd.adobe.xdp+xml", + "application/vnd.adobe.xfd+xml", + "application/vnd.adobe.xfdf", + "application/vnd.fdf" + ], + "lang": "en-US", + "name": "Adobe Reader", + "url": "http://get.adobe.com/reader/", + "help_url": "https://support.google.com/chrome/?p=plugin_pdf", + "requires_authorization": false, + "displayurl": true + }, + "apple-quicktime": { + "mime_types": [ + "application/sdp", + "application/x-mpeg", + "application/x-rtsp", + "application/x-sdp", + "audio/3ggp", + "audio/3ggp2", + "audio/aac", + "audio/ac3", + "audio/aiff", + "audio/amr", + "audio/basic", + "audio/mid", + "audio/midi", + "audio/mp4", + "audio/mpeg", + "audio/vnd.qcelp", + "audio/wav", + "audio/x-aac", + "audio/x-ac3", + "audio/x-aiff", + "audio/x-caf", + "audio/x-gsm", + "audio/x-m4a", + "audio/x-m4b", + "audio/x-m4p", + "audio/x-midi", + "audio/x-mpeg", + "audio/x-wav", + "image/jp2", + "image/jpeg2000", + "image/jpeg2000-image", + "image/pict", + "image/png", + "image/x-jpeg2000-image", + "image/x-macpaint", + "image/x-pict", + "image/x-png", + "image/x-quicktime", + "image/x-sgi", + "image/x-targa", + "video/3ggp", + "video/3ggp2", + "video/flc", + "video/mp4", + "video/mpeg", + "video/quicktime", + "video/sd-video", + "video/x-m4v", + "video/x-mpeg" + ], + "lang": "en-US", + "name": "QuickTime Player", + "url": "http://www.apple.com/quicktime/download/", + "help_url": "https://support.google.com/chrome/?p=plugin_quicktime", + "displayurl": true + }, + "flip4mac": { + "mime_types": [ + "application/asx", + "application/x-mplayer2", + "application/x-ms-wmp", + "audio/x-ms-wax", + "audio/x-ms-wma", + "video/x-ms-asf", + "video/x-ms-asf-plugin", + "video/x-ms-wm", + "video/x-ms-wmv", + "video/x-ms-wvx" + ], + "lang": "en-US", + "name": "Flip4Mac", + "url": "http://www.microsoft.com/download/en/confirmation.aspx?id=9442", + "help_url": "https://support.google.com/chrome/?p=plugin_wmp", + "displayurl": true + }, + "divx-player": { + "mime_types": [ + "video/divx", + "video/x-matroska" + ], + "lang": "en-US", + "name": "DivX Web Player", + "url": "http://www.divx.com/en/downloads/divx/mac", + "help_url": "https://support.google.com/chrome/?p=plugin_divx" + }, + "silverlight": { + "mime_types": [ + "application/x-silverlight", + "application/x-silverlight-2" + ], + "lang": "en-US", + "name": "Silverlight", + "url": "http://go.microsoft.com/fwlink/?LinkID=149156", + "requires_authorization": false, + "displayurl": true + } } diff --git a/chrome/browser/resources/plugins_win.json b/chrome/browser/resources/plugins_win.json index 7820ae3..a0ad3dd 100644 --- a/chrome/browser/resources/plugins_win.json +++ b/chrome/browser/resources/plugins_win.json @@ -1,193 +1,185 @@ { - "plugins": [ - { - "mime_types": [ - "application/x-java-applet", - "application/x-java-applet,version=1.1", - "application/x-java-applet,version=1.1.1", - "application/x-java-applet,version=1.1.2", - "application/x-java-applet,version=1.1.3", - "application/x-java-applet,version=1.2", - "application/x-java-applet,version=1.2.1", - "application/x-java-applet,version=1.2.2", - "application/x-java-applet,version=1.3", - "application/x-java-applet,version=1.3.1", - "application/x-java-applet,version=1.4", - "application/x-java-applet,version=1.4.1", - "application/x-java-applet,version=1.4.2", - "application/x-java-applet,version=1.5", - "application/x-java-applet,version=1.6", - "application/x-java-bean", - "application/x-java-bean,version=1.1", - "application/x-java-bean,version=1.1.1", - "application/x-java-bean,version=1.1.2", - "application/x-java-bean,version=1.1.3", - "application/x-java-bean,version=1.2", - "application/x-java-bean,version=1.2.1", - "application/x-java-bean,version=1.2.2", - "application/x-java-bean,version=1.3", - "application/x-java-bean,version=1.3.1", - "application/x-java-bean,version=1.4", - "application/x-java-bean,version=1.4.1", - "application/x-java-bean,version=1.4.2", - "application/x-java-bean,version=1.5", - "application/x-java-bean,version=1.6", - "application/x-java-vm" - ], - "lang": "en-US", - "name": "Java(TM)", - "identifier": "java-runtime-environment", - "help_url": "https://support.google.com/chrome/?p=plugin_java", - "url": "http://java.com/download", - "displayurl": true - }, - { - "mime_types": [ - "audio/vnd.rn-realaudio", - "video/vnd.rn-realvideo", - "audio/x-pn-realaudio-plugin", - "audio/x-pn-realaudio" - ], - "lang": "en-US", - "name": "RealPlayer", - "identifier": "realplayer", - "help_url": "https://support.google.com/chrome/?p=plugin_real", - "url": "http://forms.real.com/real/realone/download.html?type=rpsp_us" - }, - { - "mime_types": [ - "application/futuresplash", - "application/x-shockwave-flash" - ], - "lang": "en-US", - "name": "Adobe Flash Player", - "identifier": "adobe-flash-player", - "help_url": "https://support.google.com/chrome/?p=plugin_flash", - "url": "http://get.adobe.com/flashplayer/", - "displayurl": true - }, - { - "mime_types": [ - "application/x-director" - ], - "lang": "en-US", - "name": "Adobe Shockwave Player", - "identifier": "shockwave", - "help_url": "https://support.google.com/chrome/?p=plugin_shockwave", - "url": "http://fpdownload.macromedia.com/get/shockwave/default/english/win95nt/latest/Shockwave_Installer_Slim.exe" - }, - { - "mime_types": [ - "application/pdf", - "application/vnd.adobe.x-mars", - "application/vnd.adobe.xdp+xml", - "application/vnd.adobe.xfd+xml", - "application/vnd.adobe.xfdf", - "application/vnd.fdf" - ], - "lang": "en-US", - "name": "Adobe Reader", - "identifier": "adobe-reader", - "help_url": "https://support.google.com/chrome/?p=plugin_pdf", - "url": "http://ardownload.adobe.com/pub/adobe/reader/win/10.x/10.1.2/en_US/AdbeRdr1012_en_US.exe" - }, - { - "mime_types": [ - "application/sdp", - "application/x-mpeg", - "application/x-rtsp", - "application/x-sdp", - "audio/3ggp", - "audio/3ggp2", - "audio/aac", - "audio/ac3", - "audio/aiff", - "audio/amr", - "audio/basic", - "audio/mid", - "audio/midi", - "audio/mp4", - "audio/mpeg", - "audio/vnd.qcelp", - "audio/wav", - "audio/x-aac", - "audio/x-ac3", - "audio/x-aiff", - "audio/x-caf", - "audio/x-gsm", - "audio/x-m4a", - "audio/x-m4b", - "audio/x-m4p", - "audio/x-midi", - "audio/x-mpeg", - "audio/x-wav", - "image/jp2", - "image/jpeg2000", - "image/jpeg2000-image", - "image/pict", - "image/png", - "image/x-jpeg2000-image", - "image/x-macpaint", - "image/x-pict", - "image/x-png", - "image/x-quicktime", - "image/x-sgi", - "image/x-targa", - "video/3ggp", - "video/3ggp2", - "video/flc", - "video/mp4", - "video/mpeg", - "video/quicktime", - "video/sd-video", - "video/x-m4v", - "video/x-mpeg" - ], - "lang": "en-US", - "name": "QuickTime Player", - "identifier": "apple-quicktime", - "help_url": "https://support.google.com/chrome/?p=plugin_quicktime", - "url": "http://appldnld.apple.com/QuickTime/041-3089.20111026.Sxpr4/QuickTimeInstaller.exe" - }, - { - "mime_types": [ - "application/asx", - "application/x-mplayer2", - "application/x-ms-wmp", - "audio/x-ms-wax", - "audio/x-ms-wma", - "video/x-ms-asf", - "video/x-ms-asf-plugin", - "video/x-ms-wm", - "video/x-ms-wmv", - "video/x-ms-wvx" - ], - "lang": "en-US", - "name": "Windows Media Player", - "identifier": "windows-media-player", - "help_url": "https://support.google.com/chrome/?p=plugin_wmp", - "url": "http://interoplabs.blob.core.windows.net/wmpff/wmpfirefoxplugin.exe" - }, - { - "mime_types": [ - "video/divx", - "video/x-matroska" - ], - "lang": "en-US", - "name": "DivX Web Player", - "identifier": "divx-player", - "help_url": "https://support.google.com/chrome/?p=plugin_divx", - "url": "http://download.divx.com/player/divxdotcom/DivXWebPlayerInstaller.exe" - }, - { - "mime_types": [ - "application/x-silverlight", - "application/x-silverlight-2" - ], - "lang": "en-US", - "name": "Silverlight", - "identifier": "silverlight", - "url": "http://go.microsoft.com/fwlink/?LinkID=149156" - } - ] + "java-runtime-environment": { + "mime_types": [ + "application/x-java-applet", + "application/x-java-applet,version=1.1", + "application/x-java-applet,version=1.1.1", + "application/x-java-applet,version=1.1.2", + "application/x-java-applet,version=1.1.3", + "application/x-java-applet,version=1.2", + "application/x-java-applet,version=1.2.1", + "application/x-java-applet,version=1.2.2", + "application/x-java-applet,version=1.3", + "application/x-java-applet,version=1.3.1", + "application/x-java-applet,version=1.4", + "application/x-java-applet,version=1.4.1", + "application/x-java-applet,version=1.4.2", + "application/x-java-applet,version=1.5", + "application/x-java-applet,version=1.6", + "application/x-java-bean", + "application/x-java-bean,version=1.1", + "application/x-java-bean,version=1.1.1", + "application/x-java-bean,version=1.1.2", + "application/x-java-bean,version=1.1.3", + "application/x-java-bean,version=1.2", + "application/x-java-bean,version=1.2.1", + "application/x-java-bean,version=1.2.2", + "application/x-java-bean,version=1.3", + "application/x-java-bean,version=1.3.1", + "application/x-java-bean,version=1.4", + "application/x-java-bean,version=1.4.1", + "application/x-java-bean,version=1.4.2", + "application/x-java-bean,version=1.5", + "application/x-java-bean,version=1.6", + "application/x-java-vm" + ], + "lang": "en-US", + "name": "Java(TM)", + "help_url": "https://support.google.com/chrome/?p=plugin_java", + "url": "http://java.com/download", + "displayurl": true + }, + "realplayer": { + "mime_types": [ + "audio/vnd.rn-realaudio", + "video/vnd.rn-realvideo", + "audio/x-pn-realaudio-plugin", + "audio/x-pn-realaudio" + ], + "lang": "en-US", + "name": "RealPlayer", + "help_url": "https://support.google.com/chrome/?p=plugin_real", + "url": "http://forms.real.com/real/realone/download.html?type=rpsp_us" + }, + "adobe-flash-player": { + "mime_types": [ + "application/futuresplash", + "application/x-shockwave-flash" + ], + "lang": "en-US", + "name": "Adobe Flash Player", + "help_url": "https://support.google.com/chrome/?p=plugin_flash", + "url": "http://get.adobe.com/flashplayer/", + "requires_authorization": false, + "displayurl": true + }, + "shockwave": { + "mime_types": [ + "application/x-director" + ], + "lang": "en-US", + "name": "Adobe Shockwave Player", + "help_url": "https://support.google.com/chrome/?p=plugin_shockwave", + "url": "http://fpdownload.macromedia.com/get/shockwave/default/english/win95nt/latest/Shockwave_Installer_Slim.exe" + }, + "adobe-reader": { + "mime_types": [ + "application/pdf", + "application/vnd.adobe.x-mars", + "application/vnd.adobe.xdp+xml", + "application/vnd.adobe.xfd+xml", + "application/vnd.adobe.xfdf", + "application/vnd.fdf" + ], + "lang": "en-US", + "name": "Adobe Reader", + "help_url": "https://support.google.com/chrome/?p=plugin_pdf", + "url": "http://ardownload.adobe.com/pub/adobe/reader/win/10.x/10.1.2/en_US/AdbeRdr1012_en_US.exe", + "requires_authorization": false + }, + "apple-quicktime": { + "mime_types": [ + "application/sdp", + "application/x-mpeg", + "application/x-rtsp", + "application/x-sdp", + "audio/3ggp", + "audio/3ggp2", + "audio/aac", + "audio/ac3", + "audio/aiff", + "audio/amr", + "audio/basic", + "audio/mid", + "audio/midi", + "audio/mp4", + "audio/mpeg", + "audio/vnd.qcelp", + "audio/wav", + "audio/x-aac", + "audio/x-ac3", + "audio/x-aiff", + "audio/x-caf", + "audio/x-gsm", + "audio/x-m4a", + "audio/x-m4b", + "audio/x-m4p", + "audio/x-midi", + "audio/x-mpeg", + "audio/x-wav", + "image/jp2", + "image/jpeg2000", + "image/jpeg2000-image", + "image/pict", + "image/png", + "image/x-jpeg2000-image", + "image/x-macpaint", + "image/x-pict", + "image/x-png", + "image/x-quicktime", + "image/x-sgi", + "image/x-targa", + "video/3ggp", + "video/3ggp2", + "video/flc", + "video/mp4", + "video/mpeg", + "video/quicktime", + "video/sd-video", + "video/x-m4v", + "video/x-mpeg" + ], + "lang": "en-US", + "name": "QuickTime Player", + "help_url": "https://support.google.com/chrome/?p=plugin_quicktime", + "url": "http://appldnld.apple.com/QuickTime/041-3089.20111026.Sxpr4/QuickTimeInstaller.exe" + }, + "windows-media-player": { + "mime_types": [ + "application/asx", + "application/x-mplayer2", + "application/x-ms-wmp", + "audio/x-ms-wax", + "audio/x-ms-wma", + "video/x-ms-asf", + "video/x-ms-asf-plugin", + "video/x-ms-wm", + "video/x-ms-wmv", + "video/x-ms-wvx" + ], + "lang": "en-US", + "name": "Windows Media Player", + "help_url": "https://support.google.com/chrome/?p=plugin_wmp", + "url": "http://interoplabs.blob.core.windows.net/wmpff/wmpfirefoxplugin.exe" + }, + "divx-player": { + "mime_types": [ + "video/divx", + "video/x-matroska" + ], + "lang": "en-US", + "name": "DivX Web Player", + "help_url": "https://support.google.com/chrome/?p=plugin_divx", + "url": "http://download.divx.com/player/divxdotcom/DivXWebPlayerInstaller.exe" + }, + "silverlight": { + "mime_types": [ + "application/x-silverlight", + "application/x-silverlight-2" + ], + "lang": "en-US", + "name": "Silverlight", + "url": "http://go.microsoft.com/fwlink/?LinkID=149156", + "requires_authorization": false + } } diff --git a/chrome/browser/ui/webui/plugins_ui.cc b/chrome/browser/ui/webui/plugins_ui.cc index a2f46aa..c1340a0 100644 --- a/chrome/browser/ui/webui/plugins_ui.cc +++ b/chrome/browser/ui/webui/plugins_ui.cc @@ -44,6 +44,15 @@ #include "ui/base/resource/resource_bundle.h" #include "webkit/plugins/npapi/plugin_group.h" +#if defined(ENABLE_PLUGIN_INSTALLATION) +#include "chrome/browser/plugin_finder.h" +#include "chrome/browser/plugin_installer.h" +#else +// Forward-declare PluginFinder. It's never actually used, but we pass a NULL +// pointer instead. +class PluginFinder; +#endif + using content::PluginService; using content::WebContents; using content::WebUIMessageHandler; @@ -149,10 +158,14 @@ class PluginsDOMHandler : public WebUIMessageHandler, private: // Call this to start getting the plugins on the UI thread. - void LoadPlugins(); + void GetPluginFinder(); + + // Called when we have a PluginFinder and need to load the list of plug-ins. + void LoadPlugins(PluginFinder* plugin_finder); // Called on the UI thread when the plugin information is ready. - void PluginsLoaded(const std::vector<PluginGroup>& groups); + void PluginsLoaded(PluginFinder* plugin_finder, + const std::vector<PluginGroup>& groups); content::NotificationRegistrar registrar_; @@ -197,7 +210,7 @@ void PluginsDOMHandler::RegisterMessages() { } void PluginsDOMHandler::HandleRequestPluginsData(const ListValue* args) { - LoadPlugins(); + GetPluginFinder(); } void PluginsDOMHandler::HandleEnablePluginMessage(const ListValue* args) { @@ -295,22 +308,31 @@ void PluginsDOMHandler::Observe(int type, const content::NotificationSource& source, const content::NotificationDetails& details) { DCHECK_EQ(chrome::NOTIFICATION_PLUGIN_ENABLE_STATUS_CHANGED, type); - LoadPlugins(); + GetPluginFinder(); } -void PluginsDOMHandler::LoadPlugins() { +void PluginsDOMHandler::GetPluginFinder() { if (weak_ptr_factory_.HasWeakPtrs()) return; +#if defined(ENABLE_PLUGIN_INSTALLATION) + PluginFinder::Get(base::Bind(&PluginsDOMHandler::LoadPlugins, + weak_ptr_factory_.GetWeakPtr())); +#else + LoadPlugins(NULL); +#endif +} + +void PluginsDOMHandler::LoadPlugins(PluginFinder* plugin_finder) { PluginService::GetInstance()->GetPluginGroups( base::Bind(&PluginsDOMHandler::PluginsLoaded, - weak_ptr_factory_.GetWeakPtr())); + weak_ptr_factory_.GetWeakPtr(), plugin_finder)); } -void PluginsDOMHandler::PluginsLoaded(const std::vector<PluginGroup>& groups) { +void PluginsDOMHandler::PluginsLoaded(PluginFinder* plugin_finder, + const std::vector<PluginGroup>& groups) { Profile* profile = Profile::FromWebUI(web_ui()); - PluginPrefs* plugin_prefs = - PluginPrefs::GetForProfile(profile); + PluginPrefs* plugin_prefs = PluginPrefs::GetForProfile(profile); HostContentSettingsMap* map = profile->GetHostContentSettingsMap(); ContentSettingsPattern wildcard = ContentSettingsPattern::Wildcard(); @@ -396,7 +418,15 @@ void PluginsDOMHandler::PluginsLoaded(const std::vector<PluginGroup>& groups) { group_data->SetString("description", active_plugin->desc); group_data->SetString("version", active_plugin->version); group_data->SetBoolean("critical", group.IsVulnerable(*active_plugin)); - group_data->SetString("update_url", group.GetUpdateURL()); + + std::string update_url; +#if defined(ENABLE_PLUGIN_INSTALLATION) + PluginInstaller* installer = + plugin_finder->FindPluginWithIdentifier(group.identifier()); + if (installer) + update_url = installer->plugin_url().spec(); +#endif + group_data->SetString("update_url", update_url); std::string enabled_mode; if (all_plugins_enabled_by_policy) { @@ -410,7 +440,7 @@ void PluginsDOMHandler::PluginsLoaded(const std::vector<PluginGroup>& groups) { } group_data->SetString("enabledMode", enabled_mode); - // TODO(bauerb): We should have a method on HostContentSettinsMap for this. + // TODO(bauerb): We should have a method on HostContentSettingsMap for this. bool always_allowed = false; ContentSettingsForOneType settings; map->GetSettingsForOneType(CONTENT_SETTINGS_TYPE_PLUGINS, diff --git a/content/utility/utility_thread_impl.cc b/content/utility/utility_thread_impl.cc index 4887b57..cf85fbd 100644 --- a/content/utility/utility_thread_impl.cc +++ b/content/utility/utility_thread_impl.cc @@ -147,19 +147,16 @@ void UtilityThreadImpl::OnLoadPlugins( gfx::GtkInitFromCommandLine(*CommandLine::ForCurrentProcess()); #endif + ScopedVector<webkit::npapi::PluginGroup> plugin_groups; + // TODO(bauerb): If we restart loading plug-ins, we might mess up the logic in + // PluginList::ShouldLoadPlugin due to missing the previously loaded plug-ins + // in |plugin_groups|. for (size_t i = 0; i < plugin_paths.size(); ++i) { - ScopedVector<webkit::npapi::PluginGroup> plugin_groups; - plugin_list->LoadPlugin(plugin_paths[i], &plugin_groups); - - if (plugin_groups.empty()) { + webkit::WebPluginInfo plugin; + if (!plugin_list->LoadPlugin(plugin_paths[i], &plugin_groups, &plugin)) Send(new UtilityHostMsg_LoadPluginFailed(i, plugin_paths[i])); - continue; - } - - const webkit::npapi::PluginGroup* group = plugin_groups[0]; - DCHECK_EQ(group->web_plugin_infos().size(), 1u); - - Send(new UtilityHostMsg_LoadedPlugin(i, group->web_plugin_infos().front())); + else + Send(new UtilityHostMsg_LoadedPlugin(i, plugin)); } ReleaseProcessIfNeeded(); diff --git a/webkit/plugins/npapi/plugin_group.cc b/webkit/plugins/npapi/plugin_group.cc index 0309dd7..aa8be2f 100644 --- a/webkit/plugins/npapi/plugin_group.cc +++ b/webkit/plugins/npapi/plugin_group.cc @@ -20,8 +20,6 @@ namespace npapi { // static const char PluginGroup::kAdobeReaderGroupName[] = "Adobe Acrobat"; -const char PluginGroup::kAdobeReaderUpdateURL[] = - "http://get.adobe.com/reader/"; const char PluginGroup::kJavaGroupName[] = "Java"; const char PluginGroup::kQuickTimeGroupName[] = "QuickTime"; const char PluginGroup::kShockwaveGroupName[] = "Shockwave"; @@ -32,8 +30,7 @@ const char PluginGroup::kWindowsMediaPlayerGroupName[] = "Windows Media Player"; VersionRange::VersionRange(const VersionRangeDefinition& definition) : low_str(definition.version_matcher_low), high_str(definition.version_matcher_high), - min_str(definition.min_version), - requires_authorization(definition.requires_authorization) { + min_str(definition.min_version) { if (!low_str.empty()) low.reset(Version::GetVersionFromString(low_str)); if (!high_str.empty()) @@ -60,24 +57,20 @@ void VersionRange::InitFrom(const VersionRange& other) { low.reset(Version::GetVersionFromString(other.low_str)); high.reset(Version::GetVersionFromString(other.high_str)); min.reset(Version::GetVersionFromString(other.min_str)); - requires_authorization = other.requires_authorization; } PluginGroup::PluginGroup(const string16& group_name, const string16& name_matcher, - const std::string& update_url, const std::string& identifier) : identifier_(identifier), group_name_(group_name), - name_matcher_(name_matcher), - update_url_(update_url) { + name_matcher_(name_matcher) { } void PluginGroup::InitFrom(const PluginGroup& other) { identifier_ = other.identifier_; group_name_ = other.group_name_; name_matcher_ = other.name_matcher_; - update_url_ = other.update_url_; version_ranges_ = other.version_ranges_; web_plugin_infos_ = other.web_plugin_infos_; } @@ -96,7 +89,6 @@ PluginGroup* PluginGroup::FromPluginGroupDefinition( const PluginGroupDefinition& definition) { PluginGroup* group = new PluginGroup(ASCIIToUTF16(definition.name), ASCIIToUTF16(definition.name_matcher), - definition.update_url, definition.identifier); for (size_t i = 0; i < definition.num_versions; ++i) group->version_ranges_.push_back(VersionRange(definition.versions[i])); @@ -126,7 +118,7 @@ std::string PluginGroup::GetLongIdentifier(const WebPluginInfo& wpi) { /*static*/ PluginGroup* PluginGroup::FromWebPluginInfo(const WebPluginInfo& wpi) { // Create a matcher from the name of this plugin. - return new PluginGroup(wpi.name, wpi.name, std::string(), + return new PluginGroup(wpi.name, wpi.name, GetIdentifier(wpi)); } @@ -256,19 +248,6 @@ bool PluginGroup::IsVulnerable(const WebPluginInfo& plugin) const { return false; } -bool PluginGroup::RequiresAuthorization(const WebPluginInfo& plugin) const { - scoped_ptr<Version> version(CreateVersionFromString(plugin.version)); - if (!version.get()) - return false; - - for (size_t i = 0; i < version_ranges_.size(); ++i) { - if (IsVersionInRange(*version, version_ranges_[i]) && - version_ranges_[i].requires_authorization) - return true; - } - return false; -} - bool PluginGroup::IsEmpty() const { return web_plugin_infos_.empty(); } diff --git a/webkit/plugins/npapi/plugin_group.h b/webkit/plugins/npapi/plugin_group.h index 91ce596..8cb0815 100644 --- a/webkit/plugins/npapi/plugin_group.h +++ b/webkit/plugins/npapi/plugin_group.h @@ -34,17 +34,20 @@ struct VersionRangeDefinition { // to match anything higher than |version_matcher_low|. const char* version_matcher_high; const char* min_version; // Minimum secure version. - bool requires_authorization; // If this range needs user permission to run. }; // Hard-coded definitions of plugin groups. struct PluginGroupDefinition { - const char* identifier; // Unique identifier for this group. - const char* name; // Name of this group. - const char* name_matcher; // Substring matcher for the plugin name. - const VersionRangeDefinition* versions; // List of version ranges. - size_t num_versions; // Size of the array |versions| points to. - const char* update_url; // Location of latest secure version. + // Unique identifier for this group. + const char* identifier; + // Name of this group. + const char* name; + // Substring matcher for the plugin name. + const char* name_matcher; + // List of version ranges. + const VersionRangeDefinition* versions; + // Size of the array |versions| points to. + size_t num_versions; }; // Run-time structure to hold version range information. @@ -61,7 +64,6 @@ struct VersionRange { scoped_ptr<Version> low; scoped_ptr<Version> high; scoped_ptr<Version> min; - bool requires_authorization; private: void InitFrom(const VersionRange& other); }; @@ -78,7 +80,6 @@ class WEBKIT_PLUGINS_EXPORT PluginGroup { // Used by about:plugins to disable Reader plugin when internal PDF viewer is // enabled. static const char kAdobeReaderGroupName[]; - static const char kAdobeReaderUpdateURL[]; static const char kJavaGroupName[]; static const char kQuickTimeGroupName[]; static const char kShockwaveGroupName[]; @@ -117,19 +118,9 @@ class WEBKIT_PLUGINS_EXPORT PluginGroup { // Checks whether a plugin exists in the group with the given path. bool ContainsPlugin(const FilePath& path) const; - // Returns the update URL. - std::string GetUpdateURL() const { return update_url_; } - - // Returns true if this plugin group is whitelisted. - bool IsWhitelisted() const; - // Returns true if |plugin| in this group has known security problems. bool IsVulnerable(const WebPluginInfo& plugin) const; - // Returns true if |plugin| in this plug-in group always requires user - // authorization to run. - bool RequiresAuthorization(const WebPluginInfo& plugin) const; - // Check if the group has no plugins. Could happen after a reload if the plug- // in has disappeared from the pc (or in the process of updating). bool IsEmpty() const; @@ -143,9 +134,9 @@ class WEBKIT_PLUGINS_EXPORT PluginGroup { } private: - friend class PluginList; friend class MockPluginList; friend class PluginGroupTest; + friend class PluginList; friend class ::PluginExceptionsTableModelTest; FRIEND_TEST_ALL_PREFIXES(PluginListTest, DisableOutdated); @@ -176,7 +167,6 @@ class WEBKIT_PLUGINS_EXPORT PluginGroup { PluginGroup(const string16& group_name, const string16& name_matcher, - const std::string& update_url, const std::string& identifier); void InitFrom(const PluginGroup& other); @@ -190,7 +180,6 @@ class WEBKIT_PLUGINS_EXPORT PluginGroup { std::string identifier_; string16 group_name_; string16 name_matcher_; - std::string update_url_; std::vector<VersionRange> version_ranges_; std::vector<webkit::WebPluginInfo> web_plugin_infos_; }; diff --git a/webkit/plugins/npapi/plugin_group_unittest.cc b/webkit/plugins/npapi/plugin_group_unittest.cc index 4a0a991..2033296 100644 --- a/webkit/plugins/npapi/plugin_group_unittest.cc +++ b/webkit/plugins/npapi/plugin_group_unittest.cc @@ -20,33 +20,33 @@ namespace webkit { namespace npapi { static const VersionRangeDefinition kPluginVersionRange[] = { - { "", "", "3.0.44", false } + { "", "", "3.0.44" } }; static const VersionRangeDefinition kPlugin3VersionRange[] = { - { "0", "4", "3.0.44", false } + { "0", "4", "3.0.44" } }; static const VersionRangeDefinition kPlugin4VersionRange[] = { - { "4", "5", "4.0.44", false } + { "4", "5", "4.0.44" } }; static const VersionRangeDefinition kPlugin34VersionRange[] = { - { "0", "4", "3.0.44", false }, - { "4", "5", "", false } + { "0", "4", "3.0.44" }, + { "4", "5", "" } }; static const PluginGroupDefinition kPluginDef = { "myplugin", "MyPlugin", "MyPlugin", kPluginVersionRange, - arraysize(kPluginVersionRange), "http://latest/" }; + arraysize(kPluginVersionRange) }; static const PluginGroupDefinition kPluginDef3 = { "myplugin-3", "MyPlugin 3", "MyPlugin", kPlugin3VersionRange, - arraysize(kPlugin3VersionRange), "http://latest" }; + arraysize(kPlugin3VersionRange) }; static const PluginGroupDefinition kPluginDef4 = { "myplugin-4", "MyPlugin 4", "MyPlugin", kPlugin4VersionRange, - arraysize(kPlugin4VersionRange), "http://latest" }; + arraysize(kPlugin4VersionRange) }; static const PluginGroupDefinition kPluginDef34 = { "myplugin-34", "MyPlugin 3/4", "MyPlugin", kPlugin34VersionRange, - arraysize(kPlugin34VersionRange), "http://latest" }; + arraysize(kPlugin34VersionRange) }; static const PluginGroupDefinition kPluginDefNotVulnerable = { - "myplugin-latest", "MyPlugin", "MyPlugin", NULL, 0, "http://latest" }; + "myplugin-latest", "MyPlugin", "MyPlugin", NULL, 0 }; const PluginGroupDefinition kPluginDefinitions[] = { kPluginDef, @@ -153,14 +153,13 @@ TEST_F(PluginGroupTest, VersionExtraction) { TEST_F(PluginGroupTest, IsVulnerable) { // Adobe Reader 10 VersionRangeDefinition adobe_reader_version_range[] = { - { "10", "11", "", false }, - { "9", "10", "9.4.1", false }, - { "0", "9", "8.2.5", false } + { "10", "11", "" }, + { "9", "10", "9.4.1" }, + { "0", "9", "8.2.5" } }; PluginGroupDefinition adobe_reader_plugin_def = { "adobe-reader", "Adobe Reader", "Adobe Acrobat", - adobe_reader_version_range, arraysize(adobe_reader_version_range), - "http://get.adobe.com/reader/" }; + adobe_reader_version_range, arraysize(adobe_reader_version_range) }; WebPluginInfo adobe_reader_plugin(ASCIIToUTF16("Adobe Reader"), FilePath(FILE_PATH_LITERAL("/reader.so")), ASCIIToUTF16("10.0.0.396"), @@ -170,17 +169,15 @@ TEST_F(PluginGroupTest, IsVulnerable) { group->AddPlugin(adobe_reader_plugin); PluginGroup group_copy(*group); // Exercise the copy constructor. EXPECT_FALSE(group_copy.IsVulnerable(adobe_reader_plugin)); - EXPECT_FALSE(group_copy.RequiresAuthorization(adobe_reader_plugin)); // Silverlight 4 VersionRangeDefinition silverlight_version_range[] = { - { "0", "4", "3.0.50106.0", false }, - { "4", "5", "", true } + { "0", "4", "3.0.50106.0" }, + { "4", "5", "" } }; PluginGroupDefinition silverlight_plugin_def = { "silverlight", "Silverlight", "Silverlight", silverlight_version_range, - arraysize(silverlight_version_range), - "http://www.microsoft.com/getsilverlight/" }; + arraysize(silverlight_version_range) }; WebPluginInfo silverlight_plugin(ASCIIToUTF16("Silverlight"), FilePath(FILE_PATH_LITERAL("/silver.so")), ASCIIToUTF16("4.0.50917.0"), @@ -188,7 +185,6 @@ TEST_F(PluginGroupTest, IsVulnerable) { group.reset(PluginGroupTest::CreatePluginGroup(silverlight_plugin_def)); group->AddPlugin(silverlight_plugin); EXPECT_FALSE(PluginGroup(*group).IsVulnerable(silverlight_plugin)); - EXPECT_TRUE(PluginGroup(*group).RequiresAuthorization(silverlight_plugin)); } } // namespace npapi diff --git a/webkit/plugins/npapi/plugin_list.cc b/webkit/plugins/npapi/plugin_list.cc index 2d70c01..260fadf 100644 --- a/webkit/plugins/npapi/plugin_list.cc +++ b/webkit/plugins/npapi/plugin_list.cc @@ -53,99 +53,81 @@ bool AllowMimeTypeMismatch(const std::string& orig_mime_type, namespace webkit { namespace npapi { +// Note: If you change the plug-in definitions here, also update +// chrome/browser/resources/plugins_*.json correspondingly! +// In particular, the identifier and the update URLs need to be kept in sync. + // Some version ranges can be shared across operating systems. This should be // done where possible to avoid duplication. -// TODO(bauerb): The |requires_authorization| flag should be part of -// PluginGroupDefinition, not VersionRangeDefinition. -static const VersionRangeDefinition kAllVersionsInfobarVersionRange[] = { - { "", "", "", true } -}; - -static const VersionRangeDefinition kAllVersionsNoInfobarVersionRange[] = { - { "", "", "", false } -}; // This is up to date with // http://www.adobe.com/support/security/bulletins/apsb12-03.html // NOTE: We would like to go to the 4th component value but we cannot because // on some platforms, such as Linux, it is not available. static const VersionRangeDefinition kFlashVersionRange[] = { - { "", "", "11.1.102", false } + { "", "", "11.1.102" } }; // This is up to date with // http://www.adobe.com/support/security/bulletins/apsb12-02.html static const VersionRangeDefinition kShockwaveVersionRange[] = { - { "", "", "11.6.4.634", true } + { "", "", "11.6.4.634" } }; // This is up to date with // http://support.microsoft.com/kb/2668562 // http://technet.microsoft.com/en-us/security/Bulletin/MS12-016 static const VersionRangeDefinition kSilverlightVersionRange[] = { - { "0", "5", "4.1.10111.0", false }, - { "5", "6", "", false }, + { "0", "5", "4.1.10111.0" }, + { "5", "6", "" }, }; // Similarly, try and share the group definition for plug-ins that are // very consistent across OS'es. #define kFlashDefinition { \ "adobe-flash-player", "Flash", "Shockwave Flash", kFlashVersionRange,\ - arraysize(kFlashVersionRange), "http://get.adobe.com/flashplayer/" } + arraysize(kFlashVersionRange) } #define kShockwaveDefinition { \ "shockwave", PluginGroup::kShockwaveGroupName, "Shockwave for Director", \ - kShockwaveVersionRange, arraysize(kShockwaveVersionRange), \ - "http://www.adobe.com/shockwave/download/" } + kShockwaveVersionRange, arraysize(kShockwaveVersionRange) } #define kSilverlightDefinition { \ "silverlight", PluginGroup::kSilverlightGroupName, "Silverlight", \ - kSilverlightVersionRange, arraysize(kSilverlightVersionRange), \ - "http://www.microsoft.com/getsilverlight/" } + kSilverlightVersionRange, arraysize(kSilverlightVersionRange) } #define kChromePdfDefinition { \ - "google-chrome-pdf", "Chrome PDF Viewer", "Chrome PDF Viewer", \ - kAllVersionsNoInfobarVersionRange, \ - arraysize(kAllVersionsNoInfobarVersionRange), "" } + "google-chrome-pdf", "Chrome PDF Viewer", "Chrome PDF Viewer", NULL, 0 } #define kGoogleTalkDefinition { \ - "google-talk", "Google Talk", "Google Talk", \ - kAllVersionsNoInfobarVersionRange, \ - arraysize(kAllVersionsNoInfobarVersionRange), ""} + "google-talk", "Google Talk", "Google Talk", NULL, 0 } #if defined(OS_MACOSX) // Plugin Groups for Mac. // Plugins are listed here as soon as vulnerabilities and solutions // (new versions) are published. static const VersionRangeDefinition kQuicktimeVersionRange[] = { - { "", "", "7.6.6", true } + { "", "", "7.6.6" } }; static const VersionRangeDefinition kJavaVersionRange[] = { - { "0", "13.0", "12.8.0", true }, // Leopard - { "13.0", "14.0", "13.5.0", true }, // Snow Leopard - { "14.0", "", "14.0.3", true } // Lion + { "0", "13.0", "12.8.0" }, // Leopard + { "13.0", "14.0", "13.5.0" }, // Snow Leopard + { "14.0", "", "14.0.3" } // Lion }; static const VersionRangeDefinition kFlip4MacVersionRange[] = { - { "", "", "2.2.1", true } -}; -static const VersionRangeDefinition kDivXVersionRange[] = { - { "", "", "", true } + { "", "", "2.2.1" } }; // Note: The Adobe Reader browser plug-in is not supported in Chrome. // Note: The Real Player plugin for mac doesn't expose a version at all. static const PluginGroupDefinition kGroupDefinitions[] = { kFlashDefinition, { "apple-quicktime", PluginGroup::kQuickTimeGroupName, "QuickTime Plug-in", - kQuicktimeVersionRange, arraysize(kQuicktimeVersionRange), - "http://www.apple.com/quicktime/download/" }, + kQuicktimeVersionRange, arraysize(kQuicktimeVersionRange) }, { "java-runtime-environment", PluginGroup::kJavaGroupName, "Java", - kJavaVersionRange, arraysize(kJavaVersionRange), - "http://support.apple.com/kb/HT1338" }, + kJavaVersionRange, arraysize(kJavaVersionRange) }, kSilverlightDefinition, { "flip4mac", "Flip4Mac", "Flip4Mac", kFlip4MacVersionRange, - arraysize(kFlip4MacVersionRange), - "http://www.telestream.net/flip4mac-wmv/overview.htm" }, + arraysize(kFlip4MacVersionRange) }, { "divx-player", "DivX Plus Web Player", "DivX Plus Web Player", - kDivXVersionRange, arraysize(kDivXVersionRange), - "http://www.divx.com/en/software/divx-plus/web-player" }, + NULL, 0 }, kShockwaveDefinition, kChromePdfDefinition, kGoogleTalkDefinition, @@ -155,54 +137,46 @@ static const PluginGroupDefinition kGroupDefinitions[] = { // TODO(panayiotis): We should group "RealJukebox NS Plugin" with the rest of // the RealPlayer files. static const VersionRangeDefinition kQuicktimeVersionRange[] = { - { "", "", "7.6.9", true } + { "", "", "7.6.9" } }; static const VersionRangeDefinition kJavaVersionRange[] = { - { "0", "7", "6.0.310", true }, // "310" is not a typo. - { "7", "", "10.3", true } // JDK7u3 identifies itself as 10.3 + { "0", "7", "6.0.310" }, // "310" is not a typo. + { "7", "", "10.3" } // JDK7u3 identifies itself as 10.3 }; // This is up to date with // http://www.adobe.com/support/security/bulletins/apsb12-01.html static const VersionRangeDefinition kAdobeReaderVersionRange[] = { - { "10", "11", "10.1.2", false }, - { "0", "10", "9.5", false } + { "10", "11", "10.1.2" }, + { "0", "10", "9.5" } }; static const VersionRangeDefinition kDivXVersionRange[] = { - { "", "", "1.4.3.4", true } + { "", "", "1.4.3.4" } }; // This is up to date with // http://service.real.com/realplayer/security/02062012_player/en/ static const VersionRangeDefinition kRealPlayerVersionRange[] = { - { "", "", "15.0.2.71", true } + { "", "", "15.0.2.71" } }; static const PluginGroupDefinition kGroupDefinitions[] = { kFlashDefinition, { "apple-quicktime", PluginGroup::kQuickTimeGroupName, "QuickTime Plug-in", - kQuicktimeVersionRange, arraysize(kQuicktimeVersionRange), - "http://www.apple.com/quicktime/download/" }, + kQuicktimeVersionRange, arraysize(kQuicktimeVersionRange) }, { "java-runtime-environment", PluginGroup::kJavaGroupName, "Java", - kJavaVersionRange, arraysize(kJavaVersionRange), - "http://www.java.com/download" }, + kJavaVersionRange, arraysize(kJavaVersionRange) }, { "adobe-reader", PluginGroup::kAdobeReaderGroupName, "Adobe Acrobat", - kAdobeReaderVersionRange, arraysize(kAdobeReaderVersionRange), - "http://get.adobe.com/reader/" }, + kAdobeReaderVersionRange, arraysize(kAdobeReaderVersionRange) }, kSilverlightDefinition, kShockwaveDefinition, { "divx-player", "DivX Player", "DivX Web Player", kDivXVersionRange, - arraysize(kDivXVersionRange), - "http://download.divx.com/divx/autoupdate/player/" - "DivXWebPlayerInstaller.exe" }, + arraysize(kDivXVersionRange) }, { "realplayer", PluginGroup::kRealPlayerGroupName, "RealPlayer", - kRealPlayerVersionRange, arraysize(kRealPlayerVersionRange), - "http://www.real.com/realplayer/download" }, + kRealPlayerVersionRange, arraysize(kRealPlayerVersionRange) }, // These are here for grouping, no vulnerabilities known. { "windows-media-player", PluginGroup::kWindowsMediaPlayerGroupName, - "Windows Media Player", kAllVersionsInfobarVersionRange, - arraysize(kAllVersionsInfobarVersionRange), "" }, + "Windows Media Player", NULL, 0 }, { "microsoft-office", "Microsoft Office", "Microsoft Office", - NULL, 0, "" }, - { "nvidia-3d", "NVIDIA 3D", "NVIDIA 3D", kAllVersionsInfobarVersionRange, - arraysize(kAllVersionsInfobarVersionRange), "" }, + NULL, 0 }, + { "nvidia-3d", "NVIDIA 3D", "NVIDIA 3D", NULL, 0 }, kChromePdfDefinition, kGoogleTalkDefinition, }; @@ -217,18 +191,18 @@ static const PluginGroupDefinition kGroupDefinitions[] = { #else // Most importantly, covers desktop Linux. static const VersionRangeDefinition kJavaVersionRange[] = { - { "0", "1.7", "1.6.0.31", true }, - { "1.7", "", "1.7.0.3", true } + { "0", "1.7", "1.6.0.31" }, + { "1.7", "", "1.7.0.3" } }; // Up to date with: // http://blog.fuseyism.com/index.php/2012/02/15/ // security-icedtea6-1-8-13-1-9-13-1-10-6-and-icedtea-2-0-1-released/ static const VersionRangeDefinition kRedhatIcedTeaVersionRange[] = { - { "0", "1.9", "1.8.13", true }, - { "1.9", "1.10", "1.9.13", true }, - { "1.10", "2", "1.10.6", true }, - { "2", "", "2.0.1", true } + { "0", "1.9", "1.8.13" }, + { "1.9", "1.10", "1.9.13" }, + { "1.10", "2", "1.10.6" }, + { "2", "", "2.0.1" } }; static const PluginGroupDefinition kGroupDefinitions[] = { @@ -236,11 +210,9 @@ static const PluginGroupDefinition kGroupDefinitions[] = { // plug-in on the Linux 64-bit version of Chrome. kFlashDefinition, { "java-runtime-environment", PluginGroup::kJavaGroupName, "Java", - kJavaVersionRange, arraysize(kJavaVersionRange), - "http://www.java.com/en/download/manual.jsp" }, + kJavaVersionRange, arraysize(kJavaVersionRange) }, { "redhat-icetea-java", "IcedTea", "IcedTea", - kRedhatIcedTeaVersionRange, arraysize(kRedhatIcedTeaVersionRange), - "http://www.linuxsecurity.com/content/section/3/170/" }, + kRedhatIcedTeaVersionRange, arraysize(kRedhatIcedTeaVersionRange) }, kChromePdfDefinition, kGoogleTalkDefinition, }; @@ -440,7 +412,8 @@ void PluginList::LoadPluginsInternal(ScopedVector<PluginGroup>* plugin_groups) { for (std::vector<FilePath>::const_iterator it = plugin_paths.begin(); it != plugin_paths.end(); ++it) { - LoadPlugin(*it, plugin_groups); + WebPluginInfo plugin_info; + LoadPlugin(*it, plugin_groups, &plugin_info); } } @@ -459,35 +432,34 @@ void PluginList::LoadPlugins() { plugin_groups_.swap(new_plugin_groups); } -void PluginList::LoadPlugin(const FilePath& path, - ScopedVector<PluginGroup>* plugin_groups) { +bool PluginList::LoadPlugin(const FilePath& path, + ScopedVector<PluginGroup>* plugin_groups, + WebPluginInfo* plugin_info) { LOG_IF(ERROR, PluginList::DebugPluginLoading()) << "Loading plugin " << path.value(); - WebPluginInfo plugin_info; const PluginEntryPoints* entry_points; - if (!ReadPluginInfo(path, &plugin_info, &entry_points)) - return; + if (!ReadPluginInfo(path, plugin_info, &entry_points)) + return false; - if (!ShouldLoadPlugin(plugin_info, plugin_groups)) - return; + if (!ShouldLoadPlugin(*plugin_info, plugin_groups)) + return false; #if defined(OS_WIN) && !defined(NDEBUG) if (path.BaseName().value() != L"npspy.dll") // Make an exception for NPSPY #endif { - for (size_t i = 0; i < plugin_info.mime_types.size(); ++i) { + for (size_t i = 0; i < plugin_info->mime_types.size(); ++i) { // TODO: don't load global handlers for now. // WebKit hands to the Plugin before it tries // to handle mimeTypes on its own. - const std::string &mime_type = plugin_info.mime_types[i].mime_type; + const std::string &mime_type = plugin_info->mime_types[i].mime_type; if (mime_type == "*") - return; + return false; } } - - base::AutoLock lock(lock_); - AddToPluginGroups(plugin_info, plugin_groups); + AddToPluginGroups(*plugin_info, plugin_groups); + return true; } void PluginList::GetPluginPathsToLoad(std::vector<FilePath>* plugin_paths) { diff --git a/webkit/plugins/npapi/plugin_list.h b/webkit/plugins/npapi/plugin_list.h index bff39c4..87ea02d 100644 --- a/webkit/plugins/npapi/plugin_list.h +++ b/webkit/plugins/npapi/plugin_list.h @@ -162,9 +162,11 @@ class WEBKIT_PLUGINS_EXPORT PluginList { // If no such group exists, an empty string is returned. string16 GetPluginGroupName(const std::string& identifier); - // Load a specific plugin with full path. - void LoadPlugin(const FilePath& filename, - ScopedVector<PluginGroup>* plugin_groups); + // Load a specific plugin with full path. Return true iff loading the plug-in + // was successful. + bool LoadPlugin(const FilePath& filename, + ScopedVector<PluginGroup>* plugin_groups, + webkit::WebPluginInfo* plugin_info); // The following functions are used to support probing for WebPluginInfo // using a different instance of this class. @@ -186,7 +188,6 @@ class WEBKIT_PLUGINS_EXPORT PluginList { // Adds the given WebPluginInfo to its corresponding group, creating it if // necessary, and returns the group. - // Callers need to protect calls to this method by a lock themselves. PluginGroup* AddToPluginGroups(const webkit::WebPluginInfo& web_plugin_info, ScopedVector<PluginGroup>* plugin_groups); diff --git a/webkit/plugins/npapi/plugin_list_unittest.cc b/webkit/plugins/npapi/plugin_list_unittest.cc index 3aa75b5..a58d06b 100644 --- a/webkit/plugins/npapi/plugin_list_unittest.cc +++ b/webkit/plugins/npapi/plugin_list_unittest.cc @@ -37,8 +37,7 @@ const char* kFooIdentifier = "foo"; const char* kFooGroupName = "Foo"; const char* kFooName = "Foo Plugin"; const PluginGroupDefinition kPluginDefinitions[] = { - { kFooIdentifier, kFooGroupName, kFooName, NULL, 0, - "http://example.com/foo" }, + { kFooIdentifier, kFooGroupName, kFooName, NULL, 0 }, }; } // namespace |