summaryrefslogtreecommitdiffstats
path: root/chrome/browser/views
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-03 21:33:21 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-03 21:33:21 +0000
commit10f57b9be42b705fd1bed1a97acd90c8c885c396 (patch)
tree77d5fbbace6a41dc28ace3b4f573fc917aae61da /chrome/browser/views
parentdf891031f2d5bd26eccd180fea4deb4797dd7a60 (diff)
downloadchromium_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.cc34
-rw-r--r--chrome/browser/views/external_protocol_dialog.h33
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_