// 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_