// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_SYNC_SYNC_SETUP_FLOW_H_ #define CHROME_BROWSER_SYNC_SYNC_SETUP_FLOW_H_ #pragma once #include <string> #include <vector> #include "base/gtest_prod_util.h" #include "base/time.h" #include "chrome/browser/sync/profile_sync_service.h" #include "chrome/browser/sync/sync_setup_wizard.h" #include "chrome/browser/sync/syncable/model_type.h" #include "chrome/browser/ui/webui/html_dialog_ui.h" #include "ui/base/l10n/l10n_util.h" #include "ui/gfx/native_widget_types.h" class SyncSetupFlowHandler; class SyncSetupFlowContainer; // A structure which contains all the configuration information for sync. // This can be stored or passed around when the configuration is managed // by multiple stages of the wizard. struct SyncConfiguration { SyncConfiguration(); ~SyncConfiguration(); bool sync_everything; syncable::ModelTypeSet data_types; bool use_secondary_passphrase; std::string secondary_passphrase; }; // The state machine used by SyncSetupWizard, exposed in its own header // to facilitate testing of SyncSetupWizard. This class is used to open and // run the sync setup overlay in tabbed options and deletes itself when the // overlay closes. class SyncSetupFlow { public: virtual ~SyncSetupFlow(); // Runs a flow from |start| to |end|, and does the work of actually showing // the HTML dialog. |container| is kept up-to-date with the lifetime of the // flow (e.g it is emptied on dialog close). static SyncSetupFlow* Run(ProfileSyncService* service, SyncSetupFlowContainer* container, SyncSetupWizard::State start, SyncSetupWizard::State end); // Fills |args| with "user" and "error" arguments by querying |service|. static void GetArgsForGaiaLogin( const ProfileSyncService* service, DictionaryValue* args); // Fills |args| for the configure screen (Choose Data Types/Encryption) static void GetArgsForConfigure( ProfileSyncService* service, DictionaryValue* args); // Fills |args| for the enter passphrase screen. static void GetArgsForEnterPassphrase( bool tried_creating_explicit_passphrase, bool tried_setting_explicit_passphrase, DictionaryValue* args); void AttachSyncSetupHandler(SyncSetupFlowHandler* handler); // Triggers a state machine transition to advance_state. void Advance(SyncSetupWizard::State advance_state); // Focuses the dialog. This is useful in cases where the dialog has been // obscured by a browser window. void Focus(); void OnUserSubmittedAuth(const std::string& username, const std::string& password, const std::string& captcha, const std::string& access_code); void OnUserConfigured(const SyncConfiguration& configuration); // The 'passphrase' screen is used when the user is prompted to enter // an existing passphrase. void OnPassphraseEntry(const std::string& passphrase); // The user canceled the passphrase entry without supplying a passphrase. void OnPassphraseCancel(); // The 'first passphrase' screen is for users migrating from a build // without passwords, who are prompted to make a passphrase choice. // TODO(jhawkins): This is no longer used; remove this method. void OnFirstPassphraseEntry(const std::string& option, const std::string& passphrase); void OnGoToDashboard(); void OnDialogClosed(const std::string& json_retval); private: FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, InitialStepLogin); FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, ChooseDataTypesSetsPrefs); FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, DialogCancelled); FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, InvalidTransitions); FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, FullSuccessfulRunSetsPref); FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, AbortedByPendingClear); FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, DiscreteRunGaiaLogin); FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, DiscreteRunChooseDataTypes); FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, DiscreteRunChooseDataTypesAbortedByPendingClear); FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, EnterPassphraseRequired); FRIEND_TEST_ALL_PREFIXES(SyncSetupWizardTest, PassphraseMigration); // Use static Run method to get an instance. SyncSetupFlow(SyncSetupWizard::State start_state, SyncSetupWizard::State end_state, const std::string& args, SyncSetupFlowContainer* container, ProfileSyncService* service); // Returns true if |this| should transition its state machine to |state| // based on |current_state_|, or false if that would be nonsense or is // a no-op. bool ShouldAdvance(SyncSetupWizard::State state); void ActivateState(SyncSetupWizard::State state); SyncSetupFlowContainer* container_; // Our container. Don't own this. std::string dialog_start_args_; // The args to pass to the initial page. SyncSetupWizard::State current_state_; SyncSetupWizard::State end_state_; // The goal. // Time that the GAIA_LOGIN step was received. base::TimeTicks login_start_time_; // The handler needed for the entire flow. Weak reference. SyncSetupFlowHandler* flow_handler_; // We need this to propagate back all user settings changes. Weak reference. ProfileSyncService* service_; // Set to true if we've tried creating/setting an explicit passphrase, so we // can appropriately reflect this in the UI. bool tried_creating_explicit_passphrase_; bool tried_setting_explicit_passphrase_; DISALLOW_COPY_AND_ASSIGN(SyncSetupFlow); }; // A really simple wrapper for a SyncSetupFlow so that we don't have to // add any public methods to the public SyncSetupWizard interface to notify it // when the dialog closes. class SyncSetupFlowContainer { public: SyncSetupFlowContainer() : flow_(NULL) { } void set_flow(SyncSetupFlow* flow) { DCHECK(!flow_ || !flow); flow_ = flow; } SyncSetupFlow* get_flow() { return flow_; } private: SyncSetupFlow* flow_; DISALLOW_COPY_AND_ASSIGN(SyncSetupFlowContainer); }; #endif // CHROME_BROWSER_SYNC_SYNC_SETUP_FLOW_H_