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.
5 #ifndef PDF_PDF_ENGINE_H_
6 #define PDF_PDF_ENGINE_H_
8 #include "build/build_config.h"
17 #include "base/strings/string16.h"
19 #include "ppapi/c/dev/pp_cursor_type_dev.h"
20 #include "ppapi/c/dev/ppp_printing_dev.h"
21 #include "ppapi/c/ppb_input_event.h"
22 #include "ppapi/cpp/completion_callback.h"
23 #include "ppapi/cpp/image_data.h"
24 #include "ppapi/cpp/rect.h"
25 #include "ppapi/cpp/size.h"
26 #include "ppapi/cpp/url_loader.h"
27 #include "ppapi/cpp/var_array.h"
34 namespace chrome_pdf
{
38 #if defined(OS_MACOSX)
39 const uint32 kDefaultKeyModifier
= PP_INPUTEVENT_MODIFIER_METAKEY
;
41 const uint32 kDefaultKeyModifier
= PP_INPUTEVENT_MODIFIER_CONTROLKEY
;
44 // Do one time initialization of the SDK.
46 // Tells the SDK that we're shutting down.
49 // This class encapsulates a PDF rendering engine.
53 enum DocumentPermission
{
55 PERMISSION_COPY_ACCESSIBLE
,
56 PERMISSION_PRINT_LOW_QUALITY
,
57 PERMISSION_PRINT_HIGH_QUALITY
,
60 // The interface that's provided to the rendering engine.
63 // Informs the client about the document's size in pixels.
64 virtual void DocumentSizeUpdated(const pp::Size
& size
) = 0;
66 // Informs the client that the given rect needs to be repainted.
67 virtual void Invalidate(const pp::Rect
& rect
) = 0;
69 // Informs the client to scroll the plugin area by the given offset.
70 virtual void Scroll(const pp::Point
& point
) = 0;
72 // Scroll the horizontal/vertical scrollbars to a given position.
73 virtual void ScrollToX(int position
) = 0;
74 virtual void ScrollToY(int position
) = 0;
76 // Scroll to the specified page.
77 virtual void ScrollToPage(int page
) = 0;
79 // Navigate to the given url.
80 virtual void NavigateTo(const std::string
& url
, bool open_in_new_tab
) = 0;
82 // Updates the cursor.
83 virtual void UpdateCursor(PP_CursorType_Dev cursor
) = 0;
85 // Updates the tick marks in the vertical scrollbar.
86 virtual void UpdateTickMarks(const std::vector
<pp::Rect
>& tickmarks
) = 0;
88 // Updates the number of find results for the current search term. If
89 // there are no matches 0 should be passed in. Only when the plugin has
90 // finished searching should it pass in the final count with final_result
92 virtual void NotifyNumberOfFindResultsChanged(int total
,
93 bool final_result
) = 0;
95 // Updates the index of the currently selected search item.
96 virtual void NotifySelectedFindResultChanged(int current_find_index
) = 0;
98 // Prompts the user for a password to open this document. The callback is
99 // called when the password is retrieved.
100 virtual void GetDocumentPassword(
101 pp::CompletionCallbackWithOutput
<pp::Var
> callback
) = 0;
103 // Puts up an alert with the given message.
104 virtual void Alert(const std::string
& message
) = 0;
106 // Puts up a confirm with the given message, and returns true if the user
107 // presses OK, or false if they press cancel.
108 virtual bool Confirm(const std::string
& message
) = 0;
110 // Puts up a prompt with the given message and default answer and returns
112 virtual std::string
Prompt(const std::string
& question
,
113 const std::string
& default_answer
) = 0;
115 // Returns the url of the pdf.
116 virtual std::string
GetURL() = 0;
119 virtual void Email(const std::string
& to
,
120 const std::string
& cc
,
121 const std::string
& bcc
,
122 const std::string
& subject
,
123 const std::string
& body
) = 0;
125 // Put up the print dialog.
126 virtual void Print() = 0;
128 // Submit the data using HTTP POST.
129 virtual void SubmitForm(const std::string
& url
,
133 // Pops up a file selection dialog and returns the result.
134 virtual std::string
ShowFileSelectionDialog() = 0;
136 // Creates and returns new URL loader for partial document requests.
137 virtual pp::URLLoader
CreateURLLoader() = 0;
139 // Calls the client's OnCallback() function in delay_in_ms with the given
141 virtual void ScheduleCallback(int id
, int delay_in_ms
) = 0;
143 // Searches the given string for "term" and returns the results. Unicode-
145 struct SearchStringResult
{
149 virtual void SearchString(const base::char16
* string
,
150 const base::char16
* term
,
152 std::vector
<SearchStringResult
>* results
) = 0;
154 // Notifies the client that the engine has painted a page from the document.
155 virtual void DocumentPaintOccurred() = 0;
157 // Notifies the client that the document has finished loading.
158 virtual void DocumentLoadComplete(int page_count
) = 0;
160 // Notifies the client that the document has failed to load.
161 virtual void DocumentLoadFailed() = 0;
163 virtual pp::Instance
* GetPluginInstance() = 0;
165 // Notifies that an unsupported feature in the PDF was encountered.
166 virtual void DocumentHasUnsupportedFeature(const std::string
& feature
) = 0;
168 // Notifies the client about document load progress.
169 virtual void DocumentLoadProgress(uint32 available
, uint32 doc_size
) = 0;
171 // Notifies the client about focus changes for form text fields.
172 virtual void FormTextFieldFocusChange(bool in_focus
) = 0;
174 // Returns true if the plugin has been opened within print preview.
175 virtual bool IsPrintPreview() = 0;
177 // Get the background color of the PDF.
178 virtual uint32
GetBackgroundColor() = 0;
180 // Sets selection status.
181 virtual void IsSelectingChanged(bool is_selecting
){};
184 // Factory method to create an instance of the PDF Engine.
185 static PDFEngine
* Create(Client
* client
);
187 virtual ~PDFEngine() {}
188 // Most of these functions are similar to the Pepper functions of the same
189 // name, so not repeating the description here unless it's different.
190 virtual bool New(const char* url
) = 0;
191 virtual bool New(const char* url
,
192 const char* headers
) = 0;
193 virtual void PageOffsetUpdated(const pp::Point
& page_offset
) = 0;
194 virtual void PluginSizeUpdated(const pp::Size
& size
) = 0;
195 virtual void ScrolledToXPosition(int position
) = 0;
196 virtual void ScrolledToYPosition(int position
) = 0;
197 // Paint is called a series of times. Before these n calls are made, PrePaint
198 // is called once. After Paint is called n times, PostPaint is called once.
199 virtual void PrePaint() = 0;
200 virtual void Paint(const pp::Rect
& rect
,
201 pp::ImageData
* image_data
,
202 std::vector
<pp::Rect
>* ready
,
203 std::vector
<pp::Rect
>* pending
) = 0;
204 virtual void PostPaint() = 0;
205 virtual bool HandleDocumentLoad(const pp::URLLoader
& loader
) = 0;
206 virtual bool HandleEvent(const pp::InputEvent
& event
) = 0;
207 virtual uint32_t QuerySupportedPrintOutputFormats() = 0;
208 virtual void PrintBegin() = 0;
209 virtual pp::Resource
PrintPages(
210 const PP_PrintPageNumberRange_Dev
* page_ranges
,
211 uint32_t page_range_count
,
212 const PP_PrintSettings_Dev
& print_settings
) = 0;
213 virtual void PrintEnd() = 0;
214 virtual void StartFind(const char* text
, bool case_sensitive
) = 0;
215 virtual bool SelectFindResult(bool forward
) = 0;
216 virtual void StopFind() = 0;
217 virtual void ZoomUpdated(double new_zoom_level
) = 0;
218 virtual void RotateClockwise() = 0;
219 virtual void RotateCounterclockwise() = 0;
220 virtual std::string
GetSelectedText() = 0;
221 virtual std::string
GetLinkAtPosition(const pp::Point
& point
) = 0;
222 virtual bool IsSelecting() = 0;
223 // Checks the permissions associated with this document.
224 virtual bool HasPermission(DocumentPermission permission
) const = 0;
225 virtual void SelectAll() = 0;
226 // Gets the number of pages in the document.
227 virtual int GetNumberOfPages() = 0;
228 // Gets the 0-based page number of |destination|, or -1 if it does not exist.
229 virtual int GetNamedDestinationPage(const std::string
& destination
) = 0;
230 // Gets the index of the first visible page, or -1 if none are visible.
231 virtual int GetFirstVisiblePage() = 0;
232 // Gets the index of the most visible page, or -1 if none are visible.
233 virtual int GetMostVisiblePage() = 0;
234 // Gets the rectangle of the page including shadow.
235 virtual pp::Rect
GetPageRect(int index
) = 0;
236 // Gets the rectangle of the page excluding any additional areas.
237 virtual pp::Rect
GetPageContentsRect(int index
) = 0;
238 // Gets the offset of the vertical scrollbar from the top in document
240 virtual int GetVerticalScrollbarYPosition() = 0;
241 // Paints page thumbnail to the ImageData.
242 virtual void PaintThumbnail(pp::ImageData
* image_data
, int index
) = 0;
243 // Set color / grayscale rendering modes.
244 virtual void SetGrayscale(bool grayscale
) = 0;
245 // Callback for timer that's set with ScheduleCallback().
246 virtual void OnCallback(int id
) = 0;
247 // Gets the JSON representation of the PDF file
248 virtual std::string
GetPageAsJSON(int index
) = 0;
249 // Gets the PDF document's print scaling preference. True if the document can
251 virtual bool GetPrintScaling() = 0;
252 // Returns number of copies to be printed.
253 virtual int GetCopiesToPrint() = 0;
255 // Returns a VarArray of Bookmarks, each a VarDictionary containing the
256 // following key/values:
257 // - "title" - a string Var.
258 // - "page" - an int Var.
259 // - "children" - a VarArray(), with each entry containing a VarDictionary of
260 // the same structure.
261 virtual pp::VarArray
GetBookmarks() = 0;
263 // Append blank pages to make a 1-page document to a |num_pages| document.
264 // Always retain the first page data.
265 virtual void AppendBlankPages(int num_pages
) = 0;
266 // Append the first page of the document loaded with the |engine| to this
267 // document at page |index|.
268 virtual void AppendPage(PDFEngine
* engine
, int index
) = 0;
270 // Allow client to query and reset scroll positions in document coordinates.
271 // Note that this is meant for cases where the device scale factor changes,
272 // and not for general scrolling - the engine will not repaint due to this.
273 virtual pp::Point
GetScrollPosition() = 0;
274 virtual void SetScrollPosition(const pp::Point
& position
) = 0;
276 virtual bool IsProgressiveLoad() = 0;
279 // Interface for exports that wrap the PDF engine.
280 class PDFEngineExports
{
282 struct RenderingSettings
{
283 RenderingSettings(int dpi_x
,
285 const pp::Rect
& bounds
,
287 bool stretch_to_bounds
,
288 bool keep_aspect_ratio
,
289 bool center_in_bounds
,
291 : dpi_x(dpi_x
), dpi_y(dpi_y
), bounds(bounds
),
292 fit_to_bounds(fit_to_bounds
), stretch_to_bounds(stretch_to_bounds
),
293 keep_aspect_ratio(keep_aspect_ratio
),
294 center_in_bounds(center_in_bounds
), autorotate(autorotate
) {
300 bool stretch_to_bounds
;
301 bool keep_aspect_ratio
;
302 bool center_in_bounds
;
306 PDFEngineExports() {}
307 virtual ~PDFEngineExports() {}
308 static PDFEngineExports
* Create();
310 // See the definition of RenderPDFPageToDC in pdf.cc for details.
311 virtual bool RenderPDFPageToDC(const void* pdf_buffer
,
314 const RenderingSettings
& settings
,
317 // See the definition of RenderPDFPageToBitmap in pdf.cc for details.
318 virtual bool RenderPDFPageToBitmap(const void* pdf_buffer
,
321 const RenderingSettings
& settings
,
322 void* bitmap_buffer
) = 0;
324 virtual bool GetPDFDocInfo(const void* pdf_buffer
,
327 double* max_page_width
) = 0;
329 // See the definition of GetPDFPageSizeByIndex in pdf.cc for details.
330 virtual bool GetPDFPageSizeByIndex(const void* pdf_buffer
,
331 int pdf_buffer_size
, int page_number
,
332 double* width
, double* height
) = 0;
335 } // namespace chrome_pdf
337 #endif // PDF_PDF_ENGINE_H_