1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file.
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#ifndef CHROME_BROWSER_PROFILE_RESETTER_PROFILE_RESETTER_H_
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define CHROME_BROWSER_PROFILE_RESETTER_PROFILE_RESETTER_H_
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <utility>
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <vector>
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
11b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/basictypes.h"
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/callback.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/files/file_path.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/weak_ptr.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/string16.h"
18b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/threading/non_thread_safe.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "chrome/browser/browsing_data/browsing_data_remover.h"
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/profile_resetter/brandcoded_default_settings.h"
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "components/search_engines/template_url_service.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class Profile;
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace base {
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class CancellationFlag;
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This class allows resetting certain aspects of a profile to default values.
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// It is used in case the profile has been damaged due to malware or bad user
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// settings.
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class ProfileResetter : public base::NonThreadSafe,
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                        public BrowsingDataRemover::Observer {
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public:
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Flags indicating what aspects of a profile shall be reset.
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum Resettable {
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    DEFAULT_SEARCH_ENGINE = 1 << 0,
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    HOMEPAGE = 1 << 1,
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    CONTENT_SETTINGS = 1 << 2,
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    COOKIES_AND_SITE_DATA = 1 << 3,
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    EXTENSIONS = 1 << 4,
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    STARTUP_PAGES = 1 << 5,
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    PINNED_TABS = 1 << 6,
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    SHORTCUTS = 1 << 7,
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Update ALL if you add new values and check whether the type of
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // ResettableFlags needs to be enlarged.
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ALL = DEFAULT_SEARCH_ENGINE | HOMEPAGE | CONTENT_SETTINGS |
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          COOKIES_AND_SITE_DATA | EXTENSIONS | STARTUP_PAGES | PINNED_TABS |
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          SHORTCUTS
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Bit vector for Resettable enum.
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  typedef uint32 ResettableFlags;
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
55b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  COMPILE_ASSERT(sizeof(ResettableFlags) == sizeof(Resettable),
56b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)                 type_ResettableFlags_doesnt_match_Resettable);
57b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  explicit ProfileResetter(Profile* profile);
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~ProfileResetter();
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Resets |resettable_flags| and calls |callback| on the UI thread on
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // completion. |default_settings| allows the caller to specify some default
636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // settings. |default_settings| shouldn't be NULL. |accepted_send_feedback|
646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // identifies whether the user accepted to send feedback or not.
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void Reset(ResettableFlags resettable_flags,
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch             scoped_ptr<BrandcodedDefaultSettings> master_settings,
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)             bool accepted_send_feedback,
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)             const base::Closure& callback);
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
7090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  bool IsActive() const;
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Marks |resettable| as done and triggers |callback_| if all pending jobs
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // have completed.
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void MarkAsDone(Resettable resettable);
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ResetDefaultSearchEngine();
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ResetHomepage();
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ResetContentSettings();
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ResetCookiesAndSiteData();
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void ResetExtensions();
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void ResetStartupPages();
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void ResetPinnedTabs();
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void ResetShortcuts();
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // BrowsingDataRemover::Observer:
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnBrowsingDataRemoverDone() OVERRIDE;
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Callback for when TemplateURLService has loaded.
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  void OnTemplateURLServiceLoaded();
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  Profile* const profile_;
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  scoped_ptr<BrandcodedDefaultSettings> master_settings_;
94868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  TemplateURLService* template_url_service_;
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Flags of a Resetable indicating which reset operations we are still waiting
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // for.
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ResettableFlags pending_reset_flags_;
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Called on UI thread when reset has been completed.
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::Closure callback_;
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // If non-null it means removal is in progress. BrowsingDataRemover takes care
104eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // of deleting itself when done.
105eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  BrowsingDataRemover* cookies_remover_;
106eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<TemplateURLService::Subscription> template_url_service_sub_;
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::WeakPtrFactory<ProfileResetter> weak_ptr_factory_;
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(ProfileResetter);
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)};
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Path to shortcut and command line arguments.
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef std::pair<base::FilePath, base::string16> ShortcutCommand;
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)typedef base::RefCountedData<base::CancellationFlag> SharedCancellationFlag;
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// On Windows returns all the shortcuts which launch Chrome and corresponding
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// arguments. |cancel| can be passed to abort the operation earlier.
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Call on FILE thread.
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)std::vector<ShortcutCommand> GetChromeLaunchShortcuts(
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const scoped_refptr<SharedCancellationFlag>& cancel);
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif  // CHROME_BROWSER_PROFILE_RESETTER_PROFILE_RESETTER_H_
126