1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef CHROME_BROWSER_REMOTING_SETUP_FLOW_H_ 6 #define CHROME_BROWSER_REMOTING_SETUP_FLOW_H_ 7 8 #include "base/callback.h" 9 #include "base/memory/scoped_ptr.h" 10 #include "chrome/browser/ui/webui/html_dialog_ui.h" 11 #include "chrome/common/remoting/chromoting_host_info.h" 12 #include "content/browser/webui/web_ui.h" 13 14 class ListValue; 15 class ServiceProcessControl; 16 17 namespace remoting { 18 19 class SetupFlow; 20 21 // SetupFlowStep represents a single step for SetupFlow, e.g. login or 22 // host registration. When a step is finished, GetNextStep() is called 23 // to get the step that must follow. 24 class SetupFlowStep { 25 public: 26 typedef Callback0::Type DoneCallback; 27 28 SetupFlowStep(); 29 virtual ~SetupFlowStep(); 30 31 // Start the step. Ownership of |done_callback| is given to the 32 // function. |done_callback| is called when the step is finished, 33 // The callback must be called on the same thread as Start(). 34 virtual void Start(SetupFlow* flow, DoneCallback* done_callback) = 0; 35 36 // Called to handle |message| received from UI. |args| may be set to 37 // NULL. 38 virtual void HandleMessage(const std::string& message, const Value* arg) = 0; 39 40 // Called if user closes the dialog. 41 virtual void Cancel() = 0; 42 43 // Returns SetupFlowStep object that corresponds to the next 44 // step. Must never return NULL. 45 virtual SetupFlowStep* GetNextStep() = 0; 46 47 private: 48 DISALLOW_COPY_AND_ASSIGN(SetupFlowStep); 49 }; 50 51 // SetupFlowStepBase implements base functions common for all 52 // SetupFlowStep implementations. 53 class SetupFlowStepBase : public SetupFlowStep { 54 public: 55 SetupFlowStepBase(); 56 ~SetupFlowStepBase(); 57 58 // SetupFlowStep implementation. 59 virtual void Start(SetupFlow* flow, DoneCallback* done_callback); 60 virtual SetupFlowStep* GetNextStep(); 61 62 protected: 63 SetupFlow* flow() { return flow_; } 64 65 void ExecuteJavascriptInIFrame(const std::wstring& iframe_xpath, 66 const std::wstring& js); 67 68 // Finish current step. Calls |done_callback| specified in Start(). 69 // GetNextStep() will return the specified |next_step|. 70 void FinishStep(SetupFlowStep* next_step); 71 72 // Called from Start(). Child classes must override this method 73 // instead of Start(). 74 virtual void DoStart() = 0; 75 76 private: 77 SetupFlow* flow_; 78 scoped_ptr<DoneCallback> done_callback_; 79 bool done_; 80 81 // Next step stored between Done() and GetNextStep(); 82 SetupFlowStep* next_step_; 83 84 DISALLOW_COPY_AND_ASSIGN(SetupFlowStepBase); 85 }; 86 87 // Base class for error steps. It shows the error message returned by 88 // GetErrorMessage() and Retry button. 89 class SetupFlowErrorStepBase : public SetupFlowStepBase { 90 public: 91 SetupFlowErrorStepBase(); 92 virtual ~SetupFlowErrorStepBase(); 93 94 // SetupFlowStep implementation. 95 virtual void HandleMessage(const std::string& message, const Value* arg); 96 virtual void Cancel(); 97 98 protected: 99 virtual void DoStart(); 100 101 // Returns error message that is shown to the user. 102 virtual string16 GetErrorMessage() = 0; 103 104 // Called when user clicks Retry button. Normally this methoud just 105 // calls FinishStep() with an appropriate next step. 106 virtual void Retry() = 0; 107 108 private: 109 DISALLOW_COPY_AND_ASSIGN(SetupFlowErrorStepBase); 110 }; 111 112 // The last step in the setup flow. This step never finishes, user is 113 // expected to close dialog after that. 114 class SetupFlowDoneStep : public SetupFlowStepBase { 115 public: 116 SetupFlowDoneStep(); 117 explicit SetupFlowDoneStep(const string16& message); 118 virtual ~SetupFlowDoneStep(); 119 120 // SetupFlowStep implementation. 121 virtual void HandleMessage(const std::string& message, const Value* arg); 122 virtual void Cancel(); 123 124 protected: 125 virtual void DoStart(); 126 127 private: 128 string16 message_; 129 130 DISALLOW_COPY_AND_ASSIGN(SetupFlowDoneStep); 131 }; 132 133 // SetupFlowContext stores data that needs to be passed between 134 // different setup flow steps. 135 struct SetupFlowContext { 136 SetupFlowContext(); 137 ~SetupFlowContext(); 138 139 std::string login; 140 std::string remoting_token; 141 std::string talk_token; 142 143 ChromotingHostInfo host_info; 144 }; 145 146 // This class is responsible for showing a remoting setup dialog and 147 // perform operations to fill the content of the dialog and handle 148 // user actions in the dialog. 149 // 150 // Each page in the setup flow may send message to the current 151 // step. In order to do that it must use send a RemotingSetup message 152 // and specify message name as the first value in the argument 153 // list. For example the following code sends Retry message to the 154 // current step: 155 // 156 // chrome.send("RemotingSetup", ["Retry"]) 157 // 158 // Assitional message parameters may be provided via send value in the 159 // arguments list, e.g.: 160 // 161 // chrome.send("RemotingSetup", ["SubmitAuth", auth_data]) 162 // 163 // In this case auth_data would be passed in 164 // SetupFlowStep::HandleMessage(). 165 class SetupFlow : public WebUIMessageHandler, 166 public HtmlDialogUIDelegate { 167 public: 168 virtual ~SetupFlow(); 169 170 static SetupFlow* OpenSetupDialog(Profile* profile); 171 172 WebUI* web_ui() { return web_ui_; } 173 Profile* profile() { return profile_; } 174 SetupFlowContext* context() { return &context_; } 175 176 private: 177 explicit SetupFlow(const std::string& args, Profile* profile, 178 SetupFlowStep* first_step); 179 180 // HtmlDialogUIDelegate implementation. 181 virtual GURL GetDialogContentURL() const; 182 virtual void GetWebUIMessageHandlers( 183 std::vector<WebUIMessageHandler*>* handlers) const; 184 virtual void GetDialogSize(gfx::Size* size) const; 185 virtual std::string GetDialogArgs() const; 186 virtual void OnDialogClosed(const std::string& json_retval); 187 virtual void OnCloseContents(TabContents* source, bool* out_close_dialog); 188 virtual std::wstring GetDialogTitle() const; 189 virtual bool IsDialogModal() const; 190 virtual bool ShouldShowDialogTitle() const; 191 192 // WebUIMessageHandler implementation. 193 virtual WebUIMessageHandler* Attach(WebUI* web_ui); 194 virtual void RegisterMessages(); 195 196 // Message handlers for the messages we receive from UI. 197 void HandleSubmitAuth(const ListValue* args); 198 void HandleUIMessage(const ListValue* args); 199 200 void StartCurrentStep(); 201 void OnStepDone(); 202 203 // Pointer to the Web UI. This is provided by RemotingSetupMessageHandler 204 // when attached. 205 WebUI* web_ui_; 206 207 // The args to pass to the initial page. 208 std::string dialog_start_args_; 209 Profile* profile_; 210 211 SetupFlowContext context_; 212 213 scoped_ptr<SetupFlowStep> current_step_; 214 215 DISALLOW_COPY_AND_ASSIGN(SetupFlow); 216 }; 217 218 } // namespace remoting 219 220 #endif // CHROME_BROWSER_REMOTING_SETUP_FLOW_H_ 221