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