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