| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/plugins/plugin_info_message_filter.h" | 5 #include "chrome/browser/plugins/plugin_info_message_filter.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <memory> | 10 #include <memory> |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 #include "components/content_settings/core/browser/host_content_settings_map.h" | 35 #include "components/content_settings/core/browser/host_content_settings_map.h" |
| 36 #include "components/content_settings/core/common/content_settings.h" | 36 #include "components/content_settings/core/common/content_settings.h" |
| 37 #include "components/prefs/pref_service.h" | 37 #include "components/prefs/pref_service.h" |
| 38 #include "components/rappor/rappor_service.h" | 38 #include "components/rappor/rappor_service.h" |
| 39 #include "content/public/browser/browser_thread.h" | 39 #include "content/public/browser/browser_thread.h" |
| 40 #include "content/public/browser/plugin_service.h" | 40 #include "content/public/browser/plugin_service.h" |
| 41 #include "content/public/browser/plugin_service_filter.h" | 41 #include "content/public/browser/plugin_service_filter.h" |
| 42 #include "content/public/common/content_constants.h" | 42 #include "content/public/common/content_constants.h" |
| 43 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" | 43 #include "net/base/registry_controlled_domains/registry_controlled_domain.h" |
| 44 #include "url/gurl.h" | 44 #include "url/gurl.h" |
| 45 #include "url/origin.h" |
| 45 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. | 46 #include "widevine_cdm_version.h" // In SHARED_INTERMEDIATE_DIR. |
| 46 | 47 |
| 47 #if defined(ENABLE_EXTENSIONS) | 48 #if defined(ENABLE_EXTENSIONS) |
| 48 #include "components/guest_view/browser/guest_view_base.h" | 49 #include "components/guest_view/browser/guest_view_base.h" |
| 49 #include "extensions/browser/extension_registry.h" | 50 #include "extensions/browser/extension_registry.h" |
| 50 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" | 51 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" |
| 51 #include "extensions/common/constants.h" | 52 #include "extensions/common/constants.h" |
| 52 #include "extensions/common/extension.h" | 53 #include "extensions/common/extension.h" |
| 53 #include "extensions/common/manifest_handlers/webview_info.h" | 54 #include "extensions/common/manifest_handlers/webview_info.h" |
| 54 #endif | 55 #endif |
| (...skipping 27 matching lines...) Expand all Loading... |
| 82 status, PLUGIN_AVAILABILITY_STATUS_MAX); | 83 status, PLUGIN_AVAILABILITY_STATUS_MAX); |
| 83 #endif // defined(WIDEVINE_CDM_AVAILABLE) | 84 #endif // defined(WIDEVINE_CDM_AVAILABLE) |
| 84 } | 85 } |
| 85 | 86 |
| 86 #endif // defined(ENABLE_PEPPER_CDMS) | 87 #endif // defined(ENABLE_PEPPER_CDMS) |
| 87 | 88 |
| 88 // Report usage metrics for Silverlight and Flash plugin instantiations to the | 89 // Report usage metrics for Silverlight and Flash plugin instantiations to the |
| 89 // RAPPOR service. | 90 // RAPPOR service. |
| 90 void ReportMetrics(const std::string& mime_type, | 91 void ReportMetrics(const std::string& mime_type, |
| 91 const GURL& url, | 92 const GURL& url, |
| 92 const GURL& origin_url) { | 93 const url::Origin& main_frame_origin) { |
| 93 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); | 94 DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
| 94 | 95 |
| 95 if (chrome::IsIncognitoSessionActive()) | 96 if (chrome::IsIncognitoSessionActive()) |
| 96 return; | 97 return; |
| 97 rappor::RapporService* rappor_service = g_browser_process->rappor_service(); | 98 rappor::RapporService* rappor_service = g_browser_process->rappor_service(); |
| 98 if (!rappor_service) | 99 if (!rappor_service) |
| 99 return; | 100 return; |
| 101 if (main_frame_origin.unique()) |
| 102 return; |
| 100 | 103 |
| 101 if (mime_type == content::kFlashPluginSwfMimeType || | 104 if (mime_type == content::kFlashPluginSwfMimeType || |
| 102 mime_type == content::kFlashPluginSplMimeType) { | 105 mime_type == content::kFlashPluginSplMimeType) { |
| 103 rappor_service->RecordSample( | 106 rappor_service->RecordSample( |
| 104 "Plugins.FlashOriginUrl", rappor::ETLD_PLUS_ONE_RAPPOR_TYPE, | 107 "Plugins.FlashOriginUrl", rappor::ETLD_PLUS_ONE_RAPPOR_TYPE, |
| 105 net::registry_controlled_domains::GetDomainAndRegistry( | 108 net::registry_controlled_domains::GetDomainAndRegistry( |
| 106 origin_url, | 109 main_frame_origin.GetURL(), |
| 107 net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES)); | 110 net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES)); |
| 108 rappor_service->RecordSample( | 111 rappor_service->RecordSample( |
| 109 "Plugins.FlashUrl", rappor::ETLD_PLUS_ONE_RAPPOR_TYPE, | 112 "Plugins.FlashUrl", rappor::ETLD_PLUS_ONE_RAPPOR_TYPE, |
| 110 net::registry_controlled_domains::GetDomainAndRegistry( | 113 net::registry_controlled_domains::GetDomainAndRegistry( |
| 111 url, | 114 url, |
| 112 net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES)); | 115 net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES)); |
| 113 } | 116 } |
| 114 } | 117 } |
| 115 | 118 |
| 116 #if defined(ENABLE_EXTENSIONS) | 119 #if defined(ENABLE_EXTENSIONS) |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 | 203 |
| 201 // Destroy on the UI thread because we contain a |PrefMember|. | 204 // Destroy on the UI thread because we contain a |PrefMember|. |
| 202 content::BrowserThread::DeleteOnUIThread::Destruct(this); | 205 content::BrowserThread::DeleteOnUIThread::Destruct(this); |
| 203 } | 206 } |
| 204 | 207 |
| 205 PluginInfoMessageFilter::~PluginInfoMessageFilter() {} | 208 PluginInfoMessageFilter::~PluginInfoMessageFilter() {} |
| 206 | 209 |
| 207 struct PluginInfoMessageFilter::GetPluginInfo_Params { | 210 struct PluginInfoMessageFilter::GetPluginInfo_Params { |
| 208 int render_frame_id; | 211 int render_frame_id; |
| 209 GURL url; | 212 GURL url; |
| 210 GURL top_origin_url; | 213 url::Origin main_frame_origin; |
| 211 std::string mime_type; | 214 std::string mime_type; |
| 212 }; | 215 }; |
| 213 | 216 |
| 214 void PluginInfoMessageFilter::OnGetPluginInfo( | 217 void PluginInfoMessageFilter::OnGetPluginInfo( |
| 215 int render_frame_id, | 218 int render_frame_id, |
| 216 const GURL& url, | 219 const GURL& url, |
| 217 const GURL& top_origin_url, | 220 const url::Origin& main_frame_origin, |
| 218 const std::string& mime_type, | 221 const std::string& mime_type, |
| 219 IPC::Message* reply_msg) { | 222 IPC::Message* reply_msg) { |
| 220 GetPluginInfo_Params params = { | 223 GetPluginInfo_Params params = {render_frame_id, url, main_frame_origin, |
| 221 render_frame_id, | 224 mime_type}; |
| 222 url, | |
| 223 top_origin_url, | |
| 224 mime_type | |
| 225 }; | |
| 226 PluginService::GetInstance()->GetPlugins( | 225 PluginService::GetInstance()->GetPlugins( |
| 227 base::Bind(&PluginInfoMessageFilter::PluginsLoaded, | 226 base::Bind(&PluginInfoMessageFilter::PluginsLoaded, |
| 228 weak_ptr_factory_.GetWeakPtr(), | 227 weak_ptr_factory_.GetWeakPtr(), |
| 229 params, reply_msg)); | 228 params, reply_msg)); |
| 230 } | 229 } |
| 231 | 230 |
| 232 void PluginInfoMessageFilter::PluginsLoaded( | 231 void PluginInfoMessageFilter::PluginsLoaded( |
| 233 const GetPluginInfo_Params& params, | 232 const GetPluginInfo_Params& params, |
| 234 IPC::Message* reply_msg, | 233 IPC::Message* reply_msg, |
| 235 const std::vector<WebPluginInfo>& plugins) { | 234 const std::vector<WebPluginInfo>& plugins) { |
| 236 std::unique_ptr<ChromeViewHostMsg_GetPluginInfo_Output> output( | 235 std::unique_ptr<ChromeViewHostMsg_GetPluginInfo_Output> output( |
| 237 new ChromeViewHostMsg_GetPluginInfo_Output()); | 236 new ChromeViewHostMsg_GetPluginInfo_Output()); |
| 238 // This also fills in |actual_mime_type|. | 237 // This also fills in |actual_mime_type|. |
| 239 std::unique_ptr<PluginMetadata> plugin_metadata; | 238 std::unique_ptr<PluginMetadata> plugin_metadata; |
| 240 if (context_.FindEnabledPlugin(params.render_frame_id, params.url, | 239 if (context_.FindEnabledPlugin(params.render_frame_id, params.url, |
| 241 params.top_origin_url, params.mime_type, | 240 params.main_frame_origin, params.mime_type, |
| 242 &output->status, &output->plugin, | 241 &output->status, &output->plugin, |
| 243 &output->actual_mime_type, &plugin_metadata)) { | 242 &output->actual_mime_type, &plugin_metadata)) { |
| 244 context_.DecidePluginStatus(params, output->plugin, plugin_metadata.get(), | 243 context_.DecidePluginStatus(params, output->plugin, plugin_metadata.get(), |
| 245 &output->status); | 244 &output->status); |
| 246 } | 245 } |
| 247 | 246 |
| 248 if (output->status == ChromeViewHostMsg_GetPluginInfo_Status::kNotFound) { | 247 if (output->status == ChromeViewHostMsg_GetPluginInfo_Status::kNotFound) { |
| 249 // Check to see if the component updater can fetch an implementation. | 248 // Check to see if the component updater can fetch an implementation. |
| 250 base::PostTaskAndReplyWithResult( | 249 base::PostTaskAndReplyWithResult( |
| 251 main_thread_task_runner_.get(), FROM_HERE, | 250 main_thread_task_runner_.get(), FROM_HERE, |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 *status = ChromeViewHostMsg_GetPluginInfo_Status::kAllowed; | 311 *status = ChromeViewHostMsg_GetPluginInfo_Status::kAllowed; |
| 313 return; | 312 return; |
| 314 } | 313 } |
| 315 | 314 |
| 316 ContentSetting plugin_setting = CONTENT_SETTING_DEFAULT; | 315 ContentSetting plugin_setting = CONTENT_SETTING_DEFAULT; |
| 317 bool uses_default_content_setting = true; | 316 bool uses_default_content_setting = true; |
| 318 bool is_managed = false; | 317 bool is_managed = false; |
| 319 // Check plugin content settings. The primary URL is the top origin URL and | 318 // Check plugin content settings. The primary URL is the top origin URL and |
| 320 // the secondary URL is the plugin URL. | 319 // the secondary URL is the plugin URL. |
| 321 PluginUtils::GetPluginContentSetting( | 320 PluginUtils::GetPluginContentSetting( |
| 322 host_content_settings_map_, plugin, params.top_origin_url, params.url, | 321 host_content_settings_map_, plugin, params.main_frame_origin, params.url, |
| 323 plugin_metadata->identifier(), &plugin_setting, | 322 plugin_metadata->identifier(), &plugin_setting, |
| 324 &uses_default_content_setting, &is_managed); | 323 &uses_default_content_setting, &is_managed); |
| 325 | 324 |
| 326 // TODO(tommycli): Remove once we deprecate the plugin ASK policy. | 325 // TODO(tommycli): Remove once we deprecate the plugin ASK policy. |
| 327 bool legacy_ask_user = plugin_setting == CONTENT_SETTING_ASK; | 326 bool legacy_ask_user = plugin_setting == CONTENT_SETTING_ASK; |
| 328 plugin_setting = PluginsFieldTrial::EffectiveContentSetting( | 327 plugin_setting = PluginsFieldTrial::EffectiveContentSetting( |
| 329 CONTENT_SETTINGS_TYPE_PLUGINS, plugin_setting); | 328 CONTENT_SETTINGS_TYPE_PLUGINS, plugin_setting); |
| 330 | 329 |
| 331 DCHECK(plugin_setting != CONTENT_SETTING_DEFAULT); | 330 DCHECK(plugin_setting != CONTENT_SETTING_DEFAULT); |
| 332 DCHECK(plugin_setting != CONTENT_SETTING_ASK); | 331 DCHECK(plugin_setting != CONTENT_SETTING_ASK); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 390 if (extensions::WebViewRendererState::GetInstance()->IsGuest( | 389 if (extensions::WebViewRendererState::GetInstance()->IsGuest( |
| 391 render_process_id_)) | 390 render_process_id_)) |
| 392 *status = ChromeViewHostMsg_GetPluginInfo_Status::kUnauthorized; | 391 *status = ChromeViewHostMsg_GetPluginInfo_Status::kUnauthorized; |
| 393 } | 392 } |
| 394 #endif | 393 #endif |
| 395 } | 394 } |
| 396 | 395 |
| 397 bool PluginInfoMessageFilter::Context::FindEnabledPlugin( | 396 bool PluginInfoMessageFilter::Context::FindEnabledPlugin( |
| 398 int render_frame_id, | 397 int render_frame_id, |
| 399 const GURL& url, | 398 const GURL& url, |
| 400 const GURL& top_origin_url, | 399 const url::Origin& main_frame_origin, |
| 401 const std::string& mime_type, | 400 const std::string& mime_type, |
| 402 ChromeViewHostMsg_GetPluginInfo_Status* status, | 401 ChromeViewHostMsg_GetPluginInfo_Status* status, |
| 403 WebPluginInfo* plugin, | 402 WebPluginInfo* plugin, |
| 404 std::string* actual_mime_type, | 403 std::string* actual_mime_type, |
| 405 std::unique_ptr<PluginMetadata>* plugin_metadata) const { | 404 std::unique_ptr<PluginMetadata>* plugin_metadata) const { |
| 406 *status = ChromeViewHostMsg_GetPluginInfo_Status::kAllowed; | 405 *status = ChromeViewHostMsg_GetPluginInfo_Status::kAllowed; |
| 407 | 406 |
| 408 bool allow_wildcard = true; | 407 bool allow_wildcard = true; |
| 409 std::vector<WebPluginInfo> matching_plugins; | 408 std::vector<WebPluginInfo> matching_plugins; |
| 410 std::vector<std::string> mime_types; | 409 std::vector<std::string> mime_types; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 423 #endif // defined(GOOGLE_CHROME_BUILD) | 422 #endif // defined(GOOGLE_CHROME_BUILD) |
| 424 if (matching_plugins.empty()) { | 423 if (matching_plugins.empty()) { |
| 425 *status = ChromeViewHostMsg_GetPluginInfo_Status::kNotFound; | 424 *status = ChromeViewHostMsg_GetPluginInfo_Status::kNotFound; |
| 426 return false; | 425 return false; |
| 427 } | 426 } |
| 428 | 427 |
| 429 content::PluginServiceFilter* filter = | 428 content::PluginServiceFilter* filter = |
| 430 PluginService::GetInstance()->GetFilter(); | 429 PluginService::GetInstance()->GetFilter(); |
| 431 size_t i = 0; | 430 size_t i = 0; |
| 432 for (; i < matching_plugins.size(); ++i) { | 431 for (; i < matching_plugins.size(); ++i) { |
| 433 if (!filter || filter->IsPluginAvailable(render_process_id_, | 432 if (!filter || |
| 434 render_frame_id, | 433 filter->IsPluginAvailable(render_process_id_, render_frame_id, |
| 435 resource_context_, | 434 resource_context_, url, main_frame_origin, |
| 436 url, | 435 &matching_plugins[i])) { |
| 437 top_origin_url, | |
| 438 &matching_plugins[i])) { | |
| 439 break; | 436 break; |
| 440 } | 437 } |
| 441 } | 438 } |
| 442 | 439 |
| 443 // If we broke out of the loop, we have found an enabled plugin. | 440 // If we broke out of the loop, we have found an enabled plugin. |
| 444 bool enabled = i < matching_plugins.size(); | 441 bool enabled = i < matching_plugins.size(); |
| 445 if (!enabled) { | 442 if (!enabled) { |
| 446 // Otherwise, we only found disabled plugins, so we take the first one. | 443 // Otherwise, we only found disabled plugins, so we take the first one. |
| 447 i = 0; | 444 i = 0; |
| 448 *status = ChromeViewHostMsg_GetPluginInfo_Status::kDisabled; | 445 *status = ChromeViewHostMsg_GetPluginInfo_Status::kDisabled; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 output->group_name = plugin_metadata->name(); | 489 output->group_name = plugin_metadata->name(); |
| 493 } | 490 } |
| 494 | 491 |
| 495 context_.MaybeGrantAccess(output->status, output->plugin.path); | 492 context_.MaybeGrantAccess(output->status, output->plugin.path); |
| 496 | 493 |
| 497 ChromeViewHostMsg_GetPluginInfo::WriteReplyParams(reply_msg, *output); | 494 ChromeViewHostMsg_GetPluginInfo::WriteReplyParams(reply_msg, *output); |
| 498 Send(reply_msg); | 495 Send(reply_msg); |
| 499 if (output->status != ChromeViewHostMsg_GetPluginInfo_Status::kNotFound) { | 496 if (output->status != ChromeViewHostMsg_GetPluginInfo_Status::kNotFound) { |
| 500 main_thread_task_runner_->PostTask( | 497 main_thread_task_runner_->PostTask( |
| 501 FROM_HERE, base::Bind(&ReportMetrics, output->actual_mime_type, | 498 FROM_HERE, base::Bind(&ReportMetrics, output->actual_mime_type, |
| 502 params.url, params.top_origin_url)); | 499 params.url, params.main_frame_origin)); |
| 503 } | 500 } |
| 504 } | 501 } |
| 505 | 502 |
| 506 void PluginInfoMessageFilter::Context::MaybeGrantAccess( | 503 void PluginInfoMessageFilter::Context::MaybeGrantAccess( |
| 507 ChromeViewHostMsg_GetPluginInfo_Status status, | 504 ChromeViewHostMsg_GetPluginInfo_Status status, |
| 508 const base::FilePath& path) const { | 505 const base::FilePath& path) const { |
| 509 if (status == ChromeViewHostMsg_GetPluginInfo_Status::kAllowed || | 506 if (status == ChromeViewHostMsg_GetPluginInfo_Status::kAllowed || |
| 510 status == ChromeViewHostMsg_GetPluginInfo_Status::kPlayImportantContent) { | 507 status == ChromeViewHostMsg_GetPluginInfo_Status::kPlayImportantContent) { |
| 511 ChromePluginServiceFilter::GetInstance()->AuthorizePlugin( | 508 ChromePluginServiceFilter::GetInstance()->AuthorizePlugin( |
| 512 render_process_id_, path); | 509 render_process_id_, path); |
| 513 } | 510 } |
| 514 } | 511 } |
| 515 | 512 |
| 516 bool PluginInfoMessageFilter::Context::IsPluginEnabled( | 513 bool PluginInfoMessageFilter::Context::IsPluginEnabled( |
| 517 const content::WebPluginInfo& plugin) const { | 514 const content::WebPluginInfo& plugin) const { |
| 518 return plugin_prefs_->IsPluginEnabled(plugin); | 515 return plugin_prefs_->IsPluginEnabled(plugin); |
| 519 } | 516 } |
| OLD | NEW |