blob: 9590cbb713a7166f180dbd9d3a4633029d3dae8b [file] [log] [blame]
[email protected]3bf6ade02009-07-23 19:51:181// Copyright (c) 2009 The Chromium Authors. All rights reserved.
license.botbf09a502008-08-24 00:55:552// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]4a0765a2009-05-08 23:12:255#include "chrome/browser/shell_integration.h"
6
[email protected]28375ae2010-02-05 04:45:507#include "base/command_line.h"
8#include "base/file_util.h"
[email protected]b96aa932009-08-12 21:34:499#include "base/path_service.h"
[email protected]64048bd2010-03-08 23:28:5810#include "base/utf_string_conversions.h"
[email protected]b96aa932009-08-12 21:34:4911#include "chrome/common/chrome_paths.h"
[email protected]28375ae2010-02-05 04:45:5012#include "chrome/common/chrome_switches.h"
[email protected]0d3dc8e22009-11-03 02:27:0113#include "chrome/browser/chrome_thread.h"
initial.commit09911bf2008-07-26 23:55:2914
[email protected]28375ae2010-02-05 04:45:5015std::string ShellIntegration::GetCommandLineArgumentsCommon(const GURL& url,
16 const string16& extension_app_id) {
17 const CommandLine cmd = *CommandLine::ForCurrentProcess();
18 std::wstring arguments_w;
19
20 // Use the same UserDataDir for new launches that we currently have set.
21 std::wstring user_data_dir = cmd.GetSwitchValue(switches::kUserDataDir);
22 if (!user_data_dir.empty()) {
23 // Make sure user_data_dir is an absolute path.
24 if (file_util::AbsolutePath(&user_data_dir) &&
25 file_util::PathExists(FilePath::FromWStringHack(user_data_dir))) {
26 arguments_w += std::wstring(L"--") + ASCIIToWide(switches::kUserDataDir) +
27 L"=\"" + user_data_dir + L"\" ";
28 }
29 }
30
31#if defined (OS_CHROMEOS)
32 std::wstring profile = cmd.GetSwitchValue(switches::kProfile);
33 if (!profile.empty()) {
34 arguments_w += std::wstring(L"--") + ASCIIToWide(switches::kProfile) +
35 L"=\"" + profile + L"\" ";
36 }
37#endif
38
39 // If |extension_app_id| is present, we use the kAppId switch rather than
40 // the kApp switch (the launch url will be read from the extension app
41 // during launch.
42 if (cmd.HasSwitch(switches::kEnableExtensionApps) &&
43 !extension_app_id.empty()) {
44 arguments_w += std::wstring(L"--") + ASCIIToWide(switches::kAppId) +
45 L"=\"" + ASCIIToWide(UTF16ToASCII(extension_app_id)) + L"\" --" +
46 ASCIIToWide(switches::kEnableExtensionApps);
[email protected]64048bd2010-03-08 23:28:5847 } else {
[email protected]28375ae2010-02-05 04:45:5048 // Use '--app=url' instead of just 'url' to launch the browser with minimal
49 // chrome.
50 // Note: Do not change this flag! Old Gears shortcuts will break if you do!
51 std::string url_string = url.spec();
52 ReplaceSubstringsAfterOffset(&url_string, 0, "\\", "%5C");
53 ReplaceSubstringsAfterOffset(&url_string, 0, "\"", "%22");
54 ReplaceSubstringsAfterOffset(&url_string, 0, ";", "%3B");
55 ReplaceSubstringsAfterOffset(&url_string, 0, "$", "%24");
56#if defined(OS_WIN) // Windows shortcuts can't escape % so we use \x instead.
57 ReplaceSubstringsAfterOffset(&url_string, 0, "%", "\\x");
58#endif
59 std::wstring url_w = UTF8ToWide(url_string);
60 arguments_w += std::wstring(L"--") + ASCIIToWide(switches::kApp) +
61 L"=\"" + url_w + L"\"";
62 }
63 return WideToUTF8(arguments_w);
64}
65
[email protected]d24c4012009-07-28 01:57:3166///////////////////////////////////////////////////////////////////////////////
67// ShellIntegration::DefaultBrowserWorker
68//
initial.commit09911bf2008-07-26 23:55:2969
[email protected]d24c4012009-07-28 01:57:3170ShellIntegration::DefaultBrowserWorker::DefaultBrowserWorker(
71 DefaultBrowserObserver* observer)
[email protected]0d3dc8e22009-11-03 02:27:0172 : observer_(observer) {
initial.commit09911bf2008-07-26 23:55:2973}
74
[email protected]d24c4012009-07-28 01:57:3175void ShellIntegration::DefaultBrowserWorker::StartCheckDefaultBrowser() {
76 observer_->SetDefaultBrowserUIState(STATE_PROCESSING);
[email protected]0d3dc8e22009-11-03 02:27:0177 ChromeThread::PostTask(
78 ChromeThread::FILE, FROM_HERE,
79 NewRunnableMethod(
80 this, &DefaultBrowserWorker::ExecuteCheckDefaultBrowser));
initial.commit09911bf2008-07-26 23:55:2981}
82
[email protected]d24c4012009-07-28 01:57:3183void ShellIntegration::DefaultBrowserWorker::StartSetAsDefaultBrowser() {
84 observer_->SetDefaultBrowserUIState(STATE_PROCESSING);
[email protected]0d3dc8e22009-11-03 02:27:0185 ChromeThread::PostTask(
86 ChromeThread::FILE, FROM_HERE,
87 NewRunnableMethod(
88 this, &DefaultBrowserWorker::ExecuteSetAsDefaultBrowser));
[email protected]d24c4012009-07-28 01:57:3189}
90
91void ShellIntegration::DefaultBrowserWorker::ObserverDestroyed() {
92 // Our associated view has gone away, so we shouldn't call back to it if
93 // our worker thread returns after the view is dead.
94 observer_ = NULL;
95}
96
97///////////////////////////////////////////////////////////////////////////////
98// DefaultBrowserWorker, private:
99
100void ShellIntegration::DefaultBrowserWorker::ExecuteCheckDefaultBrowser() {
[email protected]0d3dc8e22009-11-03 02:27:01101 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
[email protected]264f74d12009-09-04 23:39:58102 DefaultBrowserState state = ShellIntegration::IsDefaultBrowser();
[email protected]0d3dc8e22009-11-03 02:27:01103 ChromeThread::PostTask(
104 ChromeThread::UI, FROM_HERE,
105 NewRunnableMethod(
106 this, &DefaultBrowserWorker::CompleteCheckDefaultBrowser, state));
[email protected]d24c4012009-07-28 01:57:31107}
108
109void ShellIntegration::DefaultBrowserWorker::CompleteCheckDefaultBrowser(
[email protected]264f74d12009-09-04 23:39:58110 DefaultBrowserState state) {
[email protected]0d3dc8e22009-11-03 02:27:01111 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
[email protected]264f74d12009-09-04 23:39:58112 UpdateUI(state);
[email protected]d24c4012009-07-28 01:57:31113}
114
115void ShellIntegration::DefaultBrowserWorker::ExecuteSetAsDefaultBrowser() {
[email protected]0d3dc8e22009-11-03 02:27:01116 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::FILE));
[email protected]d24c4012009-07-28 01:57:31117 ShellIntegration::SetAsDefaultBrowser();
[email protected]0d3dc8e22009-11-03 02:27:01118 ChromeThread::PostTask(
119 ChromeThread::UI, FROM_HERE,
120 NewRunnableMethod(
121 this, &DefaultBrowserWorker::CompleteSetAsDefaultBrowser));
[email protected]d24c4012009-07-28 01:57:31122}
123
124void ShellIntegration::DefaultBrowserWorker::CompleteSetAsDefaultBrowser() {
[email protected]0d3dc8e22009-11-03 02:27:01125 DCHECK(ChromeThread::CurrentlyOn(ChromeThread::UI));
[email protected]d24c4012009-07-28 01:57:31126 if (observer_) {
127 // Set as default completed, check again to make sure it stuck...
128 StartCheckDefaultBrowser();
initial.commit09911bf2008-07-26 23:55:29129 }
[email protected]d24c4012009-07-28 01:57:31130}
131
[email protected]264f74d12009-09-04 23:39:58132void ShellIntegration::DefaultBrowserWorker::UpdateUI(
133 DefaultBrowserState state) {
[email protected]d24c4012009-07-28 01:57:31134 if (observer_) {
[email protected]264f74d12009-09-04 23:39:58135 switch (state) {
136 case NOT_DEFAULT_BROWSER:
137 observer_->SetDefaultBrowserUIState(STATE_NOT_DEFAULT);
138 break;
139 case IS_DEFAULT_BROWSER:
140 observer_->SetDefaultBrowserUIState(STATE_IS_DEFAULT);
141 break;
142 case UNKNOWN_DEFAULT_BROWSER:
143 observer_->SetDefaultBrowserUIState(STATE_UNKNOWN);
144 break;
145 default:
146 break;
147 }
[email protected]d24c4012009-07-28 01:57:31148 }
initial.commit09911bf2008-07-26 23:55:29149}