Home | History | Annotate | Download | only in pdf
      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_PDF_ENGINE_H_
      6 #define PDF_PDF_ENGINE_H_
      7 
      8 #include "build/build_config.h"
      9 
     10 #if defined(OS_WIN)
     11 #include <windows.h>
     12 #endif
     13 
     14 #include <string>
     15 #include <vector>
     16 
     17 #include "base/strings/string16.h"
     18 
     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 
     28 namespace pp {
     29 class InputEvent;
     30 }
     31 
     32 const uint32 kBackgroundColor = 0xFFCCCCCC;
     33 
     34 namespace chrome_pdf {
     35 
     36 class Stream;
     37 
     38 #if defined(OS_MACOSX)
     39 const uint32 kDefaultKeyModifier = PP_INPUTEVENT_MODIFIER_METAKEY;
     40 #else  // !OS_MACOSX
     41 const uint32 kDefaultKeyModifier = PP_INPUTEVENT_MODIFIER_CONTROLKEY;
     42 #endif  // OS_MACOSX
     43 
     44 // Do one time initialization of the SDK.  data is platform specific, on Windows
     45 // it's the instance of the DLL and it's unused on other platforms.
     46 bool InitializeSDK(void* data);
     47 // Tells the SDK that we're shutting down.
     48 void ShutdownSDK();
     49 
     50 // This class encapsulates a PDF rendering engine.
     51 class PDFEngine {
     52  public:
     53 
     54   enum DocumentPermission {
     55     PERMISSION_COPY,
     56     PERMISSION_COPY_ACCESSIBLE,
     57     PERMISSION_PRINT_LOW_QUALITY,
     58     PERMISSION_PRINT_HIGH_QUALITY,
     59   };
     60 
     61   // The interface that's provided to the rendering engine.
     62   class Client {
     63    public:
     64     // Informs the client about the document's size in pixels.
     65     virtual void DocumentSizeUpdated(const pp::Size& size) = 0;
     66 
     67     // Informs the client that the given rect needs to be repainted.
     68     virtual void Invalidate(const pp::Rect& rect) = 0;
     69 
     70     // Informs the client to scroll the plugin area by the given offset.
     71     virtual void Scroll(const pp::Point& point) = 0;
     72 
     73     // Scroll the horizontal/vertical scrollbars to a given position.
     74     virtual void ScrollToX(int position) = 0;
     75     virtual void ScrollToY(int position) = 0;
     76 
     77     // Scroll to the specified page.
     78     virtual void ScrollToPage(int page) = 0;
     79 
     80     // Navigate to the given url.
     81     virtual void NavigateTo(const std::string& url, bool open_in_new_tab) = 0;
     82 
     83     // Updates the cursor.
     84     virtual void UpdateCursor(PP_CursorType_Dev cursor) = 0;
     85 
     86     // Updates the tick marks in the vertical scrollbar.
     87     virtual void UpdateTickMarks(const std::vector<pp::Rect>& tickmarks) = 0;
     88 
     89     // Updates the number of find results for the current search term.  If
     90     // there are no matches 0 should be passed in.  Only when the plugin has
     91     // finished searching should it pass in the final count with final_result
     92     // set to true.
     93     virtual void NotifyNumberOfFindResultsChanged(int total,
     94                                                   bool final_result) = 0;
     95 
     96     // Updates the index of the currently selected search item.
     97     virtual void NotifySelectedFindResultChanged(int current_find_index) = 0;
     98 
     99     // Prompts the user for a password to open this document. The callback is
    100     // called when the password is retrieved.
    101     virtual void GetDocumentPassword(
    102         pp::CompletionCallbackWithOutput<pp::Var> callback) = 0;
    103 
    104     // Puts up an alert with the given message.
    105     virtual void Alert(const std::string& message) = 0;
    106 
    107     // Puts up a confirm with the given message, and returns true if the user
    108     // presses OK, or false if they press cancel.
    109     virtual bool Confirm(const std::string& message) = 0;
    110 
    111     // Puts up a prompt with the given message and default answer and returns
    112     // the answer.
    113     virtual std::string Prompt(const std::string& question,
    114                                const std::string& default_answer) = 0;
    115 
    116     // Returns the url of the pdf.
    117     virtual std::string GetURL() = 0;
    118 
    119     // Send an email.
    120     virtual void Email(const std::string& to,
    121                        const std::string& cc,
    122                        const std::string& bcc,
    123                        const std::string& subject,
    124                        const std::string& body) = 0;
    125 
    126     // Put up the print dialog.
    127     virtual void Print() = 0;
    128 
    129     // Submit the data using HTTP POST.
    130     virtual void SubmitForm(const std::string& url,
    131                             const void* data,
    132                             int length) = 0;
    133 
    134     // Pops up a file selection dialog and returns the result.
    135     virtual std::string ShowFileSelectionDialog() = 0;
    136 
    137     // Creates and returns new URL loader for partial document requests.
    138     virtual pp::URLLoader CreateURLLoader() = 0;
    139 
    140     // Calls the client's OnCallback() function in delay_in_ms with the given
    141     // id.
    142     virtual void ScheduleCallback(int id, int delay_in_ms) = 0;
    143 
    144     // Searches the given string for "term" and returns the results.  Unicode-
    145     // aware.
    146     struct SearchStringResult {
    147       int start_index;
    148       int length;
    149     };
    150     virtual void SearchString(const base::char16* string,
    151                               const base::char16* term,
    152                               bool case_sensitive,
    153                               std::vector<SearchStringResult>* results) = 0;
    154 
    155     // Notifies the client that the engine has painted a page from the document.
    156     virtual void DocumentPaintOccurred() = 0;
    157 
    158     // Notifies the client that the document has finished loading.
    159     virtual void DocumentLoadComplete(int page_count) = 0;
    160 
    161     // Notifies the client that the document has failed to load.
    162     virtual void DocumentLoadFailed() = 0;
    163 
    164     virtual pp::Instance* GetPluginInstance() = 0;
    165 
    166     // Notifies that an unsupported feature in the PDF was encountered.
    167     virtual void DocumentHasUnsupportedFeature(const std::string& feature) = 0;
    168 
    169     // Notifies the client about document load progress.
    170     virtual void DocumentLoadProgress(uint32 available, uint32 doc_size) = 0;
    171 
    172     // Notifies the client about focus changes for form text fields.
    173     virtual void FormTextFieldFocusChange(bool in_focus) = 0;
    174 
    175     // Returns true if the plugin has been opened within print preview.
    176     virtual bool IsPrintPreview() = 0;
    177   };
    178 
    179   // Factory method to create an instance of the PDF Engine.
    180   static PDFEngine* Create(Client* client);
    181 
    182   virtual ~PDFEngine() {}
    183   // Most of these functions are similar to the Pepper functions of the same
    184   // name, so not repeating the description here unless it's different.
    185   virtual bool New(const char* url) = 0;
    186   virtual bool New(const char* url,
    187                    const char* headers) = 0;
    188   virtual void PageOffsetUpdated(const pp::Point& page_offset) = 0;
    189   virtual void PluginSizeUpdated(const pp::Size& size) = 0;
    190   virtual void ScrolledToXPosition(int position) = 0;
    191   virtual void ScrolledToYPosition(int position) = 0;
    192   // Paint is called a series of times. Before these n calls are made, PrePaint
    193   // is called once. After Paint is called n times, PostPaint is called once.
    194   virtual void PrePaint() = 0;
    195   virtual void Paint(const pp::Rect& rect,
    196                      pp::ImageData* image_data,
    197                      std::vector<pp::Rect>* ready,
    198                      std::vector<pp::Rect>* pending) = 0;
    199   virtual void PostPaint() = 0;
    200   virtual bool HandleDocumentLoad(const pp::URLLoader& loader) = 0;
    201   virtual bool HandleEvent(const pp::InputEvent& event) = 0;
    202   virtual uint32_t QuerySupportedPrintOutputFormats() = 0;
    203   virtual void PrintBegin() = 0;
    204   virtual pp::Resource PrintPages(
    205       const PP_PrintPageNumberRange_Dev* page_ranges,
    206       uint32_t page_range_count,
    207       const PP_PrintSettings_Dev& print_settings) = 0;
    208   virtual void PrintEnd() = 0;
    209   virtual void StartFind(const char* text, bool case_sensitive) = 0;
    210   virtual bool SelectFindResult(bool forward) = 0;
    211   virtual void StopFind() = 0;
    212   virtual void ZoomUpdated(double new_zoom_level) = 0;
    213   virtual void RotateClockwise() = 0;
    214   virtual void RotateCounterclockwise() = 0;
    215   virtual std::string GetSelectedText() = 0;
    216   virtual std::string GetLinkAtPosition(const pp::Point& point) = 0;
    217   virtual bool IsSelecting() = 0;
    218   // Checks the permissions associated with this document.
    219   virtual bool HasPermission(DocumentPermission permission) const = 0;
    220   virtual void SelectAll() = 0;
    221   // Gets the number of pages in the document.
    222   virtual int GetNumberOfPages() = 0;
    223   // Gets the 0-based page number of |destination|, or -1 if it does not exist.
    224   virtual int GetNamedDestinationPage(const std::string& destination) = 0;
    225   // Gets the index of the first visible page, or -1 if none are visible.
    226   virtual int GetFirstVisiblePage() = 0;
    227   // Gets the index of the most visible page, or -1 if none are visible.
    228   virtual int GetMostVisiblePage() = 0;
    229   // Gets the rectangle of the page including shadow.
    230   virtual pp::Rect GetPageRect(int index) = 0;
    231   // Gets the rectangle of the page excluding any additional areas.
    232   virtual pp::Rect GetPageContentsRect(int index) = 0;
    233   // Gets the offset of the vertical scrollbar from the top in document
    234   // coordinates.
    235   virtual int GetVerticalScrollbarYPosition() = 0;
    236   // Paints page thumbnail to the ImageData.
    237   virtual void PaintThumbnail(pp::ImageData* image_data, int index) = 0;
    238   // Set color / grayscale rendering modes.
    239   virtual void SetGrayscale(bool grayscale) = 0;
    240   // Callback for timer that's set with ScheduleCallback().
    241   virtual void OnCallback(int id) = 0;
    242   // Gets the JSON representation of the PDF file
    243   virtual std::string GetPageAsJSON(int index) = 0;
    244   // Gets the PDF document's print scaling preference. True if the document can
    245   // be scaled to fit.
    246   virtual bool GetPrintScaling() = 0;
    247 
    248   // Append blank pages to make a 1-page document to a |num_pages| document.
    249   // Always retain the first page data.
    250   virtual void AppendBlankPages(int num_pages) = 0;
    251   // Append the first page of the document loaded with the |engine| to this
    252   // document at page |index|.
    253   virtual void AppendPage(PDFEngine* engine, int index) = 0;
    254 
    255   // Allow client to query and reset scroll positions in document coordinates.
    256   // Note that this is meant for cases where the device scale factor changes,
    257   // and not for general scrolling - the engine will not repaint due to this.
    258   virtual pp::Point GetScrollPosition() = 0;
    259   virtual void SetScrollPosition(const pp::Point& position) = 0;
    260 
    261   virtual bool IsProgressiveLoad() = 0;
    262 };
    263 
    264 // Interface for exports that wrap the PDF engine.
    265 class PDFEngineExports {
    266  public:
    267   struct RenderingSettings {
    268    RenderingSettings(int dpi_x,
    269                      int dpi_y,
    270                      const pp::Rect& bounds,
    271                      bool fit_to_bounds,
    272                      bool stretch_to_bounds,
    273                      bool keep_aspect_ratio,
    274                      bool center_in_bounds,
    275                      bool autorotate)
    276       : dpi_x(dpi_x), dpi_y(dpi_y), bounds(bounds),
    277         fit_to_bounds(fit_to_bounds), stretch_to_bounds(stretch_to_bounds),
    278         keep_aspect_ratio(keep_aspect_ratio),
    279         center_in_bounds(center_in_bounds), autorotate(autorotate) {
    280     }
    281     int dpi_x;
    282     int dpi_y;
    283     pp::Rect bounds;
    284     bool fit_to_bounds;
    285     bool stretch_to_bounds;
    286     bool keep_aspect_ratio;
    287     bool center_in_bounds;
    288     bool autorotate;
    289   };
    290 
    291   PDFEngineExports() {}
    292   virtual ~PDFEngineExports() {}
    293   static PDFEngineExports* Create();
    294 #if defined(OS_WIN)
    295   // See the definition of RenderPDFPageToDC in pdf.cc for details.
    296   virtual bool RenderPDFPageToDC(const void* pdf_buffer,
    297                                  int buffer_size,
    298                                  int page_number,
    299                                  const RenderingSettings& settings,
    300                                  HDC dc) = 0;
    301 #endif  // OS_WIN
    302   // See the definition of RenderPDFPageToBitmap in pdf.cc for details.
    303   virtual bool RenderPDFPageToBitmap(const void* pdf_buffer,
    304                                      int pdf_buffer_size,
    305                                      int page_number,
    306                                      const RenderingSettings& settings,
    307                                      void* bitmap_buffer) = 0;
    308 
    309   virtual bool GetPDFDocInfo(const void* pdf_buffer,
    310                              int buffer_size,
    311                              int* page_count,
    312                              double* max_page_width) = 0;
    313 
    314   // See the definition of GetPDFPageSizeByIndex in pdf.cc for details.
    315   virtual bool GetPDFPageSizeByIndex(const void* pdf_buffer,
    316                                      int pdf_buffer_size, int page_number,
    317                                      double* width, double* height) = 0;
    318 };
    319 
    320 }  // namespace chrome_pdf
    321 
    322 #endif  // PDF_PDF_ENGINE_H_
    323