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_PRINTING_CLOUD_PRINT_CLOUD_PRINT_SETUP_FLOW_H_ 6 #define CHROME_BROWSER_PRINTING_CLOUD_PRINT_CLOUD_PRINT_SETUP_FLOW_H_ 7 8 #include <string> 9 #include <vector> 10 11 #include "base/memory/weak_ptr.h" 12 #include "base/time.h" 13 #include "chrome/browser/ui/webui/html_dialog_ui.h" 14 #include "chrome/common/net/gaia/gaia_auth_consumer.h" 15 #include "chrome/common/net/gaia/gaia_auth_fetcher.h" 16 #include "chrome/common/net/gaia/google_service_auth_error.h" 17 #include "grit/generated_resources.h" 18 #include "ui/base/l10n/l10n_util.h" 19 #include "ui/gfx/native_widget_types.h" 20 21 class GaiaAuthFetcher; 22 class CloudPrintServiceProcessHelper; 23 class CloudPrintSetupMessageHandler; 24 class ServiceProcessControl; 25 class GoogleServiceAuthError; 26 class Browser; 27 28 // This class is responsible for showing a cloud print setup dialog 29 // and perform operations to fill the content of the dialog and handle 30 // user actions in the dialog. 31 // 32 // It is responsible for: 33 // 1. Showing the setup dialog. 34 // 2. Providing the URL for the content of the dialog. 35 // 3. Providing a data source to provide the content HTML files. 36 // 4. Providing a message handler to handle user actions in the Web UI. 37 // 5. Responding to actions received in the message handler. 38 // 39 // The architecture for WebUI is designed such that only the message handler 40 // can access the WebUI. This splits the flow control across the message 41 // handler and this class. In order to centralize all the flow control and 42 // content in the WebUI, the WebUI object is given to this object by the 43 // message handler through the Attach(WebUI*) method. 44 class CloudPrintSetupFlow : public HtmlDialogUIDelegate, 45 public GaiaAuthConsumer { 46 public: 47 class Delegate { 48 public: 49 virtual ~Delegate() {} 50 // Called when the setup dialog is closed. 51 virtual void OnDialogClosed() = 0; 52 }; 53 virtual ~CloudPrintSetupFlow(); 54 55 // Runs a flow from |start| to |end|, and does the work of actually showing 56 // the HTML dialog. |container| is kept up-to-date with the lifetime of the 57 // flow (e.g it is emptied on dialog close). 58 static CloudPrintSetupFlow* OpenDialog( 59 Profile* service, 60 const base::WeakPtr<Delegate>& delegate, 61 gfx::NativeWindow parent_window); 62 63 // Focuses the dialog. This is useful in cases where the dialog has been 64 // obscured by a browser window. 65 void Focus(); 66 67 // HtmlDialogUIDelegate implementation. 68 virtual GURL GetDialogContentURL() const; 69 virtual void GetWebUIMessageHandlers( 70 std::vector<WebUIMessageHandler*>* handlers) const; 71 virtual void GetDialogSize(gfx::Size* size) const; 72 virtual std::string GetDialogArgs() const; 73 virtual void OnDialogClosed(const std::string& json_retval); 74 virtual void OnCloseContents(TabContents* source, bool* out_close_dialog); 75 virtual std::wstring GetDialogTitle() const; 76 virtual bool IsDialogModal() const; 77 virtual bool ShouldShowDialogTitle() const; 78 79 // GaiaAuthConsumer implementation. 80 virtual void OnClientLoginSuccess( 81 const GaiaAuthConsumer::ClientLoginResult& credentials); 82 virtual void OnClientLoginFailure( 83 const GoogleServiceAuthError& error); 84 85 private: 86 friend class CloudPrintServiceProcessHelper; 87 friend class CloudPrintSetupMessageHandler; 88 89 // Use static Run method to get an instance. 90 CloudPrintSetupFlow(const std::string& args, Profile* profile, 91 const base::WeakPtr<Delegate>& delegate, bool setup_done); 92 93 // Called CloudPrintSetupMessageHandler when a DOM is attached. This method 94 // is called when the HTML page is fully loaded. We then operate on this 95 // WebUI object directly. 96 void Attach(WebUI* web_ui); 97 98 // Called by CloudPrintSetupMessageHandler when user authentication is 99 // registered. 100 void OnUserSubmittedAuth(const std::string& user, 101 const std::string& password, 102 const std::string& captcha, 103 const std::string& access_code); 104 105 // Called by CloudPrintSetupMessageHandler when the user clicks on various 106 // pieces of UI during setup. 107 void OnUserClickedLearnMore(); 108 void OnUserClickedPrintTestPage(); 109 110 // The following methods control which iframe is visible. 111 void ShowGaiaLogin(const DictionaryValue& args); 112 void ShowGaiaSuccessAndSettingUp(); 113 void ShowGaiaFailed(const GoogleServiceAuthError& error); 114 void ShowSetupDone(); 115 void ExecuteJavascriptInIFrame(const string16& iframe_xpath, 116 const string16& js); 117 118 // Pointer to the Web UI. This is provided by CloudPrintSetupMessageHandler 119 // when attached. We do not own the pointer, instead WebUI owns it's delegate 120 // (us) and controls our lifetime. 121 WebUI* web_ui_; 122 123 // The args to pass to the initial page. 124 std::string dialog_start_args_; 125 Profile* profile_; 126 127 // Fetcher to obtain the Cloud Print token. 128 scoped_ptr<GaiaAuthFetcher> authenticator_; 129 std::string login_; 130 std::string lsid_; 131 132 // The last captcha or error state encountered. 133 GoogleServiceAuthError last_auth_error_; 134 135 // Are we in the done state? 136 bool setup_done_; 137 138 // Handle to the ServiceProcessControl which talks to the service process. 139 ServiceProcessControl* process_control_; 140 base::WeakPtr<Delegate> delegate_; 141 142 DISALLOW_COPY_AND_ASSIGN(CloudPrintSetupFlow); 143 }; 144 145 #endif // CHROME_BROWSER_PRINTING_CLOUD_PRINT_CLOUD_PRINT_SETUP_FLOW_H_ 146