• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_SYNC_SYNC_SETUP_FLOW_H_
6 #define CHROME_BROWSER_SYNC_SYNC_SETUP_FLOW_H_
7 #pragma once
8 
9 #include <string>
10 #include <vector>
11 
12 #include "base/gtest_prod_util.h"
13 #include "base/time.h"
14 #include "chrome/browser/sync/profile_sync_service.h"
15 #include "chrome/browser/sync/sync_setup_wizard.h"
16 #include "chrome/browser/sync/syncable/model_type.h"
17 #include "chrome/browser/ui/webui/html_dialog_ui.h"
18 #include "ui/base/l10n/l10n_util.h"
19 #include "ui/gfx/native_widget_types.h"
20 
21 class SyncSetupFlowHandler;
22 class SyncSetupFlowContainer;
23 
24 // A structure which contains all the configuration information for sync.
25 // This can be stored or passed around when the configuration is managed
26 // by multiple stages of the wizard.
27 struct SyncConfiguration {
28   SyncConfiguration();
29   ~SyncConfiguration();
30 
31   bool sync_everything;
32   syncable::ModelTypeSet data_types;
33   bool use_secondary_passphrase;
34   std::string secondary_passphrase;
35 };
36 
37 // The state machine used by SyncSetupWizard, exposed in its own header
38 // to facilitate testing of SyncSetupWizard.  This class is used to open and
39 // run the sync setup overlay in tabbed options and deletes itself when the
40 // overlay closes.
41 class SyncSetupFlow {
42  public:
43   virtual ~SyncSetupFlow();
44 
45   // Runs a flow from |start| to |end|, and does the work of actually showing
46   // the HTML dialog.  |container| is kept up-to-date with the lifetime of the
47   // flow (e.g it is emptied on dialog close).
48   static SyncSetupFlow* Run(ProfileSyncService* service,
49                             SyncSetupFlowContainer* container,
50                             SyncSetupWizard::State start,
51                             SyncSetupWizard::State end);
52 
53   // Fills |args| with "user" and "error" arguments by querying |service|.
54   static void GetArgsForGaiaLogin(
55       const ProfileSyncService* service,
56       DictionaryValue* args);
57 
58   // Fills |args| for the configure screen (Choose Data Types/Encryption)
59   static void GetArgsForConfigure(
60       ProfileSyncService* service,
61       DictionaryValue* args);
62 
63   // Fills |args| for the enter passphrase screen.
64   static void GetArgsForEnterPassphrase(
65       bool tried_creating_explicit_passphrase,
66       bool tried_setting_explicit_passphrase,
67       DictionaryValue* args);
68 
69   void AttachSyncSetupHandler(SyncSetupFlowHandler* handler);
70 
71   // Triggers a state machine transition to advance_state.
72   void Advance(SyncSetupWizard::State advance_state);
73 
74   // Focuses the dialog.  This is useful in cases where the dialog has been
75   // obscured by a browser window.
76   void Focus();
77 
78   void OnUserSubmittedAuth(const std::string& username,
79                            const std::string& password,
80                            const std::string& captcha,
81                            const std::string& access_code);
82 
83   void OnUserConfigured(const SyncConfiguration& configuration);
84 
85   // The 'passphrase' screen is used when the user is prompted to enter
86   // an existing passphrase.
87   void OnPassphraseEntry(const std::string& passphrase);
88 
89   // The user canceled the passphrase entry without supplying a passphrase.
90   void OnPassphraseCancel();
91 
92   // The 'first passphrase' screen is for users migrating from a build
93   // without passwords, who are prompted to make a passphrase choice.
94   // TODO(jhawkins): This is no longer used; remove this method.
95   void OnFirstPassphraseEntry(const std::string& option,
96                               const std::string& passphrase);
97 
98   void OnGoToDashboard();
99 
100   void OnDialogClosed(const std::string& json_retval);
101 
102  private:
103   FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, InitialStepLogin);
104   FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, ChooseDataTypesSetsPrefs);
105   FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, DialogCancelled);
106   FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, InvalidTransitions);
107   FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, FullSuccessfulRunSetsPref);
108   FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, AbortedByPendingClear);
109   FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, DiscreteRunGaiaLogin);
110   FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, DiscreteRunChooseDataTypes);
111   FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest,
112                            DiscreteRunChooseDataTypesAbortedByPendingClear);
113   FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, EnterPassphraseRequired);
114   FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, PassphraseMigration);
115 
116   // Use static Run method to get an instance.
117   SyncSetupFlow(SyncSetupWizard::State start_state,
118                 SyncSetupWizard::State end_state,
119                 const std::string& args,
120                 SyncSetupFlowContainer* container,
121                 ProfileSyncService* service);
122 
123   // Returns true if |this| should transition its state machine to |state|
124   // based on |current_state_|, or false if that would be nonsense or is
125   // a no-op.
126   bool ShouldAdvance(SyncSetupWizard::State state);
127 
128   void ActivateState(SyncSetupWizard::State state);
129 
130   SyncSetupFlowContainer* container_;  // Our container.  Don't own this.
131   std::string dialog_start_args_;  // The args to pass to the initial page.
132 
133   SyncSetupWizard::State current_state_;
134   SyncSetupWizard::State end_state_;  // The goal.
135 
136   // Time that the GAIA_LOGIN step was received.
137   base::TimeTicks login_start_time_;
138 
139   // The handler needed for the entire flow. Weak reference.
140   SyncSetupFlowHandler* flow_handler_;
141 
142   // We need this to propagate back all user settings changes. Weak reference.
143   ProfileSyncService* service_;
144 
145   // Set to true if we've tried creating/setting an explicit passphrase, so we
146   // can appropriately reflect this in the UI.
147   bool tried_creating_explicit_passphrase_;
148   bool tried_setting_explicit_passphrase_;
149 
150   DISALLOW_COPY_AND_ASSIGN(SyncSetupFlow);
151 };
152 
153 // A really simple wrapper for a SyncSetupFlow so that we don't have to
154 // add any public methods to the public SyncSetupWizard interface to notify it
155 // when the dialog closes.
156 class SyncSetupFlowContainer {
157  public:
SyncSetupFlowContainer()158   SyncSetupFlowContainer() : flow_(NULL) { }
set_flow(SyncSetupFlow * flow)159   void set_flow(SyncSetupFlow* flow) {
160     DCHECK(!flow_ || !flow);
161     flow_ = flow;
162   }
163 
get_flow()164   SyncSetupFlow* get_flow() { return flow_; }
165  private:
166   SyncSetupFlow* flow_;
167 
168   DISALLOW_COPY_AND_ASSIGN(SyncSetupFlowContainer);
169 };
170 
171 #endif  // CHROME_BROWSER_SYNC_SYNC_SETUP_FLOW_H_
172