Home | History | Annotate | Download | only in print_preview
      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
     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