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