Index: chrome/browser/shell_integration.h |
diff --git a/chrome/browser/shell_integration.h b/chrome/browser/shell_integration.h |
index a39635a15fc2672e962dec72c49cc8deb3afba6c..e5f3255d0817e959430d20c3c5123810e600f401 100644 |
--- a/chrome/browser/shell_integration.h |
+++ b/chrome/browser/shell_integration.h |
@@ -108,7 +108,8 @@ bool IsFirefoxDefaultBrowser(); |
DefaultWebClientState IsDefaultProtocolClient(const std::string& protocol); |
// Data that needs to be passed between the app launcher stub and Chrome. |
-struct AppModeInfo {}; |
+struct AppModeInfo { |
+}; |
void SetAppModeInfo(const AppModeInfo* info); |
const AppModeInfo* AppModeInfo(); |
@@ -130,7 +131,7 @@ base::CommandLine CommandLineArgsForLauncher( |
// The new command line reuses the current process's user data directory and |
// profile. |
void AppendProfileArgs(const base::FilePath& profile_path, |
- base::CommandLine* command_line); |
+ base::CommandLine* command_line); |
#if defined(OS_WIN) |
// Generates an application user model ID (AppUserModelId) for a given app |
@@ -141,11 +142,12 @@ void AppendProfileArgs(const base::FilePath& profile_path, |
// Chrome installs), |app_name| should already be suffixed, this method will |
// then further suffix it with the profile id as described above. |
base::string16 GetAppModelIdForProfile(const base::string16& app_name, |
- const base::FilePath& profile_path); |
+ const base::FilePath& profile_path); |
// Generates an application user model ID (AppUserModelId) for Chromium by |
// calling GetAppModelIdForProfile() with ShellUtil::GetAppId() as app_name. |
-base::string16 GetChromiumModelIdForProfile(const base::FilePath& profile_path); |
+base::string16 GetChromiumModelIdForProfile( |
+ const base::FilePath& profile_path); |
// Get the AppUserModelId for the App List, for the profile in |profile_path|. |
base::string16 GetAppListAppModelIdForProfile( |
@@ -163,7 +165,7 @@ void MigrateTaskbarPins(); |
// This method is only public for the sake of tests and shouldn't be called |
// externally otherwise. |
int MigrateShortcutsInPathInternal(const base::FilePath& chrome_exe, |
- const base::FilePath& path); |
+ const base::FilePath& path); |
// Returns the path to the Start Menu shortcut for the given Chrome. |
base::FilePath GetStartMenuShortcut(const base::FilePath& chrome_exe); |
@@ -197,12 +199,6 @@ class DefaultWebClientObserver { |
// Called to notify the UI of the immediate result of invoking |
// SetAsDefault. |
virtual void OnSetAsDefaultConcluded(bool succeeded) {} |
- // Observer classes that return true to OwnedByWorker are automatically |
- // freed by the worker when they are no longer needed. False by default. |
- virtual bool IsOwnedByWorker(); |
- // An observer can permit or decline set-as-default operation if it |
- // requires triggering user interaction. By default not allowed. |
- virtual bool IsInteractiveSetDefaultPermitted(); |
}; |
// Helper objects that handle checking if Chrome is the default browser |
@@ -210,10 +206,25 @@ class DefaultWebClientObserver { |
// it as the default. These operations are performed asynchronously on the |
// file thread since registry access (on Windows) or the preference database |
// (on Linux) are involved and this can be slow. |
+// By default, the worker will present the user with an interactive flow if |
+// required by the platform. This can be suppressed via |
+// set_interactive_permitted(), in which case an attempt to set Chrome as |
+// the default handler will silently fail on such platforms. |
class DefaultWebClientWorker |
: public base::RefCountedThreadSafe<DefaultWebClientWorker> { |
public: |
- explicit DefaultWebClientWorker(DefaultWebClientObserver* observer); |
+ // Constructor. The worker will post updates to |observer|. If |
+ // |delete_observer| is true, the worker owns the observer and it will be |
+ // freed in the destructor. |
+ DefaultWebClientWorker(DefaultWebClientObserver* observer, |
+ bool delete_observer); |
+ |
+ // Controls whether the worker can use user interaction to set the default |
+ // web client. If false, the set-as-default operation will fail on OS where |
+ // it is required. |
+ void set_interactive_permitted(bool interactive_permitted) { |
+ interactive_permitted_ = interactive_permitted; |
+ } |
// Checks to see if Chrome is the default web client application. The result |
// will be passed back to the observer via the SetDefaultWebClientUIState |
@@ -277,6 +288,10 @@ class DefaultWebClientWorker |
return set_as_default_initialized_; |
} |
+ // When false, the operation to set as default will fail for interactive |
+ // flows. |
+ bool interactive_permitted_ = true; |
+ |
// Flag that indicates if the set-as-default operation is in progess to |
// prevent multiple notifications to the observer. |
bool set_as_default_in_progress_ = false; |
@@ -288,10 +303,9 @@ class DefaultWebClientWorker |
virtual void CheckIsDefault() = 0; |
// Sets Chrome as the default web client. Always called on the FILE thread. |
- // |interactive_permitted| will make SetAsDefault() fail if it requires |
- // interaction with the user. Subclasses are responsible for calling |
- // OnSetAsDefaultAttemptComplete() on the UI thread. |
- virtual void SetAsDefault(bool interactive_permitted) = 0; |
+ // Subclasses are responsible for calling OnSetAsDefaultAttemptComplete() on |
+ // the UI thread. |
+ virtual void SetAsDefault() = 0; |
// Returns the prefix used for metrics to differentiate UMA metrics for |
// setting the default browser and setting the default protocol client. |
@@ -321,6 +335,9 @@ class DefaultWebClientWorker |
DefaultWebClientObserver* observer_; |
+ // Indicates if the the observer will be automatically freed by the worker. |
+ bool delete_observer_; |
+ |
// Flag that indicates the return value of InitializeSetAsDefault(). If |
// true, FinalizeSetAsDefault() will be called to clear what was |
// initialized. |
@@ -339,7 +356,11 @@ class DefaultWebClientWorker |
// Worker for checking and setting the default browser. |
class DefaultBrowserWorker : public DefaultWebClientWorker { |
public: |
- explicit DefaultBrowserWorker(DefaultWebClientObserver* observer); |
+ // Constructor. The worker will post updates to |observer|. If |
+ // |delete_observer| is true, the worker owns the observer and it will be |
+ // freed in the destructor. |
+ DefaultBrowserWorker(DefaultWebClientObserver* observer, |
+ bool delete_observer); |
private: |
~DefaultBrowserWorker() override; |
@@ -348,7 +369,7 @@ class DefaultBrowserWorker : public DefaultWebClientWorker { |
void CheckIsDefault() override; |
// Set Chrome as the default browser. |
- void SetAsDefault(bool interactive_permitted) override; |
+ void SetAsDefault() override; |
// Returns the histogram prefix for DefaultBrowserWorker. |
const char* GetHistogramPrefix() override; |
@@ -379,8 +400,12 @@ class DefaultBrowserWorker : public DefaultWebClientWorker { |
// multiple protocols you should use multiple worker objects. |
class DefaultProtocolClientWorker : public DefaultWebClientWorker { |
public: |
+ // Constructor. The worker will post updates to |observer|. If |
+ // |delete_observer| is true, the worker owns the observer and it will be |
+ // freed in the destructor. |
DefaultProtocolClientWorker(DefaultWebClientObserver* observer, |
- const std::string& protocol); |
+ const std::string& protocol, |
+ bool delete_observer); |
const std::string& protocol() const { return protocol_; } |
@@ -392,7 +417,7 @@ class DefaultProtocolClientWorker : public DefaultWebClientWorker { |
void CheckIsDefault() override; |
// Set Chrome as the default handler for this protocol. |
- void SetAsDefault(bool interactive_permitted) override; |
+ void SetAsDefault() override; |
// Returns the histogram prefix for DefaultProtocolClientWorker. |
const char* GetHistogramPrefix() override; |