external_protocol_dialog.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Use of this source code is governed by a BSD-style license that can be 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// found in the LICENSE file. 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "chrome/browser/chromeos/external_protocol_dialog.h" 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "base/metrics/histogram.h" 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "base/strings/string_util.h" 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "base/strings/utf_string_conversions.h" 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "chrome/browser/external_protocol/external_protocol_handler.h" 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "chrome/browser/tab_contents/tab_util.h" 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "content/public/browser/web_contents.h" 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "content/public/browser/web_contents_view.h" 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "grit/chromium_strings.h" 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "grit/generated_resources.h" 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ui/base/l10n/l10n_util.h" 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ui/gfx/text_elider.h" 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ui/views/controls/message_box_view.h" 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ui/views/widget/widget.h" 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "url/gurl.h" 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruusing content::WebContents; 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querunamespace { 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst int kMessageWidth = 400; 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} // namespace 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// ExternalProtocolHandler 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// static 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid ExternalProtocolHandler::RunExternalProtocolDialog( 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const GURL& url, int render_process_host_id, int routing_id) { 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru WebContents* web_contents = tab_util::GetWebContentsByID( 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru render_process_host_id, routing_id); 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru new ExternalProtocolDialog(web_contents, url); 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// ExternalProtocolDialog 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruExternalProtocolDialog::~ExternalProtocolDialog() { 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru////////////////////////////////////////////////////////////////////////////// 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// ExternalProtocolDialog, views::DialogDelegate implementation: 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint ExternalProtocolDialog::GetDialogButtons() const { 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return ui::DIALOG_BUTTON_OK; 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querubase::string16 ExternalProtocolDialog::GetDialogButtonLabel( 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ui::DialogButton button) const { 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return l10n_util::GetStringUTF16(IDS_EXTERNAL_PROTOCOL_OK_BUTTON_TEXT); 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querubase::string16 ExternalProtocolDialog::GetWindowTitle() const { 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return l10n_util::GetStringUTF16(IDS_EXTERNAL_PROTOCOL_TITLE); 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid ExternalProtocolDialog::DeleteDelegate() { 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru delete this; 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querubool ExternalProtocolDialog::Accept() { 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (message_box_view_->IsCheckBoxSelected()) { 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ExternalProtocolHandler::SetBlockState( 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru scheme_, ExternalProtocolHandler::DONT_BLOCK); 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // Returning true closes the dialog. 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return true; 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruviews::View* ExternalProtocolDialog::GetContentsView() { 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return message_box_view_; 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst views::Widget* ExternalProtocolDialog::GetWidget() const { 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return message_box_view_->GetWidget(); 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruviews::Widget* ExternalProtocolDialog::GetWidget() { 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return message_box_view_->GetWidget(); 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/////////////////////////////////////////////////////////////////////////////// 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// ExternalProtocolDialog, private: 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruExternalProtocolDialog::ExternalProtocolDialog(WebContents* web_contents, 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const GURL& url) 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru : creation_time_(base::TimeTicks::Now()), 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru scheme_(url.scheme()) { 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const int kMaxUrlWithoutSchemeSize = 256; 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru base::string16 elided_url_without_scheme; 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gfx::ElideString(base::ASCIIToUTF16(url.possibly_invalid_spec()), 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru kMaxUrlWithoutSchemeSize, &elided_url_without_scheme); 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru views::MessageBoxView::InitParams params( 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru l10n_util::GetStringFUTF16(IDS_EXTERNAL_PROTOCOL_INFORMATION, 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru base::ASCIIToUTF16(url.scheme() + ":"), 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru elided_url_without_scheme) + base::ASCIIToUTF16("\n\n")); 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru params.message_width = kMessageWidth; 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru message_box_view_ = new views::MessageBoxView(params); 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru message_box_view_->SetCheckBoxLabel( 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru l10n_util::GetStringUTF16(IDS_EXTERNAL_PROTOCOL_CHECKBOX_TEXT)); 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gfx::NativeWindow parent_window; 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (web_contents) { 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru parent_window = web_contents->GetView()->GetTopLevelNativeWindow(); 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // Dialog is top level if we don't have a web_contents associated with us. 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru parent_window = NULL; 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru views::DialogDelegate::CreateDialogWidget(this, NULL, parent_window)->Show(); 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru