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