setup_flow.h revision 3f50c38dc070f4bb515c1b64450dae14f316474e
13f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
23f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Use of this source code is governed by a BSD-style license that can be
33f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// found in the LICENSE file.
43f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
53f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#ifndef CHROME_BROWSER_REMOTING_SETUP_FLOW_H_
63f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#define CHROME_BROWSER_REMOTING_SETUP_FLOW_H_
73f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
83f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/callback.h"
93f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "base/scoped_ptr.h"
103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "chrome/browser/dom_ui/html_dialog_ui.h"
113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#include "chrome/common/remoting/chromoting_host_info.h"
123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass ListValue;
143f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass ServiceProcessControl;
153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsennamespace remoting {
173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass SetupFlow;
193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
203f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// SetupFlowStep represents a single step for SetupFlow, e.g. login or
213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// host registration. When a step is finished, GetNextStep() is called
223f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// to get the step that must follow.
233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass SetupFlowStep {
243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen public:
253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  typedef Callback0::Type DoneCallback;
263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SetupFlowStep();
283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual ~SetupFlowStep();
293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
303f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Start the step. Ownership of |done_callback| is given to the
313f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // function. |done_callback| is called when the step is finished,
323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // The callback must be called on the same thread as Start().
333f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void Start(SetupFlow* flow, DoneCallback* done_callback) = 0;
343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
353f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Called to handle |message| received from UI. |args| may be set to
363f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // NULL.
373f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void HandleMessage(const std::string& message, const Value* arg) = 0;
383f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Called if user closes the dialog.
403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void Cancel() = 0;
413f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
423f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Returns SetupFlowStep object that corresponds to the next
433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // step. Must never return NULL.
443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual SetupFlowStep* GetNextStep() = 0;
453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
463f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen private:
473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  DISALLOW_COPY_AND_ASSIGN(SetupFlowStep);
483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen};
493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// SetupFlowStepBase implements base functions common for all
513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// SetupFlowStep implementations.
523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass SetupFlowStepBase : public SetupFlowStep {
533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen public:
543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SetupFlowStepBase();
553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ~SetupFlowStepBase();
563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // SetupFlowStep implementation.
583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void Start(SetupFlow* flow, DoneCallback* done_callback);
593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual SetupFlowStep* GetNextStep();
603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen protected:
623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SetupFlow* flow() { return flow_; }
633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  void ExecuteJavascriptInIFrame(const std::wstring& iframe_xpath,
653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                 const std::wstring& js);
663f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
673f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Finish current step. Calls |done_callback| specified in Start().
683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // GetNextStep() will return the specified |next_step|.
693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  void FinishStep(SetupFlowStep* next_step);
703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Called from Start(). Child classes must override this method
723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // instead of Start().
733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void DoStart() = 0;
743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
753f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen private:
763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SetupFlow* flow_;
773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  scoped_ptr<DoneCallback> done_callback_;
783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  bool done_;
793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Next step stored between Done() and GetNextStep();
813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SetupFlowStep* next_step_;
823f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
833f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  DISALLOW_COPY_AND_ASSIGN(SetupFlowStepBase);
843f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen};
853f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Base class for error steps. It shows the error message returned by
873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// GetErrorMessage() and Retry button.
883f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass SetupFlowErrorStepBase : public SetupFlowStepBase {
893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen public:
903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SetupFlowErrorStepBase();
913f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual ~SetupFlowErrorStepBase();
923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
933f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // SetupFlowStep implementation.
943f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void HandleMessage(const std::string& message, const Value* arg);
953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void Cancel();
963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen protected:
983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void DoStart();
993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Returns error message that is shown to the user.
1013f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual string16 GetErrorMessage() = 0;
1023f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Called when user clicks Retry button. Normally this methoud just
1043f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // calls FinishStep() with an appropriate next step.
1053f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void Retry() = 0;
1063f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1073f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen private:
1083f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  DISALLOW_COPY_AND_ASSIGN(SetupFlowErrorStepBase);
1093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen};
1103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// The last step in the setup flow. This step never finishes, user is
1123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// expected to close dialog after that.
1133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass SetupFlowDoneStep : public SetupFlowStepBase {
1143f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen public:
1153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SetupFlowDoneStep();
1163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  explicit SetupFlowDoneStep(const string16& message);
1173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual ~SetupFlowDoneStep();
1183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // SetupFlowStep implementation.
1203f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void HandleMessage(const std::string& message, const Value* arg);
1213f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void Cancel();
1223f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1233f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen protected:
1243f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  void DoStart();
1253f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1263f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen private:
1273f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  string16 message_;
1283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  DISALLOW_COPY_AND_ASSIGN(SetupFlowDoneStep);
1303f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen};
1313f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1323f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// SetupFlowContext stores data that needs to be passed between
1333f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// different setup flow steps.
1343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenstruct SetupFlowContext {
1353f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SetupFlowContext();
1363f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ~SetupFlowContext();
1373f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1383f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  std::string login;
1393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  std::string remoting_token;
1403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  std::string talk_token;
1413f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1423f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  ChromotingHostInfo host_info;
1433f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen};
1443f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1453f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// This class is responsible for showing a remoting setup dialog and
1463f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// perform operations to fill the content of the dialog and handle
1473f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// user actions in the dialog.
1483f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen//
1493f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Each page in the setup flow may send message to the current
1503f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// step. In order to do that it must use send a RemotingSetup message
1513f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// and specify message name as the first value in the argument
1523f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// list. For example the following code sends Retry message to the
1533f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// current step:
1543f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen//
1553f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen//     chrome.send("RemotingSetup", ["Retry"])
1563f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen//
1573f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// Assitional message parameters may be provided via send value in the
1583f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// arguments list, e.g.:
1593f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen//
1603f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen//     chrome.send("RemotingSetup", ["SubmitAuth", auth_data])
1613f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen//
1623f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// In this case auth_data would be passed in
1633f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen// SetupFlowStep::HandleMessage().
1643f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsenclass SetupFlow : public DOMMessageHandler,
1653f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                  public HtmlDialogUIDelegate {
1663f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen public:
1673f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual ~SetupFlow();
1683f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1693f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  static SetupFlow* OpenSetupDialog(Profile* profile);
1703f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1713f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  DOMUI* dom_ui() { return dom_ui_; }
1723f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  Profile* profile() { return profile_; }
1733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SetupFlowContext* context() { return &context_; }
1743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1753f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen private:
1763f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  explicit SetupFlow(const std::string& args, Profile* profile,
1773f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                     SetupFlowStep* first_step);
1783f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1793f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // HtmlDialogUIDelegate implementation.
1803f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual GURL GetDialogContentURL() const;
1813f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void GetDOMMessageHandlers(
1823f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen      std::vector<DOMMessageHandler*>* handlers) const;
1833f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void GetDialogSize(gfx::Size* size) const;
1843f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual std::string GetDialogArgs() const;
1853f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void OnDialogClosed(const std::string& json_retval);
1863f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void OnCloseContents(TabContents* source, bool* out_close_dialog);
1873f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual std::wstring GetDialogTitle() const;
1883f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual bool IsDialogModal() const;
1893f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual bool ShouldShowDialogTitle() const;
1903f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1913f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // DOMMessageHandler implementation.
1923f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual DOMMessageHandler* Attach(DOMUI* dom_ui);
1933f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  virtual void RegisterMessages();
1943f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1953f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Message handlers for the messages we receive from UI.
1963f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  void HandleSubmitAuth(const ListValue* args);
1973f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  void HandleUIMessage(const ListValue* args);
1983f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
1993f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  void StartCurrentStep();
2003f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  void OnStepDone();
2013f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2023f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Pointer to the DOM UI. This is provided by RemotingSetupMessageHandler
2033f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // when attached.
2043f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  DOMUI* dom_ui_;
2053f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2063f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // The args to pass to the initial page.
2073f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  std::string dialog_start_args_;
2083f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  Profile* profile_;
2093f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2103f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  SetupFlowContext context_;
2113f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2123f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  scoped_ptr<SetupFlowStep> current_step_;
2133f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2143f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  DISALLOW_COPY_AND_ASSIGN(SetupFlow);
2153f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen};
2163f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2173f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen}  // namespace remoting
2183f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
2193f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen#endif  // CHROME_BROWSER_REMOTING_SETUP_FLOW_H_
220