Home | History | Annotate | Download | only in printing
      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_PRINT_DIALOG_CLOUD_INTERNAL_H_
      6 #define CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_INTERNAL_H_
      7 #pragma once
      8 
      9 #include <string>
     10 #include <vector>
     11 
     12 #include "base/file_path.h"
     13 #include "base/memory/scoped_ptr.h"
     14 #include "base/synchronization/lock.h"
     15 #include "chrome/browser/ui/webui/html_dialog_ui.h"
     16 #include "content/browser/webui/web_ui.h"
     17 #include "content/common/notification_observer.h"
     18 #include "content/common/notification_registrar.h"
     19 
     20 class GURL;
     21 class StringValue;
     22 class CloudPrintHtmlDialogDelegateTest;
     23 
     24 namespace internal_cloud_print_helpers {
     25 
     26 // Small class to virtualize a few functions to aid with unit testing.
     27 class CloudPrintDataSenderHelper {
     28  public:
     29   explicit CloudPrintDataSenderHelper(WebUI* web_ui) : web_ui_(web_ui) {}
     30   virtual ~CloudPrintDataSenderHelper() {}
     31 
     32   // Virtualize the overrides of these three functions from WebUI to
     33   // facilitate unit testing.
     34   virtual void CallJavascriptFunction(const std::wstring& function_name);
     35   virtual void CallJavascriptFunction(const std::wstring& function_name,
     36                                       const Value& arg);
     37   virtual void CallJavascriptFunction(const std::wstring& function_name,
     38                                       const Value& arg1,
     39                                       const Value& arg2);
     40 
     41  private:
     42   WebUI* web_ui_;
     43 
     44   DISALLOW_COPY_AND_ASSIGN(CloudPrintDataSenderHelper);
     45 };
     46 
     47 // Small helper class to get the print data loaded in from the PDF
     48 // file (on the FILE thread) and send it to the print dialog contents
     49 // (on the IO thread), allowing for cancellation.
     50 class CloudPrintDataSender
     51     : public base::RefCountedThreadSafe<CloudPrintDataSender> {
     52  public:
     53   // The owner of this object is also expected to own and control the
     54   // lifetime of the helper.
     55   CloudPrintDataSender(CloudPrintDataSenderHelper* helper,
     56                        const string16& print_job_title,
     57                        const std::string& file_type);
     58 
     59   // Calls to read in the PDF file (on the FILE thread) then send that
     60   // information to the dialog renderer (on the IO thread).  We know
     61   // that the WebUI pointer lifetime will outlast us, so we should be
     62   // good.
     63   void ReadPrintDataFile(const FilePath& path_to_file);
     64   void SendPrintDataFile();
     65 
     66   // Cancels any ramining part of the task by clearing out the WebUI
     67   // helper_ ptr.
     68   void CancelPrintDataFile();
     69 
     70  private:
     71   friend class base::RefCountedThreadSafe<CloudPrintDataSender>;
     72   virtual ~CloudPrintDataSender();
     73 
     74   base::Lock lock_;
     75   CloudPrintDataSenderHelper* volatile helper_;
     76   scoped_ptr<StringValue> print_data_;
     77   string16 print_job_title_;
     78   std::string file_type_;
     79 
     80   DISALLOW_COPY_AND_ASSIGN(CloudPrintDataSender);
     81 };
     82 
     83 class CloudPrintHtmlDialogDelegate;
     84 
     85 // The CloudPrintFlowHandler connects the state machine (the UI delegate)
     86 // to the dialog backing HTML and JS by providing WebUIMessageHandler
     87 // functions for the JS to use.  This include refreshing the page
     88 // setup parameters (which will cause a re-generation of the PDF in
     89 // the renderer process - do we want a progress throbber shown?
     90 // Probably..), and packing up the PDF and job parameters and sending
     91 // them to the cloud.
     92 class CloudPrintFlowHandler : public WebUIMessageHandler,
     93                               public NotificationObserver {
     94  public:
     95   explicit CloudPrintFlowHandler(const FilePath& path_to_file,
     96                                  const string16& print_job_title,
     97                                  const std::string& file_type);
     98   virtual ~CloudPrintFlowHandler();
     99 
    100   // WebUIMessageHandler implementation.
    101   virtual void RegisterMessages();
    102 
    103   // NotificationObserver implementation.
    104   virtual void Observe(NotificationType type,
    105                        const NotificationSource& source,
    106                        const NotificationDetails& details);
    107 
    108   // Callbacks from the page.
    109   void HandleShowDebugger(const ListValue* args);
    110   void HandleSendPrintData(const ListValue* args);
    111   void HandleSetPageParameters(const ListValue* args);
    112 
    113   virtual void SetDialogDelegate(CloudPrintHtmlDialogDelegate *delegate);
    114   void StoreDialogClientSize() const;
    115 
    116  private:
    117   virtual scoped_refptr<CloudPrintDataSender> CreateCloudPrintDataSender();
    118 
    119   // Call to get the debugger loaded on our hosted dialog page
    120   // specifically.  Since we're not in an official browser tab, only
    121   // way to get the debugger going.
    122   void ShowDebugger();
    123 
    124   void CancelAnyRunningTask();
    125 
    126   CloudPrintHtmlDialogDelegate* dialog_delegate_;
    127   NotificationRegistrar registrar_;
    128   FilePath path_to_file_;
    129   string16 print_job_title_;
    130   std::string file_type_;
    131   scoped_refptr<CloudPrintDataSender> print_data_sender_;
    132   scoped_ptr<CloudPrintDataSenderHelper> print_data_helper_;
    133 
    134   DISALLOW_COPY_AND_ASSIGN(CloudPrintFlowHandler);
    135 };
    136 
    137 // State machine used to run the printing dialog.  This class is used
    138 // to open and run the html dialog and deletes itself when the dialog
    139 // is closed.
    140 class CloudPrintHtmlDialogDelegate : public HtmlDialogUIDelegate {
    141  public:
    142   CloudPrintHtmlDialogDelegate(const FilePath& path_to_file,
    143                                int width, int height,
    144                                const std::string& json_arguments,
    145                                const string16& print_job_title,
    146                                const std::string& file_type,
    147                                bool modal);
    148   virtual ~CloudPrintHtmlDialogDelegate();
    149 
    150   // HTMLDialogUIDelegate implementation:
    151   virtual bool IsDialogModal() const;
    152   virtual std::wstring GetDialogTitle() const;
    153   virtual GURL GetDialogContentURL() const;
    154   virtual void GetWebUIMessageHandlers(
    155       std::vector<WebUIMessageHandler*>* handlers) const;
    156   virtual void GetDialogSize(gfx::Size* size) const;
    157   virtual std::string GetDialogArgs() const;
    158   virtual void OnDialogClosed(const std::string& json_retval);
    159   virtual void OnCloseContents(TabContents* source, bool* out_close_dialog);
    160   virtual bool ShouldShowDialogTitle() const;
    161   virtual bool HandleContextMenu(const ContextMenuParams& params);
    162 
    163  private:
    164   friend class ::CloudPrintHtmlDialogDelegateTest;
    165 
    166   // For unit testing.
    167   CloudPrintHtmlDialogDelegate(CloudPrintFlowHandler* flow_handler,
    168                                int width, int height,
    169                                const std::string& json_arguments,
    170                                bool modal);
    171   void Init(int width, int height, const std::string& json_arguments);
    172 
    173   CloudPrintFlowHandler* flow_handler_;
    174   bool modal_;
    175   mutable bool owns_flow_handler_;
    176 
    177   // The parameters needed to display a modal HTML dialog.
    178   HtmlDialogUI::HtmlDialogParams params_;
    179 
    180   DISALLOW_COPY_AND_ASSIGN(CloudPrintHtmlDialogDelegate);
    181 };
    182 
    183 void CreateDialogImpl(const FilePath& path_to_file,
    184                       const string16& print_job_title,
    185                       const std::string& file_type,
    186                       bool modal);
    187 
    188 }  // namespace internal_cloud_print_helpers
    189 
    190 #endif  // CHROME_BROWSER_PRINTING_PRINT_DIALOG_CLOUD_INTERNAL_H_
    191