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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/custom_handlers/register_protocol_handler_infobar_delegate.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/infobars/infobar_service.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
1103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "chrome/grit/generated_resources.h"
120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/infobars/core/infobar.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/user_metrics.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "grit/components_strings.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// static
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void RegisterProtocolHandlerInfoBarDelegate::Create(
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InfoBarService* infobar_service,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ProtocolHandlerRegistry* registry,
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const ProtocolHandler& handler) {
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  content::RecordAction(
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UserMetricsAction("RegisterProtocolHandler.InfoBar_Shown"));
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  scoped_ptr<infobars::InfoBar> infobar(
270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      ConfirmInfoBarDelegate::CreateInfoBar(scoped_ptr<ConfirmInfoBarDelegate>(
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)          new RegisterProtocolHandlerInfoBarDelegate(registry, handler))));
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
30a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  for (size_t i = 0; i < infobar_service->infobar_count(); ++i) {
310529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch    infobars::InfoBar* existing_infobar = infobar_service->infobar_at(i);
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    RegisterProtocolHandlerInfoBarDelegate* existing_delegate =
33a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        existing_infobar->delegate()->
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)            AsRegisterProtocolHandlerInfoBarDelegate();
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if ((existing_delegate != NULL) &&
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        existing_delegate->handler_.IsEquivalent(handler)) {
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      infobar_service->ReplaceInfoBar(existing_infobar, infobar.Pass());
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return;
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  infobar_service->AddInfoBar(infobar.Pass());
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RegisterProtocolHandlerInfoBarDelegate::RegisterProtocolHandlerInfoBarDelegate(
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ProtocolHandlerRegistry* registry,
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ProtocolHandler& handler)
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : ConfirmInfoBarDelegate(),
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      registry_(registry),
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      handler_(handler) {
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochRegisterProtocolHandlerInfoBarDelegate::
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ~RegisterProtocolHandlerInfoBarDelegate() {
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch}
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
570529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochinfobars::InfoBarDelegate::InfoBarAutomationType
580529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochRegisterProtocolHandlerInfoBarDelegate::GetInfoBarAutomationType() const {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RPH_INFOBAR;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
620529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochinfobars::InfoBarDelegate::Type
630529e5d033099cbfc42635f6f6183833b09dff6eBen MurdochRegisterProtocolHandlerInfoBarDelegate::GetInfoBarType() const {
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return PAGE_ACTION_TYPE;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)RegisterProtocolHandlerInfoBarDelegate*
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    RegisterProtocolHandlerInfoBarDelegate::
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        AsRegisterProtocolHandlerInfoBarDelegate() {
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return this;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 RegisterProtocolHandlerInfoBarDelegate::GetMessageText() const {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ProtocolHandler old_handler = registry_->GetHandlerFor(handler_.protocol());
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return old_handler.IsEmpty() ?
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      l10n_util::GetStringFUTF16(
77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          IDS_REGISTER_PROTOCOL_HANDLER_CONFIRM,
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          base::UTF8ToUTF16(handler_.url().host()),
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch          GetProtocolName(handler_)) :
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      l10n_util::GetStringFUTF16(
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          IDS_REGISTER_PROTOCOL_HANDLER_CONFIRM_REPLACE,
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          base::UTF8ToUTF16(handler_.url().host()),
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          GetProtocolName(handler_),
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          base::UTF8ToUTF16(old_handler.url().host()));
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 RegisterProtocolHandlerInfoBarDelegate::GetButtonLabel(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InfoBarButton button) const {
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (button == BUTTON_OK) ?
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_REGISTER_PROTOCOL_HANDLER_ACCEPT) :
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_REGISTER_PROTOCOL_HANDLER_DENY);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool RegisterProtocolHandlerInfoBarDelegate::OKButtonTriggersUACPrompt() const {
955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return true;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterProtocolHandlerInfoBarDelegate::Accept() {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UserMetricsAction("RegisterProtocolHandler.Infobar_Accept"));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_->OnAcceptRegisterProtocolHandler(handler_);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterProtocolHandlerInfoBarDelegate::Cancel() {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UserMetricsAction("RegisterProtocolHandler.InfoBar_Deny"));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  registry_->OnIgnoreRegisterProtocolHandler(handler_);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 RegisterProtocolHandlerInfoBarDelegate::GetLinkText() const {
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterProtocolHandlerInfoBarDelegate::LinkClicked(
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WindowOpenDisposition disposition) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RecordAction(
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::UserMetricsAction("RegisterProtocolHandler.InfoBar_LearnMore"));
120a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  InfoBarService::WebContentsFromInfoBar(infobar())->OpenURL(
121a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      content::OpenURLParams(
122a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          GURL(chrome::kLearnMoreRegisterProtocolHandlerURL),
123a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          content::Referrer(),
124a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch          (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition,
1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          ui::PAGE_TRANSITION_LINK, false));
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)base::string16 RegisterProtocolHandlerInfoBarDelegate::GetProtocolName(
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const ProtocolHandler& handler) const {
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (handler.protocol() == "mailto")
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_REGISTER_PROTOCOL_HANDLER_MAILTO_NAME);
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (handler.protocol() == "webcal")
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return l10n_util::GetStringUTF16(IDS_REGISTER_PROTOCOL_HANDLER_WEBCAL_NAME);
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return base::UTF8ToUTF16(handler.protocol());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
137