• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/pepper_broker_infobar_delegate.h"
6 
7 #include "base/prefs/pref_service.h"
8 #include "chrome/browser/content_settings/host_content_settings_map.h"
9 #include "chrome/browser/content_settings/tab_specific_content_settings.h"
10 #include "chrome/browser/infobars/infobar_service.h"
11 #include "chrome/browser/plugins/plugin_finder.h"
12 #include "chrome/browser/plugins/plugin_metadata.h"
13 #include "chrome/browser/profiles/profile.h"
14 #include "chrome/common/pref_names.h"
15 #include "chrome/grit/generated_resources.h"
16 #include "components/infobars/core/infobar.h"
17 #include "content/public/browser/page_navigator.h"
18 #include "content/public/browser/plugin_service.h"
19 #include "content/public/browser/user_metrics.h"
20 #include "content/public/browser/web_contents.h"
21 #include "content/public/common/referrer.h"
22 #include "content/public/common/webplugininfo.h"
23 #include "grit/components_strings.h"
24 #include "grit/theme_resources.h"
25 #include "net/base/net_util.h"
26 #include "ui/base/l10n/l10n_util.h"
27 
28 
29 // static
Create(content::WebContents * web_contents,const GURL & url,const base::FilePath & plugin_path,const base::Callback<void (bool)> & callback)30 void PepperBrokerInfoBarDelegate::Create(
31     content::WebContents* web_contents,
32     const GURL& url,
33     const base::FilePath& plugin_path,
34     const base::Callback<void(bool)>& callback) {
35   Profile* profile =
36       Profile::FromBrowserContext(web_contents->GetBrowserContext());
37   // TODO(wad): Add ephemeral device ID support for broker in guest mode.
38   if (profile->IsGuestSession()) {
39     callback.Run(false);
40     return;
41   }
42 
43   TabSpecificContentSettings* tab_content_settings =
44       TabSpecificContentSettings::FromWebContents(web_contents);
45 
46   HostContentSettingsMap* content_settings =
47       profile->GetHostContentSettingsMap();
48   ContentSetting setting =
49       content_settings->GetContentSetting(url, url,
50                                           CONTENT_SETTINGS_TYPE_PPAPI_BROKER,
51                                           std::string());
52 
53   if (setting == CONTENT_SETTING_ASK) {
54     content::RecordAction(
55         base::UserMetricsAction("PPAPI.BrokerInfobarDisplayed"));
56     InfoBarService* infobar_service =
57         InfoBarService::FromWebContents(web_contents);
58     infobar_service->AddInfoBar(ConfirmInfoBarDelegate::CreateInfoBar(
59         scoped_ptr<ConfirmInfoBarDelegate>(new PepperBrokerInfoBarDelegate(
60             url, plugin_path,
61             profile->GetPrefs()->GetString(prefs::kAcceptLanguages),
62             content_settings, tab_content_settings, callback))));
63     return;
64   }
65 
66   bool allowed = (setting == CONTENT_SETTING_ALLOW);
67   content::RecordAction(allowed ?
68       base::UserMetricsAction("PPAPI.BrokerSettingAllow") :
69       base::UserMetricsAction("PPAPI.BrokerSettingDeny"));
70   tab_content_settings->SetPepperBrokerAllowed(allowed);
71   callback.Run(allowed);
72 }
73 
PepperBrokerInfoBarDelegate(const GURL & url,const base::FilePath & plugin_path,const std::string & languages,HostContentSettingsMap * content_settings,TabSpecificContentSettings * tab_content_settings,const base::Callback<void (bool)> & callback)74 PepperBrokerInfoBarDelegate::PepperBrokerInfoBarDelegate(
75     const GURL& url,
76     const base::FilePath& plugin_path,
77     const std::string& languages,
78     HostContentSettingsMap* content_settings,
79     TabSpecificContentSettings* tab_content_settings,
80     const base::Callback<void(bool)>& callback)
81     : ConfirmInfoBarDelegate(),
82       url_(url),
83       plugin_path_(plugin_path),
84       languages_(languages),
85       content_settings_(content_settings),
86       tab_content_settings_(tab_content_settings),
87       callback_(callback) {
88 }
89 
~PepperBrokerInfoBarDelegate()90 PepperBrokerInfoBarDelegate::~PepperBrokerInfoBarDelegate() {
91   if (!callback_.is_null())
92     callback_.Run(false);
93 }
94 
GetIconID() const95 int PepperBrokerInfoBarDelegate::GetIconID() const {
96   return IDR_INFOBAR_PLUGIN_INSTALL;
97 }
98 
GetMessageText() const99 base::string16 PepperBrokerInfoBarDelegate::GetMessageText() const {
100   content::PluginService* plugin_service =
101       content::PluginService::GetInstance();
102   content::WebPluginInfo plugin;
103   bool success = plugin_service->GetPluginInfoByPath(plugin_path_, &plugin);
104   DCHECK(success);
105   scoped_ptr<PluginMetadata> plugin_metadata(
106       PluginFinder::GetInstance()->GetPluginMetadata(plugin));
107   return l10n_util::GetStringFUTF16(IDS_PEPPER_BROKER_MESSAGE,
108                                     plugin_metadata->name(),
109                                     net::FormatUrl(url_.GetOrigin(),
110                                                    languages_));
111 }
112 
GetButtonLabel(InfoBarButton button) const113 base::string16 PepperBrokerInfoBarDelegate::GetButtonLabel(
114     InfoBarButton button) const {
115   return l10n_util::GetStringUTF16((button == BUTTON_OK) ?
116       IDS_PEPPER_BROKER_ALLOW_BUTTON : IDS_PEPPER_BROKER_DENY_BUTTON);
117 }
118 
Accept()119 bool PepperBrokerInfoBarDelegate::Accept() {
120   DispatchCallback(true);
121   return true;
122 }
123 
Cancel()124 bool PepperBrokerInfoBarDelegate::Cancel() {
125   DispatchCallback(false);
126   return true;
127 }
128 
GetLinkText() const129 base::string16 PepperBrokerInfoBarDelegate::GetLinkText() const {
130   return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
131 }
132 
LinkClicked(WindowOpenDisposition disposition)133 bool PepperBrokerInfoBarDelegate::LinkClicked(
134     WindowOpenDisposition disposition) {
135   GURL learn_more_url("https://support.google.com/chrome/?p=ib_pepper_broker");
136   InfoBarService::WebContentsFromInfoBar(infobar())->OpenURL(
137       content::OpenURLParams(
138           learn_more_url, content::Referrer(),
139           (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition,
140           ui::PAGE_TRANSITION_LINK, false));
141   return false;
142 }
143 
DispatchCallback(bool result)144 void PepperBrokerInfoBarDelegate::DispatchCallback(bool result) {
145   content::RecordAction(result ?
146       base::UserMetricsAction("PPAPI.BrokerInfobarClickedAllow") :
147       base::UserMetricsAction("PPAPI.BrokerInfobarClickedDeny"));
148   callback_.Run(result);
149   callback_ = base::Callback<void(bool)>();
150   content_settings_->SetContentSetting(
151       ContentSettingsPattern::FromURLNoWildcard(url_),
152       ContentSettingsPattern::Wildcard(),
153       CONTENT_SETTINGS_TYPE_PPAPI_BROKER,
154       std::string(), result ? CONTENT_SETTING_ALLOW : CONTENT_SETTING_BLOCK);
155   tab_content_settings_->SetPepperBrokerAllowed(result);
156 }
157