Upload upstream chromium 69.0.3497
[platform/framework/web/chromium-efl.git] / pdf / out_of_process_instance.h
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 PDF_OUT_OF_PROCESS_INSTANCE_H_
6 #define PDF_OUT_OF_PROCESS_INSTANCE_H_
7
8 #include <stdint.h>
9 #include <string.h>
10
11 #include <memory>
12 #include <set>
13 #include <string>
14 #include <utility>
15 #include <vector>
16
17 #include "base/containers/queue.h"
18 #include "base/macros.h"
19 #include "pdf/paint_manager.h"
20 #include "pdf/pdf_engine.h"
21 #include "pdf/preview_mode_client.h"
22 #include "ppapi/c/private/ppb_pdf.h"
23 #include "ppapi/c/private/ppp_pdf.h"
24 #include "ppapi/cpp/dev/printing_dev.h"
25 #include "ppapi/cpp/dev/scriptable_object_deprecated.h"
26 #include "ppapi/cpp/graphics_2d.h"
27 #include "ppapi/cpp/image_data.h"
28 #include "ppapi/cpp/input_event.h"
29 #include "ppapi/cpp/instance.h"
30 #include "ppapi/cpp/private/find_private.h"
31 #include "ppapi/cpp/private/uma_private.h"
32 #include "ppapi/cpp/url_loader.h"
33 #include "ppapi/utility/completion_callback_factory.h"
34
35 namespace pp {
36 class TextInput_Dev;
37 }
38
39 namespace chrome_pdf {
40
41 class OutOfProcessInstance : public pp::Instance,
42                              public pp::Find_Private,
43                              public pp::Printing_Dev,
44                              public PaintManager::Client,
45                              public PDFEngine::Client,
46                              public PreviewModeClient::Client {
47  public:
48   explicit OutOfProcessInstance(PP_Instance instance);
49   ~OutOfProcessInstance() override;
50
51   // pp::Instance implementation.
52   bool Init(uint32_t argc, const char* argn[], const char* argv[]) override;
53   void HandleMessage(const pp::Var& message) override;
54   bool HandleInputEvent(const pp::InputEvent& event) override;
55   void DidChangeView(const pp::View& view) override;
56   void DidChangeFocus(bool has_focus) override;
57
58   // pp::Find_Private implementation.
59   bool StartFind(const std::string& text, bool case_sensitive) override;
60   void SelectFindResult(bool forward) override;
61   void StopFind() override;
62
63   // pp::PaintManager::Client implementation.
64   void OnPaint(const std::vector<pp::Rect>& paint_rects,
65                std::vector<PaintManager::ReadyRect>* ready,
66                std::vector<pp::Rect>* pending) override;
67
68   // pp::Printing_Dev implementation.
69   uint32_t QuerySupportedPrintOutputFormats() override;
70   int32_t PrintBegin(const PP_PrintSettings_Dev& print_settings) override;
71   pp::Resource PrintPages(const PP_PrintPageNumberRange_Dev* page_ranges,
72                           uint32_t page_range_count) override;
73   void PrintEnd() override;
74   bool IsPrintScalingDisabled() override;
75
76   // pp::Private implementation.
77   pp::Var GetLinkAtPosition(const pp::Point& point);
78   void GetPrintPresetOptionsFromDocument(PP_PdfPrintPresetOptions_Dev* options);
79   void EnableAccessibility();
80   void SetCaretPosition(const pp::FloatPoint& position);
81   void MoveRangeSelectionExtent(const pp::FloatPoint& extent);
82   void SetSelectionBounds(const pp::FloatPoint& base,
83                           const pp::FloatPoint& extent);
84   bool CanEditText();
85   bool HasEditableText();
86   void ReplaceSelection(const std::string& text);
87   bool CanUndo();
88   bool CanRedo();
89   void Undo();
90   void Redo();
91   int32_t PdfPrintBegin(const PP_PrintSettings_Dev* print_settings,
92                         const PP_PdfPrintSettings_Dev* pdf_print_settings);
93
94   void FlushCallback(int32_t result);
95   void DidOpen(int32_t result);
96   void DidOpenPreview(int32_t result);
97
98   // Called to print without re-entrancy issues.
99   void OnPrint(int32_t);
100
101   // PDFEngine::Client implementation.
102   void DocumentSizeUpdated(const pp::Size& size) override;
103   void Invalidate(const pp::Rect& rect) override;
104   void DidScroll(const pp::Point& point) override;
105   void ScrollToX(int x_in_screen_coords) override;
106   void ScrollToY(int y_in_screen_coords, bool compensate_for_toolbar) override;
107   void ScrollBy(const pp::Point& point) override;
108   void ScrollToPage(int page) override;
109   void NavigateTo(const std::string& url,
110                   WindowOpenDisposition disposition) override;
111   void UpdateCursor(PP_CursorType_Dev cursor) override;
112   void UpdateTickMarks(const std::vector<pp::Rect>& tickmarks) override;
113   void NotifyNumberOfFindResultsChanged(int total, bool final_result) override;
114   void NotifySelectedFindResultChanged(int current_find_index) override;
115   void NotifyPageBecameVisible(
116       const PDFEngine::PageFeatures* page_features) override;
117   void GetDocumentPassword(
118       pp::CompletionCallbackWithOutput<pp::Var> callback) override;
119   void Beep() override;
120   void Alert(const std::string& message) override;
121   bool Confirm(const std::string& message) override;
122   std::string Prompt(const std::string& question,
123                      const std::string& default_answer) override;
124   std::string GetURL() override;
125   void Email(const std::string& to,
126              const std::string& cc,
127              const std::string& bcc,
128              const std::string& subject,
129              const std::string& body) override;
130   void Print() override;
131   void SubmitForm(const std::string& url,
132                   const void* data,
133                   int length) override;
134   pp::URLLoader CreateURLLoader() override;
135   std::vector<SearchStringResult> SearchString(const base::char16* string,
136                                                const base::char16* term,
137                                                bool case_sensitive) override;
138   void DocumentPaintOccurred() override;
139   void DocumentLoadComplete(
140       const PDFEngine::DocumentFeatures& document_features,
141       uint32_t file_size) override;
142   void DocumentLoadFailed() override;
143   void FontSubstituted() override;
144   pp::Instance* GetPluginInstance() override;
145   void DocumentHasUnsupportedFeature(const std::string& feature) override;
146   void DocumentLoadProgress(uint32_t available, uint32_t doc_size) override;
147   void FormTextFieldFocusChange(bool in_focus) override;
148   bool IsPrintPreview() override;
149   uint32_t GetBackgroundColor() override;
150   void CancelBrowserDownload() override;
151   void IsSelectingChanged(bool is_selecting) override;
152   void SelectionChanged(const pp::Rect& left, const pp::Rect& right) override;
153   void IsEditModeChanged(bool is_edit_mode) override;
154   float GetToolbarHeightInScreenCoords() override;
155
156   // PreviewModeClient::Client implementation.
157   void PreviewDocumentLoadComplete() override;
158   void PreviewDocumentLoadFailed() override;
159
160   // Helper functions for implementing PPP_PDF.
161   void RotateClockwise();
162   void RotateCounterclockwise();
163
164  private:
165   void ResetRecentlySentFindUpdate(int32_t);
166
167   // Called whenever the plugin geometry changes to update the location of the
168   // background parts, and notifies the pdf engine.
169   void OnGeometryChanged(double old_zoom, float old_device_scale);
170
171   // Figures out the location of any background rectangles (i.e. those that
172   // aren't painted by the PDF engine).
173   void CalculateBackgroundParts();
174
175   // Computes document width/height in device pixels, based on current zoom and
176   // device scale
177   int GetDocumentPixelWidth() const;
178   int GetDocumentPixelHeight() const;
179
180   // Draws a rectangle with the specified dimensions and color in our buffer.
181   void FillRect(const pp::Rect& rect, uint32_t color);
182
183   void LoadUrl(const std::string& url, bool is_print_preview);
184
185   // Creates a URL loader and allows it to access all urls, i.e. not just the
186   // frame's origin.
187   pp::URLLoader CreateURLLoaderInternal();
188
189   void FormDidOpen(int32_t result);
190
191   void UserMetricsRecordAction(const std::string& action);
192
193   // Start loading accessibility information.
194   void LoadAccessibility();
195
196   // Send accessibility information about the given page index.
197   void SendNextAccessibilityPage(int32_t page_index);
198
199   // Send the accessibility information about the current viewport. This is
200   // done once when accessibility is first loaded and again when the geometry
201   // changes.
202   void SendAccessibilityViewportInfo();
203
204   enum DocumentLoadState {
205     LOAD_STATE_LOADING,
206     LOAD_STATE_COMPLETE,
207     LOAD_STATE_FAILED,
208   };
209
210   // Set new zoom scale.
211   void SetZoom(double scale);
212
213   // Reduces the document to 1 page and appends |print_preview_page_count_| - 1
214   // blank pages to the document for print preview.
215   void AppendBlankPrintPreviewPages();
216
217   // Process the preview page data information. |src_url| specifies the preview
218   // page data location. The |src_url| is in the format:
219   // chrome://print/id/page_number/print.pdf
220   // |dest_page_index| specifies the blank page index that needs to be replaced
221   // with the new page data.
222   void ProcessPreviewPageInfo(const std::string& src_url, int dest_page_index);
223   // Load the next available preview page into the blank page.
224   void LoadAvailablePreviewPage();
225
226   // Called after a preview page has loaded or failed to load.
227   void LoadNextPreviewPage();
228
229   // Send a notification that the print preview has loaded.
230   void SendPrintPreviewLoadedNotification();
231
232   // Bound the given scroll offset to the document.
233   pp::FloatPoint BoundScrollOffsetToDocument(
234       const pp::FloatPoint& scroll_offset);
235
236   // Wrappers for |uma_| so histogram reporting only occurs when the PDF Viewer
237   // is not being used for print preview.
238   void HistogramCustomCounts(const std::string& name,
239                              int32_t sample,
240                              int32_t min,
241                              int32_t max,
242                              uint32_t bucket_count);
243   void HistogramEnumeration(const std::string& name,
244                             int32_t sample,
245                             int32_t boundary_value);
246
247   // Wrapper for |uma_| so PrintPreview.PdfAction histogram reporting only
248   // occurs when the PDF Viewer is being used inside print preview.
249   void PrintPreviewHistogramEnumeration(int32_t sample);
250
251   pp::ImageData image_data_;
252   // Used when the plugin is embedded in a page and we have to create the loader
253   // ourself.
254   pp::URLLoader embed_loader_;
255   pp::URLLoader embed_preview_loader_;
256
257   PP_CursorType_Dev cursor_;  // The current cursor.
258
259   // Size, in pixels, of plugin rectangle.
260   pp::Size plugin_size_;
261   // Size, in DIPs, of plugin rectangle.
262   pp::Size plugin_dip_size_;
263   // Remaining area, in pixels, to render the pdf in after accounting for
264   // horizontal centering.
265   pp::Rect available_area_;
266   // Size of entire document in pixels (i.e. if each page is 800 pixels high and
267   // there are 10 pages, the height will be 8000).
268   pp::Size document_size_;
269   // The scroll offset in CSS pixels.
270   pp::Point scroll_offset_;
271
272   // Enumeration of pinch states.
273   // This should match PinchPhase enum in
274   // chrome/browser/resources/pdf/viewport.js
275   enum PinchPhase {
276     PINCH_NONE = 0,
277     PINCH_START = 1,
278     PINCH_UPDATE_ZOOM_OUT = 2,
279     PINCH_UPDATE_ZOOM_IN = 3,
280     PINCH_END = 4
281   };
282
283   // Current zoom factor.
284   double zoom_;
285   // True if we request a new bitmap rendering.
286   bool needs_reraster_;
287   // The scroll position for the last raster, before any transformations are
288   // applied.
289   pp::FloatPoint scroll_offset_at_last_raster_;
290   // True if last bitmap was smaller than screen.
291   bool last_bitmap_smaller_;
292   // Current device scale factor. Multiply by |device_scale_| to convert from
293   // viewport to screen coordinates. Divide by |device_scale_| to convert from
294   // screen to viewport coordinates.
295   float device_scale_;
296   // True if the plugin is full-page.
297   bool full_;
298
299   PaintManager paint_manager_;
300
301   struct BackgroundPart {
302     pp::Rect location;
303     uint32_t color;
304   };
305   std::vector<BackgroundPart> background_parts_;
306
307   struct PrintSettings {
308     PrintSettings() { Clear(); }
309
310     void Clear();
311
312     // This is set to true when PdfPrintBegin() is called and false when
313     // PrintEnd() is called.
314     bool is_printing;
315
316     // To know whether this was an actual print operation, so we don't double
317     // count UMA logging.
318     bool print_pages_called;
319
320     // Generic print settings.
321     PP_PrintSettings_Dev pepper_print_settings;
322
323     // PDF-specific print settings.
324     PP_PdfPrintSettings_Dev pdf_print_settings;
325   };
326
327   PrintSettings print_settings_;
328
329   std::unique_ptr<PDFEngine> engine_;
330
331   // The PreviewModeClient used for print preview. Will be passed to
332   // |preview_engine_|.
333   std::unique_ptr<PreviewModeClient> preview_client_;
334
335   // This engine is used to render the individual preview page data. This is
336   // used only in print preview mode. This will use |PreviewModeClient|
337   // interface which has very limited access to the pp::Instance.
338   std::unique_ptr<PDFEngine> preview_engine_;
339
340   std::string url_;
341
342   // Used for submitting forms.
343   pp::URLLoader form_loader_;
344
345   pp::CompletionCallbackFactory<OutOfProcessInstance> callback_factory_;
346
347   // The callback for receiving the password from the page.
348   std::unique_ptr<pp::CompletionCallbackWithOutput<pp::Var>> password_callback_;
349
350   // True if we haven't painted the plugin viewport yet.
351   bool first_paint_;
352
353   DocumentLoadState document_load_state_;
354   DocumentLoadState preview_document_load_state_;
355
356   // A UMA resource for histogram reporting.
357   pp::UMAPrivate uma_;
358
359   // Used so that we only tell the browser once about an unsupported feature, to
360   // avoid the infobar going up more than once.
361   bool told_browser_about_unsupported_feature_;
362
363   // Keeps track of which unsupported features we reported, so we avoid spamming
364   // the stats if a feature shows up many times per document.
365   std::set<std::string> unsupported_features_reported_;
366
367   // Keeps track of whether font substitution has been reported, so we avoid
368   // spamming the stats if a document requested multiple substitutes.
369   bool font_substitution_reported_;
370
371   // Number of pages in print preview mode for non-PDF source, 0 if print
372   // previewing a PDF, and -1 if not in print preview mode.
373   int print_preview_page_count_;
374
375   // Number of pages loaded in print preview mode for non-PDF source. Always
376   // less than or equal to |print_preview_page_count_|.
377   int print_preview_loaded_page_count_;
378
379   // Used to manage loaded print preview page information. A |PreviewPageInfo|
380   // consists of data source URL string and the page index in the destination
381   // document.
382   // The URL string embeds a page number that can be found with
383   // ExtractPrintPreviewPageIndex(). This page number is always greater than 0.
384   // The page index is always in the range of [0, print_preview_page_count_).
385   using PreviewPageInfo = std::pair<std::string, int>;
386   base::queue<PreviewPageInfo> preview_pages_info_;
387
388   // Used to signal the browser about focus changes to trigger the OSK.
389   // TODO(abodenha@chromium.org) Implement full IME support in the plugin.
390   // http://crbug.com/132565
391   std::unique_ptr<pp::TextInput_Dev> text_input_;
392
393   // The last document load progress value sent to the web page.
394   double last_progress_sent_;
395
396   // Whether an update to the number of find results found was sent less than
397   // |kFindResultCooldownMs| milliseconds ago.
398   bool recently_sent_find_update_;
399
400   // The tickmarks.
401   std::vector<pp::Rect> tickmarks_;
402
403   // Whether the plugin has received a viewport changed message. Nothing should
404   // be painted until this is received.
405   bool received_viewport_message_;
406
407   // If true, this means we told the RenderView that we're starting a network
408   // request so that it can start the throbber. We will tell it again once the
409   // document finishes loading.
410   bool did_call_start_loading_;
411
412   // If this is true, then don't scroll the plugin in response to DidChangeView
413   // messages. This will be true when the extension page is in the process of
414   // zooming the plugin so that flickering doesn't occur while zooming.
415   bool stop_scrolling_;
416
417   // The background color of the PDF viewer.
418   uint32_t background_color_;
419
420   // The blank space above the first page of the document reserved for the
421   // toolbar.
422   int top_toolbar_height_in_viewport_coords_;
423
424   // Whether each page had its features processed.
425   std::vector<bool> page_is_processed_;
426
427   // Annotation types that were already counted for this document.
428   std::set<int> annotation_types_counted_;
429
430   // The current state of accessibility: either off, enabled but waiting
431   // for the document to load, or fully loaded.
432   enum AccessibilityState {
433     ACCESSIBILITY_STATE_OFF,
434     ACCESSIBILITY_STATE_PENDING,  // Enabled but waiting for doc to load.
435     ACCESSIBILITY_STATE_LOADED
436   } accessibility_state_;
437
438   // True if the plugin is loaded in print preview, otherwise false.
439   bool is_print_preview_;
440
441   // Used for UMA. Do not delete entries, and keep in sync with histograms.xml.
442   enum PdfActionBuckets {
443     PRINT_PREVIEW_SHOWN = 0,
444     ROTATE = 1,
445     SELECT_TEXT = 2,
446     UPDATE_ZOOM = 3,
447     PDFACTION_BUCKET_BOUNDARY,
448   };
449
450   // Array indicating what events have been recorded for print preview metrics.
451   bool preview_action_recorded_[PDFACTION_BUCKET_BOUNDARY];
452
453   DISALLOW_COPY_AND_ASSIGN(OutOfProcessInstance);
454 };
455
456 }  // namespace chrome_pdf
457
458 #endif  // PDF_OUT_OF_PROCESS_INSTANCE_H_