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