15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/pepper_broker_infobar_delegate.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/prefs/pref_service.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/host_content_settings_map.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/content_settings/tab_specific_content_settings.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_finder.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/plugins/plugin_metadata.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 1503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h" 160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/page_navigator.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/plugin_service.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/referrer.h" 22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/public/common/webplugininfo.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/components_strings.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_util.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PepperBrokerInfoBarDelegate::Create( 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::WebContents* web_contents, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& plugin_path, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::Callback<void(bool)>& callback) { 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile = 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile::FromBrowserContext(web_contents->GetBrowserContext()); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(wad): Add ephemeral device ID support for broker in guest mode. 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (profile->IsGuestSession()) { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) callback.Run(false); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabSpecificContentSettings* tab_content_settings = 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TabSpecificContentSettings::FromWebContents(web_contents); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HostContentSettingsMap* content_settings = 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) profile->GetHostContentSettingsMap(); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ContentSetting setting = 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content_settings->GetContentSetting(url, url, 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CONTENT_SETTINGS_TYPE_PPAPI_BROKER, 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string()); 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (setting == CONTENT_SETTING_ASK) { 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::RecordAction( 555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("PPAPI.BrokerInfobarDisplayed")); 567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InfoBarService* infobar_service = 577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InfoBarService::FromWebContents(web_contents); 58a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) infobar_service->AddInfoBar(ConfirmInfoBarDelegate::CreateInfoBar( 59a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<ConfirmInfoBarDelegate>(new PepperBrokerInfoBarDelegate( 60a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) url, plugin_path, 617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch profile->GetPrefs()->GetString(prefs::kAcceptLanguages), 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content_settings, tab_content_settings, callback)))); 637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool allowed = (setting == CONTENT_SETTING_ALLOW); 677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch content::RecordAction(allowed ? 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("PPAPI.BrokerSettingAllow") : 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("PPAPI.BrokerSettingDeny")); 707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch tab_content_settings->SetPepperBrokerAllowed(allowed); 717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch callback.Run(allowed); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PepperBrokerInfoBarDelegate::PepperBrokerInfoBarDelegate( 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& url, 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::FilePath& plugin_path, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& languages, 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) HostContentSettingsMap* content_settings, 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TabSpecificContentSettings* tab_content_settings, 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const base::Callback<void(bool)>& callback) 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : ConfirmInfoBarDelegate(), 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) url_(url), 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) plugin_path_(plugin_path), 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) languages_(languages), 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content_settings_(content_settings), 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tab_content_settings_(tab_content_settings), 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback_(callback) { 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)PepperBrokerInfoBarDelegate::~PepperBrokerInfoBarDelegate() { 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if (!callback_.is_null()) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) callback_.Run(false); 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)int PepperBrokerInfoBarDelegate::GetIconID() const { 9690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) return IDR_INFOBAR_PLUGIN_INSTALL; 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 PepperBrokerInfoBarDelegate::GetMessageText() const { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PluginService* plugin_service = 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::PluginService::GetInstance(); 102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch content::WebPluginInfo plugin; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success = plugin_service->GetPluginInfoByPath(plugin_path_, &plugin); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(success); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<PluginMetadata> plugin_metadata( 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PluginFinder::GetInstance()->GetPluginMetadata(plugin)); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringFUTF16(IDS_PEPPER_BROKER_MESSAGE, 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) plugin_metadata->name(), 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) net::FormatUrl(url_.GetOrigin(), 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) languages_)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 PepperBrokerInfoBarDelegate::GetButtonLabel( 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InfoBarButton button) const { 1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return l10n_util::GetStringUTF16((button == BUTTON_OK) ? 1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch IDS_PEPPER_BROKER_ALLOW_BUTTON : IDS_PEPPER_BROKER_DENY_BUTTON); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PepperBrokerInfoBarDelegate::Accept() { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchCallback(true); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PepperBrokerInfoBarDelegate::Cancel() { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DispatchCallback(false); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 PepperBrokerInfoBarDelegate::GetLinkText() const { 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_LEARN_MORE); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool PepperBrokerInfoBarDelegate::LinkClicked( 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition) { 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch GURL learn_more_url("https://support.google.com/chrome/?p=ib_pepper_broker"); 136a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch InfoBarService::WebContentsFromInfoBar(infobar())->OpenURL( 137a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch content::OpenURLParams( 138a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch learn_more_url, content::Referrer(), 139a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition, 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ui::PAGE_TRANSITION_LINK, false)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PepperBrokerInfoBarDelegate::DispatchCallback(bool result) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RecordAction(result ? 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("PPAPI.BrokerInfobarClickedAllow") : 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UserMetricsAction("PPAPI.BrokerInfobarClickedDeny")); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_.Run(result); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback_ = base::Callback<void(bool)>(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content_settings_->SetContentSetting( 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern::FromURLNoWildcard(url_), 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ContentSettingsPattern::Wildcard(), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CONTENT_SETTINGS_TYPE_PPAPI_BROKER, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string(), result ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK); 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) tab_content_settings_->SetPepperBrokerAllowed(result); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 157