1 // Copyright (c) 2012 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_UI_WEBUI_PRINT_PREVIEW_PRINT_PREVIEW_HANDLER_H_ 6 #define CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_PRINT_PREVIEW_HANDLER_H_ 7 8 #include <string> 9 10 #include "base/files/file_path.h" 11 #include "base/memory/ref_counted.h" 12 #include "base/memory/scoped_ptr.h" 13 #include "base/memory/weak_ptr.h" 14 #include "chrome/browser/printing/print_view_manager_observer.h" 15 #include "content/public/browser/web_ui_message_handler.h" 16 #include "ui/shell_dialogs/select_file_dialog.h" 17 18 #if defined(ENABLE_SERVICE_DISCOVERY) 19 #include "chrome/browser/local_discovery/privet_local_printer_lister.h" 20 #include "chrome/browser/local_discovery/service_discovery_shared_client.h" 21 #endif // ENABLE_SERVICE_DISCOVERY 22 23 class PrintSystemTaskProxy; 24 25 namespace base { 26 class DictionaryValue; 27 class RefCountedBytes; 28 } 29 30 namespace content { 31 class WebContents; 32 } 33 34 namespace gfx { 35 class Size; 36 } 37 38 // The handler for Javascript messages related to the print preview dialog. 39 class PrintPreviewHandler 40 : public content::WebUIMessageHandler, 41 #if defined(ENABLE_SERVICE_DISCOVERY) 42 public local_discovery::PrivetLocalPrinterLister::Delegate, 43 public local_discovery::PrivetLocalPrintOperation::Delegate, 44 #endif 45 public ui::SelectFileDialog::Listener, 46 public printing::PrintViewManagerObserver { 47 public: 48 PrintPreviewHandler(); 49 virtual ~PrintPreviewHandler(); 50 51 // WebUIMessageHandler implementation. 52 virtual void RegisterMessages() OVERRIDE; 53 54 // SelectFileDialog::Listener implementation. 55 virtual void FileSelected(const base::FilePath& path, 56 int index, 57 void* params) OVERRIDE; 58 virtual void FileSelectionCanceled(void* params) OVERRIDE; 59 60 // PrintViewManagerObserver implementation. 61 virtual void OnPrintDialogShown() OVERRIDE; 62 63 // Displays a modal dialog, prompting the user to select a file. 64 void SelectFile(const base::FilePath& default_path); 65 66 // Called when the print preview dialog is destroyed. This is the last time 67 // this object has access to the PrintViewManager in order to disconnect the 68 // observer. 69 void OnPrintPreviewDialogDestroyed(); 70 71 // Called when print preview failed. 72 void OnPrintPreviewFailed(); 73 74 // Called when the user press ctrl+shift+p to display the native system 75 // dialog. 76 void ShowSystemDialog(); 77 78 #if defined(ENABLE_SERVICE_DISCOVERY) 79 // PrivetLocalPrinterLister::Delegate implementation. 80 virtual void LocalPrinterChanged( 81 bool added, 82 const std::string& name, 83 bool has_local_printing, 84 const local_discovery::DeviceDescription& description) OVERRIDE; 85 virtual void LocalPrinterRemoved(const std::string& name) OVERRIDE; 86 virtual void LocalPrinterCacheFlushed() OVERRIDE; 87 88 // PrivetLocalPrintOperation::Delegate implementation. 89 virtual void OnPrivetPrintingDone( 90 const local_discovery::PrivetLocalPrintOperation* 91 print_operation) OVERRIDE; 92 virtual void OnPrivetPrintingError( 93 const local_discovery::PrivetLocalPrintOperation* print_operation, 94 int http_code) OVERRIDE; 95 #endif // ENABLE_SERVICE_DISCOVERY regenerate_preview_request_count()96 int regenerate_preview_request_count() const { 97 return regenerate_preview_request_count_; 98 } 99 100 private: 101 class AccessTokenService; 102 103 static bool PrivetPrintingEnabled(); 104 105 content::WebContents* preview_web_contents() const; 106 107 // Gets the list of printers. |args| is unused. 108 void HandleGetPrinters(const base::ListValue* args); 109 110 // Starts getting all local privet printers. |arg| is unused. 111 void HandleGetPrivetPrinters(const base::ListValue* args); 112 113 // Stops getting all local privet printers. |arg| is unused. 114 void HandleStopGetPrivetPrinters(const base::ListValue* args); 115 116 // Asks the initiator renderer to generate a preview. First element of |args| 117 // is a job settings JSON string. 118 void HandleGetPreview(const base::ListValue* args); 119 120 // Gets the job settings from Web UI and initiate printing. First element of 121 // |args| is a job settings JSON string. 122 void HandlePrint(const base::ListValue* args); 123 124 // Handles the request to hide the preview dialog for printing. 125 // |args| is unused. 126 void HandleHidePreview(const base::ListValue* args); 127 128 // Handles the request to cancel the pending print request. |args| is unused. 129 void HandleCancelPendingPrintRequest(const base::ListValue* args); 130 131 // Handles a request to store data that the web ui wishes to persist. 132 // First element of |args| is the data to persist. 133 void HandleSaveAppState(const base::ListValue* args); 134 135 // Gets the printer capabilities. First element of |args| is the printer name. 136 void HandleGetPrinterCapabilities(const base::ListValue* args); 137 138 // Asks the initiator renderer to show the native print system dialog. |args| 139 // is unused. 140 void HandleShowSystemDialog(const base::ListValue* args); 141 142 // Callback for the signin dialog to call once signin is complete. 143 void OnSigninComplete(); 144 145 // Brings up a dialog to allow the user to sign into cloud print. 146 // |args| is unused. 147 void HandleSignin(const base::ListValue* args); 148 149 // Generates new token and sends back to UI. 150 void HandleGetAccessToken(const base::ListValue* args); 151 152 // Brings up a web page to allow the user to configure cloud print. 153 // |args| is unused. 154 void HandleManageCloudPrint(const base::ListValue* args); 155 156 // Gathers UMA stats when the print preview dialog is about to close. 157 // |args| is unused. 158 void HandleClosePreviewDialog(const base::ListValue* args); 159 160 // Asks the browser to show the native printer management dialog. 161 // |args| is unused. 162 void HandleManagePrinters(const base::ListValue* args); 163 164 // Asks the browser to show the cloud print dialog. |args| is signle int with 165 // page count. 166 void HandlePrintWithCloudPrintDialog(const base::ListValue* args); 167 168 // Asks the browser for several settings that are needed before the first 169 // preview is displayed. 170 void HandleGetInitialSettings(const base::ListValue* args); 171 172 // Reports histogram data for a print preview UI action. |args| should consist 173 // of two elements: the bucket name, and the bucket event. 174 void HandleReportUiEvent(const base::ListValue* args); 175 176 // Forces the opening of a new tab. |args| should consist of one element: the 177 // URL to set the new tab to. 178 // 179 // NOTE: This is needed to open FedEx confirmation window as a new tab. 180 // Javascript's "window.open" opens a new window popup (since initiated from 181 // async HTTP request) and worse yet, on Windows and Chrome OS, the opened 182 // window opens behind the initiator window. 183 void HandleForceOpenNewTab(const base::ListValue* args); 184 185 void HandleGetPrivetPrinterCapabilities(const base::ListValue* arg); 186 187 void SendInitialSettings(const std::string& default_printer); 188 189 // Send OAuth2 access token. 190 void SendAccessToken(const std::string& type, 191 const std::string& access_token); 192 193 // Sends the printer capabilities to the Web UI. |settings_info| contains 194 // printer capabilities information. 195 void SendPrinterCapabilities(const base::DictionaryValue* settings_info); 196 197 // Sends error notification to the Web UI when unable to return the printer 198 // capabilities. 199 void SendFailedToGetPrinterCapabilities(const std::string& printer_name); 200 201 // Send the list of printers to the Web UI. 202 void SetupPrinterList(const base::ListValue* printers); 203 204 // Send whether cloud print integration should be enabled. 205 void SendCloudPrintEnabled(); 206 207 // Send the PDF data to the cloud to print. 208 void SendCloudPrintJob(const base::RefCountedBytes* data); 209 210 // Handles printing to PDF. 211 void PrintToPdf(); 212 213 // Asks the browser to show the cloud print dialog. 214 void PrintWithCloudPrintDialog(); 215 216 // Gets the initiator for the print preview dialog. 217 content::WebContents* GetInitiator() const; 218 219 // Closes the preview dialog. 220 void ClosePreviewDialog(); 221 222 // Adds all the recorded stats taken so far to histogram counts. 223 void ReportStats(); 224 225 // Clears initiator details for the print preview dialog. 226 void ClearInitiatorDetails(); 227 228 // Posts a task to save |data| to pdf at |print_to_pdf_path_|. 229 void PostPrintToPdfTask(); 230 231 // Populates |settings| according to the current locale. 232 void GetNumberFormatAndMeasurementSystem(base::DictionaryValue* settings); 233 234 bool GetPreviewDataAndTitle(scoped_refptr<base::RefCountedBytes>* data, 235 base::string16* title) const; 236 237 #if defined(USE_CUPS) 238 void SaveCUPSColorSetting(const base::DictionaryValue* settings); 239 240 void ConvertColorSettingToCUPSColorModel( 241 base::DictionaryValue* settings) const; 242 #endif 243 244 #if defined(ENABLE_SERVICE_DISCOVERY) 245 void OnPrivetCapabilities(const base::DictionaryValue* capabilities); 246 void PrivetCapabilitiesUpdateClient( 247 scoped_ptr<local_discovery::PrivetHTTPClient> http_client); 248 void PrivetLocalPrintUpdateClient( 249 std::string print_ticket, 250 std::string capabilities, 251 gfx::Size page_size, 252 scoped_ptr<local_discovery::PrivetHTTPClient> http_client); 253 bool PrivetUpdateClient( 254 scoped_ptr<local_discovery::PrivetHTTPClient> http_client); 255 void StartPrivetLocalPrint(const std::string& print_ticket, 256 const std::string& capabilities, 257 const gfx::Size& page_size); 258 void SendPrivetCapabilitiesError(const std::string& id); 259 void PrintToPrivetPrinter(const std::string& printer_name, 260 const std::string& print_ticket, 261 const std::string& capabilities, 262 const gfx::Size& page_size); 263 bool CreatePrivetHTTP( 264 const std::string& name, 265 const local_discovery::PrivetHTTPAsynchronousFactory::ResultCallback& 266 callback); 267 void FillPrinterDescription( 268 const std::string& name, 269 const local_discovery::DeviceDescription& description, 270 bool has_local_printing, 271 base::DictionaryValue* printer_value); 272 #endif 273 274 // The underlying dialog object. 275 scoped_refptr<ui::SelectFileDialog> select_file_dialog_; 276 277 // A count of how many requests received to regenerate preview data. 278 // Initialized to 0 then incremented and emitted to a histogram. 279 int regenerate_preview_request_count_; 280 281 // A count of how many requests received to show manage printers dialog. 282 int manage_printers_dialog_request_count_; 283 int manage_cloud_printers_dialog_request_count_; 284 285 // Whether we have already logged a failed print preview. 286 bool reported_failed_preview_; 287 288 // Whether we have already logged the number of printers this session. 289 bool has_logged_printers_count_; 290 291 // Holds the path to the print to pdf request. It is empty if no such request 292 // exists. 293 base::FilePath print_to_pdf_path_; 294 295 // Holds token service to get OAuth2 access tokens. 296 scoped_ptr<AccessTokenService> token_service_; 297 298 #if defined(ENABLE_SERVICE_DISCOVERY) 299 scoped_refptr<local_discovery::ServiceDiscoverySharedClient> 300 service_discovery_client_; 301 scoped_ptr<local_discovery::PrivetLocalPrinterLister> printer_lister_; 302 303 scoped_ptr<local_discovery::PrivetHTTPAsynchronousFactory> 304 privet_http_factory_; 305 scoped_ptr<local_discovery::PrivetHTTPResolution> privet_http_resolution_; 306 scoped_ptr<local_discovery::PrivetV1HTTPClient> privet_http_client_; 307 scoped_ptr<local_discovery::PrivetJSONOperation> 308 privet_capabilities_operation_; 309 scoped_ptr<local_discovery::PrivetLocalPrintOperation> 310 privet_local_print_operation_; 311 #endif 312 313 base::WeakPtrFactory<PrintPreviewHandler> weak_factory_; 314 315 DISALLOW_COPY_AND_ASSIGN(PrintPreviewHandler); 316 }; 317 318 #endif // CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_PRINT_PREVIEW_HANDLER_H_ 319