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