blob: 21ee71ff6c188da4bbfd1c6981e249aaca0a110d [file] [log] [blame]
[email protected]b6b72222012-02-11 02:04:131// Copyright (c) 2012 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]9bc8cff2010-04-03 01:05:395#ifndef CHROME_BROWSER_SHELL_INTEGRATION_H_
6#define CHROME_BROWSER_SHELL_INTEGRATION_H_
[email protected]32b76ef2010-07-26 23:08:247#pragma once
initial.commit09911bf2008-07-26 23:55:298
9#include <string>
10
[email protected]b96aa932009-08-12 21:34:4911#include "base/basictypes.h"
[email protected]378017072012-02-24 06:52:4712#include "base/file_path.h"
[email protected]3b63f8f42011-03-28 01:54:1513#include "base/memory/ref_counted.h"
[email protected]b96aa932009-08-12 21:34:4914#include "base/string16.h"
[email protected]42896802009-08-28 23:39:4415#include "googleurl/src/gurl.h"
[email protected]0b303cc2009-09-28 22:35:1516#include "third_party/skia/include/core/SkBitmap.h"
[email protected]0b303cc2009-09-28 22:35:1517
[email protected]b10392932011-03-08 21:28:1418class CommandLine;
[email protected]d24c4012009-07-28 01:57:3119
[email protected]9bc8cff2010-04-03 01:05:3920#if defined(USE_X11)
[email protected]af71d642010-03-12 10:29:0421namespace base {
[email protected]76b90d312010-08-03 03:00:5022class Environment;
[email protected]af71d642010-03-12 10:29:0423}
[email protected]9bc8cff2010-04-03 01:05:3924#endif
[email protected]af71d642010-03-12 10:29:0425
initial.commit09911bf2008-07-26 23:55:2926class ShellIntegration {
27 public:
[email protected]4468a5b2011-05-26 07:48:0228 // Sets Chrome as the default browser (only for the current user). Returns
29 // false if this operation fails.
initial.commit09911bf2008-07-26 23:55:2930 static bool SetAsDefaultBrowser();
31
[email protected]4468a5b2011-05-26 07:48:0232 // Sets Chrome as the default client application for the given protocol
33 // (only for the current user). Returns false if this operation fails.
34 static bool SetAsDefaultProtocolClient(const std::string& protocol);
35
[email protected]a01481b2011-07-15 04:30:0236 // Returns true if the running browser can be set as the default browser.
37 static bool CanSetAsDefaultBrowser();
38
39 // Returns true if the running browser can be set as the default client
[email protected]5e3e09632011-07-18 02:25:3140 // application for specific protocols.
41 static bool CanSetAsDefaultProtocolClient();
[email protected]a01481b2011-07-15 04:30:0242
[email protected]264f74d12009-09-04 23:39:5843 // On Linux, it may not be possible to determine or set the default browser
44 // on some desktop environments or configurations. So, we use this enum and
45 // not a plain bool. (Note however that if used like a bool, this enum will
46 // have reasonable behavior.)
[email protected]4468a5b2011-05-26 07:48:0247 enum DefaultWebClientState {
48 NOT_DEFAULT_WEB_CLIENT = 0,
49 IS_DEFAULT_WEB_CLIENT,
50 UNKNOWN_DEFAULT_WEB_CLIENT = -1
[email protected]264f74d12009-09-04 23:39:5851 };
52
53 // Attempt to determine if this instance of Chrome is the default browser and
54 // return the appropriate state. (Defined as being the handler for HTTP/HTTPS
55 // protocols; we don't want to report "no" here if the user has simply chosen
56 // to open HTML files in a text editor and FTP links with an FTP client.)
[email protected]4468a5b2011-05-26 07:48:0257 static DefaultWebClientState IsDefaultBrowser();
initial.commit09911bf2008-07-26 23:55:2958
[email protected]cd63ef62009-05-06 19:41:3759 // Returns true if Firefox is likely to be the default browser for the current
initial.commit09911bf2008-07-26 23:55:2960 // user. This method is very fast so it can be invoked in the UI thread.
61 static bool IsFirefoxDefaultBrowser();
[email protected]d24c4012009-07-28 01:57:3162
[email protected]4468a5b2011-05-26 07:48:0263 // Attempt to determine if this instance of Chrome is the default client
64 // application for the given protocol and return the appropriate state.
65 static DefaultWebClientState
66 IsDefaultProtocolClient(const std::string& protocol);
67
[email protected]ed5431872009-11-17 08:39:5168 struct ShortcutInfo {
[email protected]93aa89c72010-10-20 21:32:0469 ShortcutInfo();
70 ~ShortcutInfo();
71
[email protected]ed5431872009-11-17 08:39:5172 GURL url;
[email protected]28375ae2010-02-05 04:45:5073 // If |extension_id| is non-empty, this is short cut is to an extension-app
74 // and the launch url will be detected at start-up. In this case, |url|
75 // is still used to generate the app id (windows app id, not chrome app id).
[email protected]01ed1962011-03-04 19:03:1376 std::string extension_id;
[email protected]ed5431872009-11-17 08:39:5177 string16 title;
78 string16 description;
[email protected]378017072012-02-24 06:52:4779 FilePath extension_path;
[email protected]ed5431872009-11-17 08:39:5180 SkBitmap favicon;
81
[email protected]5a20b192012-03-01 06:01:5782 // Shortcuts to platform apps are created differently. They start up with
83 // their own user data directory and load the app from |extension_path|.
84 bool is_platform_app;
[email protected]ed5431872009-11-17 08:39:5185 bool create_on_desktop;
86 bool create_in_applications_menu;
87
88 // For Windows, this refers to quick launch bar prior to Win7. In Win7,
89 // this means "pin to taskbar". For Mac/Linux, this could be used for
90 // Mac dock or the gnome/kde application launcher. However, those are not
91 // implemented yet.
92 bool create_in_quick_launch_bar;
93 };
94
[email protected]b10392932011-03-08 21:28:1495 // Set up command line arguments for launching a URL or an app.
96 // The new command line reuses the current process's user data directory (and
97 // login profile, for ChromeOS).
98 // If |extension_app_id| is non-empty, the arguments use kAppId=<id>.
99 // Otherwise, kApp=<url> is used.
100 static CommandLine CommandLineArgsForLauncher(
[email protected]01ed1962011-03-04 19:03:13101 const GURL& url,
102 const std::string& extension_app_id);
[email protected]28375ae2010-02-05 04:45:50103
[email protected]5a20b192012-03-01 06:01:57104 // Set up command line arguments for launching a platform app.
105 // The command line will have the switches --app-id, --user-data-dir and
106 // --load-extension, using values |extension_app_id|, |user_data_dir| and
107 // |extension_path| respectively.
108 static CommandLine CommandLineArgsForPlatformApp(
109 const std::string& extension_app_id,
110 const FilePath& user_data_dir,
111 const FilePath& extension_path);
112
[email protected]753efc42010-03-09 19:52:16113#if defined(USE_X11)
[email protected]1379919b2010-09-23 16:56:37114 // Returns filename of the desktop shortcut used to launch the browser.
[email protected]c5ae5742010-09-20 18:59:53115 static std::string GetDesktopName(base::Environment* env);
116
[email protected]76b90d312010-08-03 03:00:50117 static bool GetDesktopShortcutTemplate(base::Environment* env,
[email protected]9bc8cff2010-04-03 01:05:39118 std::string* output);
[email protected]620942e2010-02-16 10:12:12119
[email protected]b96aa932009-08-12 21:34:49120 // Returns filename for .desktop file based on |url|, sanitized for security.
121 static FilePath GetDesktopShortcutFilename(const GURL& url);
122
123 // Returns contents for .desktop file based on |template_contents|, |url|
124 // and |title|. The |template_contents| should be contents of .desktop file
125 // used to launch Chrome.
126 static std::string GetDesktopFileContents(
[email protected]a0b60cfd2011-04-06 18:02:41127 const std::string& template_contents,
128 const std::string& app_name,
129 const GURL& url,
130 const std::string& extension_id,
131 const string16& title,
[email protected]28375ae2010-02-05 04:45:50132 const std::string& icon_name);
[email protected]b96aa932009-08-12 21:34:49133
[email protected]620942e2010-02-16 10:12:12134 static void CreateDesktopShortcut(const ShortcutInfo& shortcut_info,
135 const std::string& shortcut_template);
[email protected]753efc42010-03-09 19:52:16136#endif // defined(USE_X11)
[email protected]d24c4012009-07-28 01:57:31137
[email protected]12f520c2010-01-06 18:11:15138#if defined(OS_WIN)
139 // Generates Win7 app id for given app name and profile path. The returned app
140 // id is in the format of "|app_name|[.<profile_id>]". "profile_id" is
141 // appended when user override the default value.
[email protected]b6b72222012-02-11 02:04:13142 static string16 GetAppId(const string16& app_name,
143 const FilePath& profile_path);
[email protected]12f520c2010-01-06 18:11:15144
145 // Generates Win7 app id for Chromium by calling GetAppId with
146 // chrome::kBrowserAppID as app_name.
[email protected]b6b72222012-02-11 02:04:13147 static string16 GetChromiumAppId(const FilePath& profile_path);
[email protected]c9bb06f42010-01-13 23:53:48148
[email protected]2de2d622011-10-21 22:07:37149 // Returns the path to the Chromium icon. This is used to specify the icon
150 // to use for the taskbar group on Win 7.
151 static string16 GetChromiumIconPath();
152
[email protected]c9bb06f42010-01-13 23:53:48153 // Migrates existing chrome shortcuts by tagging them with correct app id.
154 // see http://crbug.com/28104
155 static void MigrateChromiumShortcuts();
[email protected]12f520c2010-01-06 18:11:15156#endif // defined(OS_WIN)
157
[email protected]4468a5b2011-05-26 07:48:02158 // The current default web client application UI state. This is used when
159 // querying if Chrome is the default browser or the default handler
160 // application for a url protocol, and communicates the state and result of
161 // a request.
162 enum DefaultWebClientUIState {
[email protected]d24c4012009-07-28 01:57:31163 STATE_PROCESSING,
[email protected]264f74d12009-09-04 23:39:58164 STATE_NOT_DEFAULT,
165 STATE_IS_DEFAULT,
166 STATE_UNKNOWN
[email protected]d24c4012009-07-28 01:57:31167 };
168
[email protected]4468a5b2011-05-26 07:48:02169 class DefaultWebClientObserver {
[email protected]d24c4012009-07-28 01:57:31170 public:
[email protected]4468a5b2011-05-26 07:48:02171 virtual ~DefaultWebClientObserver() {}
[email protected]d24c4012009-07-28 01:57:31172 // Updates the UI state to reflect the current default browser state.
[email protected]4468a5b2011-05-26 07:48:02173 virtual void SetDefaultWebClientUIState(DefaultWebClientUIState state) = 0;
[email protected]97e2e3f2011-07-22 10:21:25174 // Observer classes that return true to OwnedByWorker are automatically
175 // freed by the worker when they are no longer needed.
176 virtual bool IsOwnedByWorker() { return false; }
[email protected]d24c4012009-07-28 01:57:31177 };
[email protected]4468a5b2011-05-26 07:48:02178
179 // Helper objects that handle checking if Chrome is the default browser
180 // or application for a url protocol on Windows and Linux, and also setting
181 // it as the default. These operations are performed asynchronously on the
182 // file thread since registry access (on Windows) or the preference database
183 // (on Linux) are involved and this can be slow.
184 class DefaultWebClientWorker
185 : public base::RefCountedThreadSafe<DefaultWebClientWorker> {
[email protected]d24c4012009-07-28 01:57:31186 public:
[email protected]4468a5b2011-05-26 07:48:02187 explicit DefaultWebClientWorker(DefaultWebClientObserver* observer);
[email protected]d24c4012009-07-28 01:57:31188
[email protected]4468a5b2011-05-26 07:48:02189 // Checks to see if Chrome is the default web client application. The result
190 // will be passed back to the observer via the SetDefaultWebClientUIState
191 // function. If there is no observer, this function does not do anything.
192 void StartCheckIsDefault();
[email protected]d24c4012009-07-28 01:57:31193
[email protected]4468a5b2011-05-26 07:48:02194 // Sets Chrome as the default web client application. If there is an
195 // observer, once the operation has completed the new default will be
196 // queried and the current status reported via SetDefaultWebClientUIState.
197 void StartSetAsDefault();
[email protected]d24c4012009-07-28 01:57:31198
199 // Called to notify the worker that the view is gone.
200 void ObserverDestroyed();
201
[email protected]4468a5b2011-05-26 07:48:02202 protected:
203 friend class base::RefCountedThreadSafe<DefaultWebClientWorker>;
[email protected]e6e6ba42009-11-07 01:56:19204
[email protected]4468a5b2011-05-26 07:48:02205 virtual ~DefaultWebClientWorker() {}
206
207 private:
208 // Function that performs the check.
209 virtual DefaultWebClientState CheckIsDefault() = 0;
210
211 // Function that sets Chrome as the default web client.
212 virtual void SetAsDefault() = 0;
213
214 // Function that handles performing the check on the file thread. This
215 // function is posted as a task onto the file thread, where it performs
216 // the check. When the check has finished the CompleteCheckIsDefault
217 // function is posted to the UI thread, where the result is sent back to
218 // the observer.
219 void ExecuteCheckIsDefault();
220
221 // Function that handles setting Chrome as the default web client on the
222 // file thread. This function is posted as a task onto the file thread.
223 // Once it is finished the CompleteSetAsDefault function is posted to the
224 // UI thread which will check the status of Chrome as the default, and
225 // send this to the observer.
226 void ExecuteSetAsDefault();
227
228 // Communicate results to the observer. This function is posted as a task
229 // onto the UI thread by the ExecuteCheckIsDefault function running in the
230 // file thread.
231 void CompleteCheckIsDefault(DefaultWebClientState state);
232
233 // When the action to set Chrome as the default has completed this function
234 // is run. It is posted as a task back onto the UI thread by the
235 // ExecuteSetAsDefault function running in the file thread. This function
236 // will the start the check process, which, if an observer is present,
237 // reports to it the new status.
238 void CompleteSetAsDefault();
239
240 // Updates the UI in our associated view with the current default web
241 // client state.
242 void UpdateUI(DefaultWebClientState state);
243
244 DefaultWebClientObserver* observer_;
245
246 DISALLOW_COPY_AND_ASSIGN(DefaultWebClientWorker);
247 };
248
249 // Worker for checking and setting the default browser.
250 class DefaultBrowserWorker : public DefaultWebClientWorker {
251 public:
252 explicit DefaultBrowserWorker(DefaultWebClientObserver* observer);
253
254 private:
[email protected]e6e6ba42009-11-07 01:56:19255 virtual ~DefaultBrowserWorker() {}
256
[email protected]4468a5b2011-05-26 07:48:02257 // Check if Chrome is the default browser.
[email protected]49fd7e22011-11-21 16:52:21258 virtual DefaultWebClientState CheckIsDefault() OVERRIDE;
[email protected]d24c4012009-07-28 01:57:31259
[email protected]4468a5b2011-05-26 07:48:02260 // Set Chrome as the default browser.
[email protected]49fd7e22011-11-21 16:52:21261 virtual void SetAsDefault() OVERRIDE;
[email protected]d24c4012009-07-28 01:57:31262
[email protected]d24c4012009-07-28 01:57:31263 DISALLOW_COPY_AND_ASSIGN(DefaultBrowserWorker);
264 };
[email protected]4468a5b2011-05-26 07:48:02265
266 // Worker for checking and setting the default client application
267 // for a given protocol. A different worker instance is needed for each
268 // protocol you are interested in, so to check or set the default for
269 // multiple protocols you should use multiple worker objects.
270 class DefaultProtocolClientWorker : public DefaultWebClientWorker {
271 public:
272 DefaultProtocolClientWorker(DefaultWebClientObserver* observer,
273 const std::string& protocol);
274
[email protected]bcb999d2011-05-31 15:11:35275 const std::string& protocol() const { return protocol_; }
276
[email protected]97e2e3f2011-07-22 10:21:25277 protected:
[email protected]4468a5b2011-05-26 07:48:02278 virtual ~DefaultProtocolClientWorker() {}
279
[email protected]97e2e3f2011-07-22 10:21:25280 private:
[email protected]4468a5b2011-05-26 07:48:02281 // Check is Chrome is the default handler for this protocol.
[email protected]49fd7e22011-11-21 16:52:21282 virtual DefaultWebClientState CheckIsDefault() OVERRIDE;
[email protected]4468a5b2011-05-26 07:48:02283
284 // Set Chrome as the default handler for this protocol.
[email protected]49fd7e22011-11-21 16:52:21285 virtual void SetAsDefault() OVERRIDE;
[email protected]4468a5b2011-05-26 07:48:02286
287 std::string protocol_;
288
289 DISALLOW_COPY_AND_ASSIGN(DefaultProtocolClientWorker);
290 };
initial.commit09911bf2008-07-26 23:55:29291};
292
[email protected]9bc8cff2010-04-03 01:05:39293#endif // CHROME_BROWSER_SHELL_INTEGRATION_H_