Upload upstream chromium 73.0.3683.0
[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/ppp_pdf.h"
23 #include "ppapi/cpp/dev/printing_dev.h"
24 #include "ppapi/cpp/image_data.h"
25 #include "ppapi/cpp/instance.h"
26 #include "ppapi/cpp/private/find_private.h"
27 #include "ppapi/cpp/private/uma_private.h"
28 #include "ppapi/cpp/url_loader.h"
29 #include "ppapi/utility/completion_callback_factory.h"
30
31 namespace pp {
32 class TextInput_Dev;
33 }
34
35 namespace chrome_pdf {
36
37 class OutOfProcessInstance : public pp::Instance,
38                              public pp::Find_Private,
39                              public pp::Printing_Dev,
40                              public PaintManager::Client,
41                              public PDFEngine::Client,
42                              public PreviewModeClient::Client {
43  public:
44   explicit OutOfProcessInstance(PP_Instance instance);
45   ~OutOfProcessInstance() override;
46
47   // pp::Instance implementation.
48   bool Init(uint32_t argc, const char* argn[], const char* argv[]) override;
49   void HandleMessage(const pp::Var& message) override;
50   bool HandleInputEvent(const pp::InputEvent& event) override;
51   void DidChangeView(const pp::View& view) override;
52   void DidChangeFocus(bool has_focus) override;
53
54   // pp::Find_Private implementation.
55   bool StartFind(const std::string& text, bool case_sensitive) override;
56   void SelectFindResult(bool forward) override;
57   void StopFind() override;
58
59   // pp::PaintManager::Client implementation.
60   void OnPaint(const std::vector<pp::Rect>& paint_rects,
61                std::vector<PaintManager::ReadyRect>* ready,
62                std::vector<pp::Rect>* pending) override;
63
64   // pp::Printing_Dev implementation.
65   uint32_t QuerySupportedPrintOutputFormats() override;
66   int32_t PrintBegin(const PP_PrintSettings_Dev& print_settings) override;
67   pp::Resource PrintPages(const PP_PrintPageNumberRange_Dev* page_ranges,
68                           uint32_t page_range_count) override;
69   void PrintEnd() override;
70   bool IsPrintScalingDisabled() override;
71
72   // pp::Private implementation.
73   pp::Var GetLinkAtPosition(const pp::Point& point);
74   void GetPrintPresetOptionsFromDocument(PP_PdfPrintPresetOptions_Dev* options);
75   void EnableAccessibility();
76   void SetCaretPosition(const pp::FloatPoint& position);
77   void MoveRangeSelectionExtent(const pp::FloatPoint& extent);
78   void SetSelectionBounds(const pp::FloatPoint& base,
79                           const pp::FloatPoint& extent);
80   bool CanEditText();
81   bool HasEditableText();
82   void ReplaceSelection(const std::string& text);
83   bool CanUndo();
84   bool CanRedo();
85   void Undo();
86   void Redo();
87   int32_t PdfPrintBegin(const PP_PrintSettings_Dev* print_settings,
88                         const PP_PdfPrintSettings_Dev* pdf_print_settings);
89
90   void FlushCallback(int32_t result);
91   void DidOpen(int32_t result);
92   void DidOpenPreview(int32_t result);
93
94   // Called to print without re-entrancy issues.
95   void OnPrint(int32_t);
96
97   // PDFEngine::Client implementation.
98   void DocumentSizeUpdated(const pp::Size& size) override;
99   void Invalidate(const pp::Rect& rect) override;
100   void DidScroll(const pp::Point& point) override;
101   void ScrollToX(int x_in_screen_coords) override;
102   void ScrollToY(int y_in_screen_coords, bool compensate_for_toolbar) override;
103   void ScrollBy(const pp::Point& point) override;
104   void ScrollToPage(int page) override;
105   void NavigateTo(const std::string& url,
106                   WindowOpenDisposition disposition) override;
107   void UpdateCursor(PP_CursorType_Dev cursor) override;
108   void UpdateTickMarks(const std::vector<pp::Rect>& tickmarks) override;
109   void NotifyNumberOfFindResultsChanged(int total, bool final_result) override;
110   void NotifySelectedFindResultChanged(int current_find_index) override;
111   void NotifyPageBecameVisible(
112       const PDFEngine::PageFeatures* page_features) override;
113   void GetDocumentPassword(
114       pp::CompletionCallbackWithOutput<pp::Var> callback) override;
115   void Beep() override;
116   void Alert(const std::string& message) override;
117   bool Confirm(const std::string& message) override;
118   std::string Prompt(const std::string& question,
119                      const std::string& default_answer) override;
120   std::string GetURL() override;
121   void Email(const std::string& to,
122              const std::string& cc,
123              const std::string& bcc,
124              const std::string& subject,
125              const std::string& body) override;
126   void Print() override;
127   void SubmitForm(const std::string& url,
128                   const void* data,
129                   int length) override;
130   pp::URLLoader CreateURLLoader() override;
131   std::vector<SearchStringResult> SearchString(const base::char16* string,
132                                                const base::char16* term,
133                                                bool case_sensitive) override;
134   void DocumentLoadComplete(
135       const PDFEngine::DocumentFeatures& document_features,
136       uint32_t file_size) override;
137   void DocumentLoadFailed() override;
138   void FontSubstituted() override;
139   pp::Instance* GetPluginInstance() override;
140   void DocumentHasUnsupportedFeature(const std::string& feature) override;
141   void DocumentLoadProgress(uint32_t available, uint32_t doc_size) override;
142   void FormTextFieldFocusChange(bool in_focus) override;
143   bool IsPrintPreview() override;
144   uint32_t GetBackgroundColor() override;
145   void CancelBrowserDownload() override;
146   void IsSelectingChanged(bool is_selecting) override;
147   void SelectionChanged(const pp::Rect& left, const pp::Rect& right) override;
148   void IsEditModeChanged(bool is_edit_mode) override;
149   float GetToolbarHeightInScreenCoords() override;
150
151   // PreviewModeClient::Client implementation.
152   void PreviewDocumentLoadComplete() override;
153   void PreviewDocumentLoadFailed() override;
154
155   // Helper functions for implementing PPP_PDF.
156   void RotateClockwise();
157   void RotateCounterclockwise();
158
159  private:
160   void ResetRecentlySentFindUpdate(int32_t);
161
162   // Called whenever the plugin geometry changes to update the location of the
163   // background parts, and notifies the pdf engine.
164   void OnGeometryChanged(double old_zoom, float old_device_scale);
165
166   // Figures out the location of any background rectangles (i.e. those that
167   // aren't painted by the PDF engine).
168   void CalculateBackgroundParts();
169
170   // Computes document width/height in device pixels, based on current zoom and
171   // device scale
172   int GetDocumentPixelWidth() const;
173   int GetDocumentPixelHeight() const;
174
175   // Draws a rectangle with the specified dimensions and color in our buffer.
176   void FillRect(const pp::Rect& rect, uint32_t color);
177
178   void LoadUrl(const std::string& url, bool is_print_preview);
179
180   // Creates a URL loader and allows it to access all urls, i.e. not just the
181   // frame's origin.
182   pp::URLLoader CreateURLLoaderInternal();
183
184   bool ShouldSaveEdits() const;
185   void SaveToFile(const std::string& token);
186   void SaveToBuffer(const std::string& token);
187   void ConsumeSaveToken(const std::string& token);
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   bool edit_mode_ = false;
431
432   // The current state of accessibility: either off, enabled but waiting
433   // for the document to load, or fully loaded.
434   enum AccessibilityState {
435     ACCESSIBILITY_STATE_OFF,
436     ACCESSIBILITY_STATE_PENDING,  // Enabled but waiting for doc to load.
437     ACCESSIBILITY_STATE_LOADED
438   } accessibility_state_;
439
440   // True if the plugin is loaded in print preview, otherwise false.
441   bool is_print_preview_;
442
443   // Used for UMA. Do not delete entries, and keep in sync with histograms.xml.
444   enum PdfActionBuckets {
445     PRINT_PREVIEW_SHOWN = 0,
446     ROTATE = 1,
447     SELECT_TEXT = 2,
448     UPDATE_ZOOM = 3,
449     PDFACTION_BUCKET_BOUNDARY,
450   };
451
452   // Array indicating what events have been recorded for print preview metrics.
453   bool preview_action_recorded_[PDFACTION_BUCKET_BOUNDARY];
454
455   DISALLOW_COPY_AND_ASSIGN(OutOfProcessInstance);
456 };
457
458 }  // namespace chrome_pdf
459
460 #endif  // PDF_OUT_OF_PROCESS_INSTANCE_H_