172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/chromeos/external_protocol_dialog.h" 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick#include "base/metrics/histogram.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/utf_string_conversions.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/external_protocol_handler.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/tab_contents/tab_util.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/window.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/tab_contents/tab_contents_view.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/chromium_strings.h" 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h" 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/l10n/l10n_util.h" 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/message_box_flags.h" 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "ui/base/text/text_elider.h" 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/controls/message_box_view.h" 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "views/window/window.h" 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace { 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst int kMessageWidth = 400; 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/////////////////////////////////////////////////////////////////////////////// 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExternalProtocolHandler 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// static 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalProtocolHandler::RunExternalProtocolDialog( 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url, int render_process_host_id, int routing_id) { 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch TabContents* tab_contents = tab_util::GetTabContentsByID( 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch render_process_host_id, routing_id); 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(tab_contents); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch new ExternalProtocolDialog(tab_contents, url); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/////////////////////////////////////////////////////////////////////////////// 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExternalProtocolDialog 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExternalProtocolDialog::~ExternalProtocolDialog() { 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch////////////////////////////////////////////////////////////////////////////// 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExternalProtocolDialog, views::DialogDelegate implementation: 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochint ExternalProtocolDialog::GetDialogButtons() const { 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return ui::MessageBoxFlags::DIALOGBUTTON_OK; 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::wstring ExternalProtocolDialog::GetDialogButtonLabel( 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::MessageBoxFlags::DialogButton button) const { 573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen return UTF16ToWide( 583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen l10n_util::GetStringUTF16(IDS_EXTERNAL_PROTOCOL_OK_BUTTON_TEXT)); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochstd::wstring ExternalProtocolDialog::GetWindowTitle() const { 623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen return UTF16ToWide(l10n_util::GetStringUTF16(IDS_EXTERNAL_PROTOCOL_TITLE)); 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochvoid ExternalProtocolDialog::DeleteDelegate() { 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch delete this; 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochbool ExternalProtocolDialog::Accept() { 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (message_box_view_->IsCheckBoxSelected()) { 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ExternalProtocolHandler::SetBlockState( 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch scheme_, ExternalProtocolHandler::DONT_BLOCK); 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Returning true closes the dialog. 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return true; 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochviews::View* ExternalProtocolDialog::GetContentsView() { 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return message_box_view_; 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch/////////////////////////////////////////////////////////////////////////////// 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ExternalProtocolDialog, private: 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochExternalProtocolDialog::ExternalProtocolDialog(TabContents* tab_contents, 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const GURL& url) 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch : creation_time_(base::TimeTicks::Now()), 883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick scheme_(url.scheme()) { 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int kMaxUrlWithoutSchemeSize = 256; 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen string16 elided_url_without_scheme; 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ui::ElideString(ASCIIToUTF16(url.possibly_invalid_spec()), 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch kMaxUrlWithoutSchemeSize, &elided_url_without_scheme); 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 943f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen std::wstring message_text = UTF16ToWide(l10n_util::GetStringFUTF16( 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch IDS_EXTERNAL_PROTOCOL_INFORMATION, 963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen ASCIIToUTF16(url.scheme() + ":"), 97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen elided_url_without_scheme) + ASCIIToUTF16("\n\n")); 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 99ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen message_box_view_ = new views::MessageBoxView( 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ui::MessageBoxFlags::kIsConfirmMessageBox, 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen message_text, 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::wstring(), 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen kMessageWidth); 1043f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen message_box_view_->SetCheckBoxLabel(UTF16ToWide( 1053f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen l10n_util::GetStringUTF16(IDS_EXTERNAL_PROTOCOL_CHECKBOX_TEXT))); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch gfx::NativeWindow parent_window; 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (tab_contents) { 109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch parent_window = tab_contents->view()->GetTopLevelNativeWindow(); 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } else { 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Dialog is top level if we don't have a tab_contents associated with us. 112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch parent_window = NULL; 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 114731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick browser::CreateViewsWindow(parent_window, gfx::Rect(), this)->Show(); 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 116