Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Side by Side Diff: chrome/browser/shell_integration.h

Issue 1657933003: Fixes the interactive default browser UX for policy setting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix merge issue Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef CHROME_BROWSER_SHELL_INTEGRATION_H_ 5 #ifndef CHROME_BROWSER_SHELL_INTEGRATION_H_
6 #define CHROME_BROWSER_SHELL_INTEGRATION_H_ 6 #define CHROME_BROWSER_SHELL_INTEGRATION_H_
7 7
8 #include <string> 8 #include <string>
9 9
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 }; 190 };
191 191
192 class DefaultWebClientObserver { 192 class DefaultWebClientObserver {
193 public: 193 public:
194 virtual ~DefaultWebClientObserver() {} 194 virtual ~DefaultWebClientObserver() {}
195 // Updates the UI state to reflect the current default browser state. 195 // Updates the UI state to reflect the current default browser state.
196 virtual void SetDefaultWebClientUIState(DefaultWebClientUIState state) = 0; 196 virtual void SetDefaultWebClientUIState(DefaultWebClientUIState state) = 0;
197 // Called to notify the UI of the immediate result of invoking 197 // Called to notify the UI of the immediate result of invoking
198 // SetAsDefault. 198 // SetAsDefault.
199 virtual void OnSetAsDefaultConcluded(bool succeeded) {} 199 virtual void OnSetAsDefaultConcluded(bool succeeded) {}
200 // Observer classes that return true to OwnedByWorker are automatically
201 // freed by the worker when they are no longer needed. False by default.
202 virtual bool IsOwnedByWorker();
203 // An observer can permit or decline set-as-default operation if it
204 // requires triggering user interaction. By default not allowed.
205 virtual bool IsInteractiveSetDefaultPermitted();
206 }; 200 };
207 201
208 // Helper objects that handle checking if Chrome is the default browser 202 // Helper objects that handle checking if Chrome is the default browser
209 // or application for a url protocol on Windows and Linux, and also setting 203 // or application for a url protocol on Windows and Linux, and also setting
210 // it as the default. These operations are performed asynchronously on the 204 // it as the default. These operations are performed asynchronously on the
211 // file thread since registry access (on Windows) or the preference database 205 // file thread since registry access (on Windows) or the preference database
212 // (on Linux) are involved and this can be slow. 206 // (on Linux) are involved and this can be slow.
207 // By default, the worker will present the user with an interactive flow if
208 // required by the platform. This can be suppressed via
209 // set_interactive_permitted(), in which case an attempt to set Chrome as
210 // the default handler will silently fail on such platforms.
213 class DefaultWebClientWorker 211 class DefaultWebClientWorker
214 : public base::RefCountedThreadSafe<DefaultWebClientWorker> { 212 : public base::RefCountedThreadSafe<DefaultWebClientWorker> {
215 public: 213 public:
216 explicit DefaultWebClientWorker(DefaultWebClientObserver* observer); 214 // Constructor. The worker will post updates to |observer|. If
215 // |delete_observer| is true, the worker owns the observer and it will be
216 // freed in the destructor.
217 DefaultWebClientWorker(DefaultWebClientObserver* observer,
218 bool delete_observer);
219
220 // Controls whether the worker can use user interaction to set the default
221 // web client. If false, the set-as-default operation will fail on OS where
222 // it is required.
223 void set_interactive_permitted(bool interactive_permitted) {
224 interactive_permitted_ = interactive_permitted;
225 }
217 226
218 // Checks to see if Chrome is the default web client application. The result 227 // Checks to see if Chrome is the default web client application. The result
219 // will be passed back to the observer via the SetDefaultWebClientUIState 228 // will be passed back to the observer via the SetDefaultWebClientUIState
220 // function. If there is no observer, this function does not do anything. 229 // function. If there is no observer, this function does not do anything.
221 void StartCheckIsDefault(); 230 void StartCheckIsDefault();
222 231
223 // Sets Chrome as the default web client application. If there is an 232 // Sets Chrome as the default web client application. If there is an
224 // observer, once the operation has completed the new default will be 233 // observer, once the operation has completed the new default will be
225 // queried and the current status reported via SetDefaultWebClientUIState. 234 // queried and the current status reported via SetDefaultWebClientUIState.
226 void StartSetAsDefault(); 235 void StartSetAsDefault();
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
270 // is default process. 279 // is default process.
271 // It is safe to call this multiple times. Only the first call is processed 280 // It is safe to call this multiple times. Only the first call is processed
272 // after StartSetAsDefault() is invoked. 281 // after StartSetAsDefault() is invoked.
273 void OnSetAsDefaultAttemptComplete(AttemptResult result); 282 void OnSetAsDefaultAttemptComplete(AttemptResult result);
274 283
275 // Returns true if FinalizeSetAsDefault() will be called. 284 // Returns true if FinalizeSetAsDefault() will be called.
276 bool set_as_default_initialized() const { 285 bool set_as_default_initialized() const {
277 return set_as_default_initialized_; 286 return set_as_default_initialized_;
278 } 287 }
279 288
289 // When false, the operation to set as default will fail for interactive
290 // flows.
291 bool interactive_permitted_ = true;
292
280 // Flag that indicates if the set-as-default operation is in progess to 293 // Flag that indicates if the set-as-default operation is in progess to
281 // prevent multiple notifications to the observer. 294 // prevent multiple notifications to the observer.
282 bool set_as_default_in_progress_ = false; 295 bool set_as_default_in_progress_ = false;
283 296
284 private: 297 private:
285 // Checks whether Chrome is the default web client. Always called on the 298 // Checks whether Chrome is the default web client. Always called on the
286 // FILE thread. Subclasses are responsible for calling 299 // FILE thread. Subclasses are responsible for calling
287 // OnCheckIsDefaultComplete() on the UI thread. 300 // OnCheckIsDefaultComplete() on the UI thread.
288 virtual void CheckIsDefault() = 0; 301 virtual void CheckIsDefault() = 0;
289 302
290 // Sets Chrome as the default web client. Always called on the FILE thread. 303 // Sets Chrome as the default web client. Always called on the FILE thread.
291 // |interactive_permitted| will make SetAsDefault() fail if it requires 304 // Subclasses are responsible for calling OnSetAsDefaultAttemptComplete() on
292 // interaction with the user. Subclasses are responsible for calling 305 // the UI thread.
293 // OnSetAsDefaultAttemptComplete() on the UI thread. 306 virtual void SetAsDefault() = 0;
294 virtual void SetAsDefault(bool interactive_permitted) = 0;
295 307
296 // Returns the prefix used for metrics to differentiate UMA metrics for 308 // Returns the prefix used for metrics to differentiate UMA metrics for
297 // setting the default browser and setting the default protocol client. 309 // setting the default browser and setting the default protocol client.
298 virtual const char* GetHistogramPrefix() = 0; 310 virtual const char* GetHistogramPrefix() = 0;
299 311
300 // Invoked on the UI thread prior to starting a set-as-default operation. 312 // Invoked on the UI thread prior to starting a set-as-default operation.
301 // Returns true if the initialization succeeded and a subsequent call to 313 // Returns true if the initialization succeeded and a subsequent call to
302 // FinalizeSetAsDefault() is required. 314 // FinalizeSetAsDefault() is required.
303 virtual bool InitializeSetAsDefault(); 315 virtual bool InitializeSetAsDefault();
304 316
305 // Invoked on the UI thread following a set-as-default operation. 317 // Invoked on the UI thread following a set-as-default operation.
306 virtual void FinalizeSetAsDefault(); 318 virtual void FinalizeSetAsDefault();
307 319
308 // Reports the result and duration for one set-as-default attempt. 320 // Reports the result and duration for one set-as-default attempt.
309 void ReportAttemptResult(AttemptResult result); 321 void ReportAttemptResult(AttemptResult result);
310 322
311 // Updates the UI in our associated view with the current default web 323 // Updates the UI in our associated view with the current default web
312 // client state. 324 // client state.
313 void UpdateUI(DefaultWebClientState state); 325 void UpdateUI(DefaultWebClientState state);
314 326
315 // Returns true if the duration of an attempt to set the default web client 327 // Returns true if the duration of an attempt to set the default web client
316 // should be reported to UMA for |result|. 328 // should be reported to UMA for |result|.
317 static bool ShouldReportDurationForResult(AttemptResult result); 329 static bool ShouldReportDurationForResult(AttemptResult result);
318 330
319 // Returns a string based on |result|. This is used for UMA reports. 331 // Returns a string based on |result|. This is used for UMA reports.
320 static const char* AttemptResultToString(AttemptResult result); 332 static const char* AttemptResultToString(AttemptResult result);
321 333
322 DefaultWebClientObserver* observer_; 334 DefaultWebClientObserver* observer_;
323 335
336 // Indicates if the the observer will be automatically freed by the worker.
337 bool delete_observer_;
338
324 // Flag that indicates the return value of InitializeSetAsDefault(). If 339 // Flag that indicates the return value of InitializeSetAsDefault(). If
325 // true, FinalizeSetAsDefault() will be called to clear what was 340 // true, FinalizeSetAsDefault() will be called to clear what was
326 // initialized. 341 // initialized.
327 bool set_as_default_initialized_ = false; 342 bool set_as_default_initialized_ = false;
328 343
329 // Records the time it takes to set the default browser. 344 // Records the time it takes to set the default browser.
330 base::TimeTicks start_time_; 345 base::TimeTicks start_time_;
331 346
332 // Wait until Chrome has been confirmed as the default browser before 347 // Wait until Chrome has been confirmed as the default browser before
333 // reporting a successful attempt. 348 // reporting a successful attempt.
334 bool check_default_should_report_success_ = false; 349 bool check_default_should_report_success_ = false;
335 350
336 DISALLOW_COPY_AND_ASSIGN(DefaultWebClientWorker); 351 DISALLOW_COPY_AND_ASSIGN(DefaultWebClientWorker);
337 }; 352 };
338 353
339 // Worker for checking and setting the default browser. 354 // Worker for checking and setting the default browser.
340 class DefaultBrowserWorker : public DefaultWebClientWorker { 355 class DefaultBrowserWorker : public DefaultWebClientWorker {
341 public: 356 public:
342 explicit DefaultBrowserWorker(DefaultWebClientObserver* observer); 357 // Constructor. The worker will post updates to |observer|. If
358 // |delete_observer| is true, the worker owns the observer and it will be
359 // freed in the destructor.
360 DefaultBrowserWorker(DefaultWebClientObserver* observer,
361 bool delete_observer);
343 362
344 private: 363 private:
345 ~DefaultBrowserWorker() override; 364 ~DefaultBrowserWorker() override;
346 365
347 // Check if Chrome is the default browser. 366 // Check if Chrome is the default browser.
348 void CheckIsDefault() override; 367 void CheckIsDefault() override;
349 368
350 // Set Chrome as the default browser. 369 // Set Chrome as the default browser.
351 void SetAsDefault(bool interactive_permitted) override; 370 void SetAsDefault() override;
352 371
353 // Returns the histogram prefix for DefaultBrowserWorker. 372 // Returns the histogram prefix for DefaultBrowserWorker.
354 const char* GetHistogramPrefix() override; 373 const char* GetHistogramPrefix() override;
355 374
356 #if defined(OS_WIN) 375 #if defined(OS_WIN)
357 // On Windows 10+, adds the default browser callback and starts the timer 376 // On Windows 10+, adds the default browser callback and starts the timer
358 // that determines if the operation was successful or not. 377 // that determines if the operation was successful or not.
359 bool InitializeSetAsDefault() override; 378 bool InitializeSetAsDefault() override;
360 379
361 // On Windows 10+, removes the default browser callback and stops the timer. 380 // On Windows 10+, removes the default browser callback and stops the timer.
(...skipping 10 matching lines...) Expand all
372 391
373 DISALLOW_COPY_AND_ASSIGN(DefaultBrowserWorker); 392 DISALLOW_COPY_AND_ASSIGN(DefaultBrowserWorker);
374 }; 393 };
375 394
376 // Worker for checking and setting the default client application 395 // Worker for checking and setting the default client application
377 // for a given protocol. A different worker instance is needed for each 396 // for a given protocol. A different worker instance is needed for each
378 // protocol you are interested in, so to check or set the default for 397 // protocol you are interested in, so to check or set the default for
379 // multiple protocols you should use multiple worker objects. 398 // multiple protocols you should use multiple worker objects.
380 class DefaultProtocolClientWorker : public DefaultWebClientWorker { 399 class DefaultProtocolClientWorker : public DefaultWebClientWorker {
381 public: 400 public:
401 // Constructor. The worker will post updates to |observer|. If
402 // |delete_observer| is true, the worker owns the observer and it will be
403 // freed in the destructor.
382 DefaultProtocolClientWorker(DefaultWebClientObserver* observer, 404 DefaultProtocolClientWorker(DefaultWebClientObserver* observer,
383 const std::string& protocol); 405 const std::string& protocol,
406 bool delete_observer);
384 407
385 const std::string& protocol() const { return protocol_; } 408 const std::string& protocol() const { return protocol_; }
386 409
387 protected: 410 protected:
388 ~DefaultProtocolClientWorker() override; 411 ~DefaultProtocolClientWorker() override;
389 412
390 private: 413 private:
391 // Check is Chrome is the default handler for this protocol. 414 // Check is Chrome is the default handler for this protocol.
392 void CheckIsDefault() override; 415 void CheckIsDefault() override;
393 416
394 // Set Chrome as the default handler for this protocol. 417 // Set Chrome as the default handler for this protocol.
395 void SetAsDefault(bool interactive_permitted) override; 418 void SetAsDefault() override;
396 419
397 // Returns the histogram prefix for DefaultProtocolClientWorker. 420 // Returns the histogram prefix for DefaultProtocolClientWorker.
398 const char* GetHistogramPrefix() override; 421 const char* GetHistogramPrefix() override;
399 422
400 std::string protocol_; 423 std::string protocol_;
401 424
402 DISALLOW_COPY_AND_ASSIGN(DefaultProtocolClientWorker); 425 DISALLOW_COPY_AND_ASSIGN(DefaultProtocolClientWorker);
403 }; 426 };
404 427
405 } // namespace shell_integration 428 } // namespace shell_integration
406 429
407 #endif // CHROME_BROWSER_SHELL_INTEGRATION_H_ 430 #endif // CHROME_BROWSER_SHELL_INTEGRATION_H_
OLDNEW
« no previous file with comments | « chrome/browser/external_protocol/external_protocol_handler_unittest.cc ('k') | chrome/browser/shell_integration.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698