register_protocol_handler_infobar_delegate.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
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/custom_handlers/register_protocol_handler_infobar_delegate.h"
6
7#include "base/strings/utf_string_conversions.h"
8#include "chrome/browser/custom_handlers/protocol_handler_registry.h"
9#include "chrome/browser/infobars/infobar_service.h"
10#include "chrome/common/url_constants.h"
11#include "components/infobars/core/infobar.h"
12#include "content/public/browser/user_metrics.h"
13#include "content/public/browser/web_contents.h"
14#include "grit/generated_resources.h"
15#include "ui/base/l10n/l10n_util.h"
16
17// static
18void RegisterProtocolHandlerInfoBarDelegate::Create(
19    InfoBarService* infobar_service,
20    ProtocolHandlerRegistry* registry,
21    const ProtocolHandler& handler) {
22  content::RecordAction(
23      base::UserMetricsAction("RegisterProtocolHandler.InfoBar_Shown"));
24
25  scoped_ptr<infobars::InfoBar> infobar(
26      ConfirmInfoBarDelegate::CreateInfoBar(scoped_ptr<ConfirmInfoBarDelegate>(
27          new RegisterProtocolHandlerInfoBarDelegate(registry, handler))));
28
29  for (size_t i = 0; i < infobar_service->infobar_count(); ++i) {
30    infobars::InfoBar* existing_infobar = infobar_service->infobar_at(i);
31    RegisterProtocolHandlerInfoBarDelegate* existing_delegate =
32        existing_infobar->delegate()->
33            AsRegisterProtocolHandlerInfoBarDelegate();
34    if ((existing_delegate != NULL) &&
35        existing_delegate->handler_.IsEquivalent(handler)) {
36      infobar_service->ReplaceInfoBar(existing_infobar, infobar.Pass());
37      return;
38    }
39  }
40
41  infobar_service->AddInfoBar(infobar.Pass());
42}
43
44RegisterProtocolHandlerInfoBarDelegate::RegisterProtocolHandlerInfoBarDelegate(
45    ProtocolHandlerRegistry* registry,
46    const ProtocolHandler& handler)
47    : ConfirmInfoBarDelegate(),
48      registry_(registry),
49      handler_(handler) {
50}
51
52RegisterProtocolHandlerInfoBarDelegate::
53    ~RegisterProtocolHandlerInfoBarDelegate() {
54}
55
56infobars::InfoBarDelegate::InfoBarAutomationType
57RegisterProtocolHandlerInfoBarDelegate::GetInfoBarAutomationType() const {
58  return RPH_INFOBAR;
59}
60
61infobars::InfoBarDelegate::Type
62RegisterProtocolHandlerInfoBarDelegate::GetInfoBarType() const {
63  return PAGE_ACTION_TYPE;
64}
65
66RegisterProtocolHandlerInfoBarDelegate*
67    RegisterProtocolHandlerInfoBarDelegate::
68        AsRegisterProtocolHandlerInfoBarDelegate() {
69  return this;
70}
71
72base::string16 RegisterProtocolHandlerInfoBarDelegate::GetMessageText() const {
73  ProtocolHandler old_handler = registry_->GetHandlerFor(handler_.protocol());
74  return old_handler.IsEmpty() ?
75      l10n_util::GetStringFUTF16(IDS_REGISTER_PROTOCOL_HANDLER_CONFIRM,
76          handler_.title(), base::UTF8ToUTF16(handler_.url().host()),
77          GetProtocolName(handler_)) :
78      l10n_util::GetStringFUTF16(IDS_REGISTER_PROTOCOL_HANDLER_CONFIRM_REPLACE,
79          handler_.title(), base::UTF8ToUTF16(handler_.url().host()),
80          GetProtocolName(handler_), old_handler.title());
81}
82
83base::string16 RegisterProtocolHandlerInfoBarDelegate::GetButtonLabel(
84    InfoBarButton button) const {
85  return (button == BUTTON_OK) ?
86      l10n_util::GetStringFUTF16(IDS_REGISTER_PROTOCOL_HANDLER_ACCEPT,
87                                 handler_.title()) :
88      l10n_util::GetStringUTF16(IDS_REGISTER_PROTOCOL_HANDLER_DENY);
89}
90
91bool RegisterProtocolHandlerInfoBarDelegate::OKButtonTriggersUACPrompt() const {
92  return true;
93}
94
95bool RegisterProtocolHandlerInfoBarDelegate::Accept() {
96  content::RecordAction(
97      base::UserMetricsAction("RegisterProtocolHandler.Infobar_Accept"));
98  registry_->OnAcceptRegisterProtocolHandler(handler_);
99  return true;
100}
101
102bool RegisterProtocolHandlerInfoBarDelegate::Cancel() {
103  content::RecordAction(
104      base::UserMetricsAction("RegisterProtocolHandler.InfoBar_Deny"));
105  registry_->OnIgnoreRegisterProtocolHandler(handler_);
106  return true;
107}
108
109base::string16 RegisterProtocolHandlerInfoBarDelegate::GetLinkText() const {
110  return l10n_util::GetStringUTF16(IDS_LEARN_MORE);
111}
112
113bool RegisterProtocolHandlerInfoBarDelegate::LinkClicked(
114    WindowOpenDisposition disposition) {
115  content::RecordAction(
116      base::UserMetricsAction("RegisterProtocolHandler.InfoBar_LearnMore"));
117  InfoBarService::WebContentsFromInfoBar(infobar())->OpenURL(
118      content::OpenURLParams(
119          GURL(chrome::kLearnMoreRegisterProtocolHandlerURL),
120          content::Referrer(),
121          (disposition == CURRENT_TAB) ? NEW_FOREGROUND_TAB : disposition,
122          content::PAGE_TRANSITION_LINK, false));
123  return false;
124}
125
126base::string16 RegisterProtocolHandlerInfoBarDelegate::GetProtocolName(
127    const ProtocolHandler& handler) const {
128  if (handler.protocol() == "mailto")
129    return l10n_util::GetStringUTF16(IDS_REGISTER_PROTOCOL_HANDLER_MAILTO_NAME);
130  if (handler.protocol() == "webcal")
131    return l10n_util::GetStringUTF16(IDS_REGISTER_PROTOCOL_HANDLER_WEBCAL_NAME);
132  return base::UTF8ToUTF16(handler.protocol());
133}
134