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_UI_H_ 6 #define CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_PRINT_PREVIEW_UI_H_ 7 8 #include <string> 9 10 #include "base/callback_forward.h" 11 #include "base/gtest_prod_util.h" 12 #include "base/memory/ref_counted.h" 13 #include "base/time/time.h" 14 #include "chrome/browser/ui/webui/constrained_web_dialog_ui.h" 15 16 class PrintPreviewDataService; 17 class PrintPreviewHandler; 18 struct PrintHostMsg_DidGetPreviewPageCount_Params; 19 struct PrintHostMsg_RequestPrintPreview_Params; 20 struct PrintHostMsg_SetOptionsFromDocument_Params; 21 22 namespace base { 23 class FilePath; 24 class RefCountedBytes; 25 } 26 27 namespace gfx { 28 class Rect; 29 } 30 31 namespace printing { 32 struct PageSizeMargins; 33 } 34 35 class PrintPreviewUI : public ConstrainedWebDialogUI { 36 public: 37 explicit PrintPreviewUI(content::WebUI* web_ui); 38 virtual ~PrintPreviewUI(); 39 40 // Gets the print preview |data|. |index| is zero-based, and can be 41 // |printing::COMPLETE_PREVIEW_DOCUMENT_INDEX| to get the entire preview 42 // document. 43 void GetPrintPreviewDataForIndex(int index, 44 scoped_refptr<base::RefCountedBytes>* data); 45 46 // Sets the print preview |data|. |index| is zero-based, and can be 47 // |printing::COMPLETE_PREVIEW_DOCUMENT_INDEX| to set the entire preview 48 // document. 49 void SetPrintPreviewDataForIndex(int index, 50 const base::RefCountedBytes* data); 51 52 // Clear the existing print preview data. 53 void ClearAllPreviewData(); 54 55 // Returns the available draft page count. 56 int GetAvailableDraftPageCount(); 57 58 // Setters 59 void SetInitiatorTitle(const base::string16& initiator_title); 60 initiator_title()61 base::string16 initiator_title() { return initiator_title_; } 62 source_is_modifiable()63 bool source_is_modifiable() { return source_is_modifiable_; } 64 source_has_selection()65 bool source_has_selection() { return source_has_selection_; } 66 print_selection_only()67 bool print_selection_only() { return print_selection_only_; } 68 69 // Set initial settings for PrintPreviewUI. 70 static void SetInitialParams( 71 content::WebContents* print_preview_dialog, 72 const PrintHostMsg_RequestPrintPreview_Params& params); 73 74 // Determines whether to cancel a print preview request based on 75 // |preview_ui_id| and |request_id|. 76 // Can be called from any thread. 77 static void GetCurrentPrintPreviewStatus(int32 preview_ui_id, 78 int request_id, 79 bool* cancel); 80 81 // Returns an id to uniquely identify this PrintPreviewUI. 82 int32 GetIDForPrintPreviewUI() const; 83 84 // Notifies the Web UI of a print preview request with |request_id|. 85 void OnPrintPreviewRequest(int request_id); 86 87 #if !defined(DISABLE_BASIC_PRINTING) 88 // Notifies the Web UI to show the system dialog. 89 void OnShowSystemDialog(); 90 #endif // !DISABLE_BASIC_PRINTING 91 92 // Notifies the Web UI about the page count of the request preview. 93 void OnDidGetPreviewPageCount( 94 const PrintHostMsg_DidGetPreviewPageCount_Params& params); 95 96 // Notifies the Web UI of the default page layout according to the currently 97 // selected printer and page size. 98 void OnDidGetDefaultPageLayout(const printing::PageSizeMargins& page_layout, 99 const gfx::Rect& printable_area, 100 bool has_custom_page_size_style); 101 102 // Notifies the Web UI that the 0-based page |page_number| has been rendered. 103 // |preview_request_id| indicates wich request resulted in this response. 104 void OnDidPreviewPage(int page_number, int preview_request_id); 105 106 // Notifies the Web UI renderer that preview data is available. 107 // |expected_pages_count| specifies the total number of pages. 108 // |preview_request_id| indicates which request resulted in this response. 109 void OnPreviewDataIsAvailable(int expected_pages_count, 110 int preview_request_id); 111 112 // Notifies the Web UI that preview dialog has been destroyed. This is the 113 // last chance to communicate with the initiator before the association is 114 // erased. 115 void OnPrintPreviewDialogDestroyed(); 116 117 // Notifies the Web UI that the print preview failed to render. 118 void OnPrintPreviewFailed(); 119 120 // Notified the Web UI that this print preview dialog's RenderProcess has been 121 // closed, which may occur for several reasons, e.g. tab closure or crash. 122 void OnPrintPreviewDialogClosed(); 123 124 // Notifies the Web UI that initiator is closed, so we can disable all the 125 // controls that need the initiator for generating the preview data. 126 void OnInitiatorClosed(); 127 128 // Notifies the Web UI renderer that file selection has been cancelled. 129 void OnFileSelectionCancelled(); 130 131 // Notifies the Web UI that the printer is unavailable or its settings are 132 // invalid. 133 void OnInvalidPrinterSettings(); 134 135 // Notifies the Web UI to cancel the pending preview request. 136 void OnCancelPendingPreviewRequest(); 137 138 // Hides the print preview dialog. 139 void OnHidePreviewDialog(); 140 141 // Closes the print preview dialog. 142 void OnClosePrintPreviewDialog(); 143 144 // Reload the printers list. 145 void OnReloadPrintersList(); 146 147 // Notifies the WebUI to set print preset options from source PDF. 148 void OnSetOptionsFromDocument( 149 const PrintHostMsg_SetOptionsFromDocument_Params& params); 150 151 // Allows tests to wait until the print preview dialog is loaded. Optionally 152 // also instructs the dialog to auto-cancel, which is used for testing only. 153 class TestingDelegate { 154 public: 155 virtual bool IsAutoCancelEnabled() = 0; 156 virtual void DidGetPreviewPageCount(int page_count) = 0; 157 virtual void DidRenderPreviewPage(content::WebContents* preview_dialog) = 0; 158 }; 159 160 static void SetDelegateForTesting(TestingDelegate* delegate); 161 162 // Allows for tests to set a file path to print a PDF to. This also initiates 163 // the printing without having to click a button on the print preview dialog. 164 void SetSelectedFileForTesting(const base::FilePath& path); 165 166 // Passes |closure| to PrintPreviewHandler::SetPdfSavedClosureForTesting(). 167 void SetPdfSavedClosureForTesting(const base::Closure& closure); 168 169 private: 170 friend class PrintPreviewHandlerTest; 171 FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, StickyMarginsCustom); 172 FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, StickyMarginsDefault); 173 FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, 174 StickyMarginsCustomThenDefault); 175 FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, 176 GetLastUsedMarginSettingsCustom); 177 FRIEND_TEST_ALL_PREFIXES(PrintPreviewHandlerTest, 178 GetLastUsedMarginSettingsDefault); 179 FRIEND_TEST_ALL_PREFIXES(PrintPreviewDialogControllerUnitTest, 180 TitleAfterReload); 181 182 // Returns the Singleton instance of the PrintPreviewDataService. 183 PrintPreviewDataService* print_preview_data_service(); 184 185 base::TimeTicks initial_preview_start_time_; 186 187 // The unique ID for this class instance. Stored here to avoid calling 188 // GetIDForPrintPreviewUI() everywhere. 189 const int32 id_; 190 191 // Weak pointer to the WebUI handler. 192 PrintPreviewHandler* handler_; 193 194 // Indicates whether the source document can be modified. 195 bool source_is_modifiable_; 196 197 // Indicates whether the source document has selection. 198 bool source_has_selection_; 199 200 // Indicates whether only the selection should be printed. 201 bool print_selection_only_; 202 203 // Store the initiator title, used for populating the print preview dialog 204 // title. 205 base::string16 initiator_title_; 206 207 // Keeps track of whether OnClosePrintPreviewDialog() has been called or not. 208 bool dialog_closed_; 209 210 DISALLOW_COPY_AND_ASSIGN(PrintPreviewUI); 211 }; 212 213 #endif // CHROME_BROWSER_UI_WEBUI_PRINT_PREVIEW_PRINT_PREVIEW_UI_H_ 214