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