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