diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-03 21:33:21 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-03 21:33:21 +0000 |
commit | 10f57b9be42b705fd1bed1a97acd90c8c885c396 (patch) | |
tree | 77d5fbbace6a41dc28ace3b4f573fc917aae61da /chrome/browser/views | |
parent | df891031f2d5bd26eccd180fea4deb4797dd7a60 (diff) | |
download | chromium_src-10f57b9be42b705fd1bed1a97acd90c8c885c396.zip chromium_src-10f57b9be42b705fd1bed1a97acd90c8c885c396.tar.gz chromium_src-10f57b9be42b705fd1bed1a97acd90c8c885c396.tar.bz2 |
Add external protocol dialog for Linux.
This exposes a bug where \n in a string resource is rendered literally when it is displayed. I don't know at what point on Windows the '\' + 'n' is translated to a line return, I have filed crbug.com/20943
BUG=20731
Review URL: http://codereview.chromium.org/194002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@25373 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/views')
-rw-r--r-- | chrome/browser/views/external_protocol_dialog.cc | 34 | ||||
-rw-r--r-- | chrome/browser/views/external_protocol_dialog.h | 33 |
2 files changed, 26 insertions, 41 deletions
diff --git a/chrome/browser/views/external_protocol_dialog.cc b/chrome/browser/views/external_protocol_dialog.cc index 2feb0d7..4240e21 100644 --- a/chrome/browser/views/external_protocol_dialog.cc +++ b/chrome/browser/views/external_protocol_dialog.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2009 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -12,8 +12,8 @@ #include "base/thread.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/external_protocol_handler.h" -#include "chrome/browser/tab_contents/tab_util.h" #include "chrome/browser/tab_contents/tab_contents.h" +#include "chrome/browser/tab_contents/tab_util.h" #include "grit/chromium_strings.h" #include "grit/generated_resources.h" #include "views/controls/message_box_view.h" @@ -26,18 +26,26 @@ const int kMessageWidth = 400; } // namespace /////////////////////////////////////////////////////////////////////////////// -// ExternalProtocolDialog, public: +// ExternalProtocolHandler // static -void ExternalProtocolDialog::RunExternalProtocolDialog( - const GURL& url, const std::wstring& command, int render_process_host_id, - int routing_id) { +void ExternalProtocolHandler::RunExternalProtocolDialog( + const GURL& url, int render_process_host_id, int routing_id) { + std::wstring command = + ExternalProtocolDialog::GetApplicationForProtocol(url); + if (command.empty()) { + // ShellExecute won't do anything. Don't bother warning the user. + return; + } TabContents* tab_contents = tab_util::GetTabContentsByID( render_process_host_id, routing_id); ExternalProtocolDialog* handler = new ExternalProtocolDialog(tab_contents, url, command); } +/////////////////////////////////////////////////////////////////////////////// +// ExternalProtocolDialog + ExternalProtocolDialog::~ExternalProtocolDialog() { } @@ -72,16 +80,8 @@ bool ExternalProtocolDialog::Accept() { UMA_HISTOGRAM_LONG_TIMES("clickjacking.launch_url", base::Time::Now() - creation_time_); - MessageLoop* io_loop = g_browser_process->io_thread()->message_loop(); - if (io_loop == NULL) { - // Returning true closes the dialog. - return true; - } - - // Attempt to launch the application on the IO loop. - io_loop->PostTask(FROM_HERE, - NewRunnableFunction( - &ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck, url_)); + ExternalProtocolHandler::LaunchUrlWithoutSecurityCheck(url_); + // Returning true closes the dialog. return true; } @@ -123,7 +123,7 @@ ExternalProtocolDialog::ExternalProtocolDialog(TabContents* tab_contents, views::Window::CreateChromeWindow(root_hwnd, gfx::Rect(), this)->Show(); } -/* static */ +// static std::wstring ExternalProtocolDialog::GetApplicationForProtocol( const GURL& url) { std::wstring url_spec = ASCIIToWide(url.possibly_invalid_spec()); diff --git a/chrome/browser/views/external_protocol_dialog.h b/chrome/browser/views/external_protocol_dialog.h index d74df51..c9e5199 100644 --- a/chrome/browser/views/external_protocol_dialog.h +++ b/chrome/browser/views/external_protocol_dialog.h @@ -1,9 +1,9 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2009 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_EXTERNAL_PROTOCOL_DIALOG_H__ -#define CHROME_BROWSER_EXTERNAL_PROTOCOL_DIALOG_H__ +#ifndef CHROME_BROWSER_EXTERNAL_PROTOCOL_DIALOG_H_ +#define CHROME_BROWSER_EXTERNAL_PROTOCOL_DIALOG_H_ #include "base/time.h" #include "googleurl/src/gurl.h" @@ -14,20 +14,10 @@ class TabContents; class ExternalProtocolDialog : public views::DialogDelegate { public: - // Creates and runs a External Protocol dialog box. - // |url| - The url of the request. - // |command| - the command that ShellExecute will run. - // |render_process_host_id| and |routing_id| are used by - // tab_util::GetTabContentsByID to aquire the tab contents associated with - // this dialog. - // NOTE: There is a race between the Time of Check and the Time Of Use for - // the command line. Since the caller (web page) does not have access - // to change the command line by itself, we do not do anything special - // to protect against this scenario. - static void RunExternalProtocolDialog(const GURL& url, - const std::wstring& command, - int render_process_host_id, - int routing_id); + // RunExternalProtocolDialog calls this private constructor. + ExternalProtocolDialog(TabContents* tab_contents, + const GURL& url, + const std::wstring& command); // Returns the path of the application to be launched given the protocol // of the requested url. Returns an empty string on failure. @@ -49,11 +39,6 @@ class ExternalProtocolDialog : public views::DialogDelegate { virtual bool IsModal() const { return false; } private: - // RunExternalProtocolDialog calls this private constructor. - ExternalProtocolDialog(TabContents* tab_contents, - const GURL& url, - const std::wstring& command); - // The message box view whose commands we handle. MessageBoxView* message_box_view_; @@ -66,7 +51,7 @@ class ExternalProtocolDialog : public views::DialogDelegate { // The time at which this dialog was created. base::Time creation_time_; - DISALLOW_EVIL_CONSTRUCTORS(ExternalProtocolDialog); + DISALLOW_COPY_AND_ASSIGN(ExternalProtocolDialog); }; -#endif // CHROME_BROWSER_EXTERNAL_PROTOCOL_DIALOG_H__ +#endif // CHROME_BROWSER_EXTERNAL_PROTOCOL_DIALOG_H_ |