1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/instance.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <algorithm> // for min() 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define _USE_MATH_DEFINES // for M_PI 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <cmath> // for log() and pow() 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <math.h> 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <list> 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/json/json_reader.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/json/json_writer.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_split.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_util.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/values.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chrome_page_zoom_constants.h" 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/common/content_restriction.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/public/common/page_zoom.h" 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/base/escape.h" 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/draw_utils.h" 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/number_image_generator.h" 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/pdf.h" 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "pdf/resource_consts.h" 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/c/dev/ppb_cursor_control_dev.h" 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/c/pp_errors.h" 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/c/pp_rect.h" 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/c/private/ppp_pdf.h" 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/c/trusted/ppb_url_loader_trusted.h" 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/cpp/core.h" 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/cpp/dev/font_dev.h" 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/cpp/dev/memory_dev.h" 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/cpp/dev/text_input_dev.h" 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/cpp/module.h" 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/cpp/point.h" 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/cpp/private/pdf.h" 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/cpp/rect.h" 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/cpp/resource.h" 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ppapi/cpp/url_request_info.h" 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h" 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_MACOSX) 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/mac/mac_util.h" 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace chrome_pdf { 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)struct ToolbarButtonInfo { 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32 id; 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Button::ButtonStyle style; 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_ResourceImage normal; 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_ResourceImage highlighted; 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_ResourceImage pressed; 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Uncomment following #define to enable thumbnails. 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// #define ENABLE_THUMBNAILS 63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kToolbarSplashTimeoutMs = 6000; 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kMessageTextColor = 0xFF575757; 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kMessageTextSize = 22; 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kProgressFadeTimeoutMs = 250; 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kProgressDelayTimeoutMs = 1000; 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const uint32 kAutoScrollTimeoutMs = 50; 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const double kAutoScrollFactor = 0.2; 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Javascript methods. 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSAccessibility[] = "accessibility"; 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSDocumentLoadComplete[] = "documentLoadComplete"; 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSGetHeight[] = "getHeight"; 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSGetHorizontalScrollbarThickness[] = 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "getHorizontalScrollbarThickness"; 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSGetPageLocationNormalized[] = "getPageLocationNormalized"; 7934680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)const char kJSGetSelectedText[] = "getSelectedText"; 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSGetVerticalScrollbarThickness[] = "getVerticalScrollbarThickness"; 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSGetWidth[] = "getWidth"; 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSGetZoomLevel[] = "getZoomLevel"; 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSGoToPage[] = "goToPage"; 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSGrayscale[] = "grayscale"; 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSLoadPreviewPage[] = "loadPreviewPage"; 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSOnLoad[] = "onload"; 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSOnPluginSizeChanged[] = "onPluginSizeChanged"; 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSOnScroll[] = "onScroll"; 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSPageXOffset[] = "pageXOffset"; 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSPageYOffset[] = "pageYOffset"; 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSPrintPreviewPageCount[] = "printPreviewPageCount"; 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSReload[] = "reload"; 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSRemovePrintButton[] = "removePrintButton"; 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSResetPrintPreviewUrl[] = "resetPrintPreviewUrl"; 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSSendKeyEvent[] = "sendKeyEvent"; 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSSetPageNumbers[] = "setPageNumbers"; 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSSetPageXOffset[] = "setPageXOffset"; 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSSetPageYOffset[] = "setPageYOffset"; 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSSetZoomLevel[] = "setZoomLevel"; 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSZoomFitToHeight[] = "fitToHeight"; 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSZoomFitToWidth[] = "fitToWidth"; 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSZoomIn[] = "zoomIn"; 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kJSZoomOut[] = "zoomOut"; 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// URL reference parameters. 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// For more possible parameters, see RFC 3778 and the "PDF Open Parameters" 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// document from Adobe. 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kDelimiters[] = "#&"; 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kNamedDest[] = "nameddest"; 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kPage[] = "page"; 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kChromePrint[] = "chrome://print/"; 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Dictionary Value key names for the document accessibility info 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kAccessibleNumberOfPages[] = "numberOfPages"; 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kAccessibleLoaded[] = "loaded"; 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kAccessibleCopyable[] = "copyable"; 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const ToolbarButtonInfo kPDFToolbarButtons[] = { 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kFitToPageButtonId, Button::BUTTON_STATE, 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTP, 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTP_HOVER, 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTP_PRESSED }, 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kFitToWidthButtonId, Button::BUTTON_STATE, 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTW, 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTW_HOVER, 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTW_PRESSED }, 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kZoomOutButtonId, Button::BUTTON_CLICKABLE, 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMOUT, 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMOUT_HOVER, 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMOUT_PRESSED }, 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kZoomInButtonId, Button::BUTTON_CLICKABLE, 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN, 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN_HOVER, 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN_PRESSED }, 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kSaveButtonId, Button::BUTTON_CLICKABLE, 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_SAVE, 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_SAVE_HOVER, 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_SAVE_PRESSED }, 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kPrintButtonId, Button::BUTTON_CLICKABLE, 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_PRINT, 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_PRINT_HOVER, 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_PRINT_PRESSED }, 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const ToolbarButtonInfo kPDFNoPrintToolbarButtons[] = { 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kFitToPageButtonId, Button::BUTTON_STATE, 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTP, 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTP_HOVER, 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTP_PRESSED }, 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kFitToWidthButtonId, Button::BUTTON_STATE, 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTW, 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTW_HOVER, 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTW_PRESSED }, 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kZoomOutButtonId, Button::BUTTON_CLICKABLE, 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMOUT, 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMOUT_HOVER, 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMOUT_PRESSED }, 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kZoomInButtonId, Button::BUTTON_CLICKABLE, 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN, 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN_HOVER, 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN_PRESSED }, 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kSaveButtonId, Button::BUTTON_CLICKABLE, 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_SAVE, 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_SAVE_HOVER, 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_SAVE_PRESSED }, 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kPrintButtonId, Button::BUTTON_CLICKABLE, 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_PRINT_DISABLED, 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_PRINT_DISABLED, 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_PRINT_DISABLED } 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const ToolbarButtonInfo kPrintPreviewToolbarButtons[] = { 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kFitToPageButtonId, Button::BUTTON_STATE, 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTP, 176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTP_HOVER, 177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTP_PRESSED }, 178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kFitToWidthButtonId, Button::BUTTON_STATE, 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTW, 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTW_HOVER, 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_FTW_PRESSED }, 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kZoomOutButtonId, Button::BUTTON_CLICKABLE, 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMOUT, 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMOUT_HOVER, 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMOUT_PRESSED }, 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { kZoomInButtonId, Button::BUTTON_CLICKABLE, 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN_END, 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN_END_HOVER, 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_ZOOMIN_END_PRESSED }, 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)static const char kPPPPdfInterface[] = PPP_PDF_INTERFACE_1; 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PP_Var GetLinkAtPosition(PP_Instance instance, PP_Point point) { 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Var var; 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void* object = 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Instance::GetPerInstanceObject(instance, kPPPPdfInterface); 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (object) 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) var = static_cast<Instance*>(object)->GetLinkAtPosition(pp::Point(point)); 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return var.Detach(); 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Transform(PP_Instance instance, PP_PrivatePageTransformType type) { 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void* object = 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Instance::GetPerInstanceObject(instance, kPPPPdfInterface); 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (object) { 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Instance* obj_instance = static_cast<Instance*>(object); 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (type) { 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW: 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) obj_instance->RotateClockwise(); 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CCW: 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) obj_instance->RotateCounterclockwise(); 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const PPP_Pdf ppp_private = { 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &GetLinkAtPosition, 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &Transform 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int ExtractPrintPreviewPageIndex(const std::string& src_url) { 225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Sample |src_url| format: chrome://print/id/page_index/print.pdf 226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string> url_substr; 227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::SplitString(src_url.substr(strlen(kChromePrint)), '/', &url_substr); 228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (url_substr.size() != 3) 229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return -1; 230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (url_substr[2] != "print.pdf") 232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return -1; 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int page_index = 0; 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!base::StringToInt(url_substr[1], &page_index)) 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return -1; 237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return page_index; 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool IsPrintPreviewUrl(const std::string& url) { 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return url.substr(0, strlen(kChromePrint)) == kChromePrint; 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ScalePoint(float scale, pp::Point* point) { 245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) point->set_x(static_cast<int>(point->x() * scale)); 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) point->set_y(static_cast<int>(point->y() * scale)); 247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ScaleRect(float scale, pp::Rect* rect) { 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int left = static_cast<int>(floorf(rect->x() * scale)); 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int top = static_cast<int>(floorf(rect->y() * scale)); 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int right = static_cast<int>(ceilf((rect->x() + rect->width()) * scale)); 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int bottom = static_cast<int>(ceilf((rect->y() + rect->height()) * scale)); 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rect->SetRect(left, top, right - left, bottom - top); 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)template<class T> 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)T ClipToRange(T value, T lower_boundary, T upper_boundary) { 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(lower_boundary <= upper_boundary); 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return std::max<T>(lower_boundary, std::min<T>(value, upper_boundary)); 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)Instance::Instance(PP_Instance instance) 266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : pp::InstancePrivate(instance), 267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Find_Private(this), 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Printing_Dev(this), 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Selection_Dev(this), 270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::WidgetClient_Dev(this), 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Zoom_Dev(this), 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cursor_(PP_CURSORTYPE_POINTER), 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) timer_pending_(false), 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_timer_id_(0), 275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) zoom_(1.0), 276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device_scale_(1.0), 277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) printing_enabled_(true), 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) hidpi_enabled_(false), 279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) full_(IsFullFrame()), 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) zoom_mode_(full_ ? ZOOM_AUTO : ZOOM_SCALE), 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) did_call_start_loading_(false), 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_autoscroll_(false), 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scrollbar_thickness_(-1), 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scrollbar_reserved_thickness_(-1), 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_tb_info_(NULL), 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_tb_info_size_(0), 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_(this, this, true), 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delayed_progress_timer_id_(0), 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) first_paint_(true), 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) painted_first_page_(false), 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) show_page_indicator_(false), 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) document_load_state_(LOAD_STATE_LOADING), 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_document_load_state_(LOAD_STATE_COMPLETE), 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) told_browser_about_unsupported_feature_(false), 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print_preview_page_count_(0) { 296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loader_factory_.Initialize(this); 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) timer_factory_.Initialize(this); 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_factory_.Initialize(this); 2991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_factory_.Initialize(this); 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_.reset(PDFEngine::Create(this)); 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Module::Get()->AddPluginInterface(kPPPPdfInterface, &ppp_private); 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AddPerInstanceObject(kPPPPdfInterface, this); 303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_MOUSE); 305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_WHEEL); 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_KEYBOARD); 307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequestFilteringInputEvents(PP_INPUTEVENT_CLASS_TOUCH); 308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)Instance::~Instance() { 3116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (timer_pending_) { 3126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) timer_factory_.CancelAll(); 3136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) timer_pending_ = false; 3146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The engine may try to access this instance during its destruction. 3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Make sure this happens early while the instance is still intact. 3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) engine_.reset(); 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RemovePerInstanceObject(kPPPPdfInterface, this); 319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool Instance::Init(uint32_t argc, const char* argn[], const char* argv[]) { 322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For now, we hide HiDPI support behind a flag. 323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (pp::PDF::IsFeatureEnabled(this, PP_PDFFEATURE_HIDPI)) 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) hidpi_enabled_ = true; 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) printing_enabled_ = pp::PDF::IsFeatureEnabled(this, PP_PDFFEATURE_PRINTING); 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (printing_enabled_) { 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateToolbar(kPDFToolbarButtons, arraysize(kPDFToolbarButtons)); 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateToolbar(kPDFNoPrintToolbarButtons, 331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) arraysize(kPDFNoPrintToolbarButtons)); 332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateProgressBar(); 335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Load autoscroll anchor image. 337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_anchor_ = 338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateResourceImage(PP_RESOURCEIMAGE_PDF_PAN_SCROLL_ICON); 339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateThumbnails(); 342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char* url = NULL; 344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (uint32_t i = 0; i < argc; ++i) { 345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (strcmp(argn[i], "src") == 0) { 346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url = argv[i]; 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!url) 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreatePageIndicator(IsPrintPreviewUrl(url)); 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!full_) { 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For PDFs embedded in a frame, we don't get the data automatically like we 358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // do for full-frame loads. Start loading the data manually. 359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadUrl(url); 360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } else { 361116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DCHECK(!did_call_start_loading_); 362116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pp::PDF::DidStartLoading(this); 363116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch did_call_start_loading_ = true; 364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ZoomLimitsChanged(kMinZoom, kMaxZoom); 367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) text_input_.reset(new pp::TextInput_Dev(this)); 369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url_ = url; 371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return engine_->New(url); 372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool Instance::HandleDocumentLoad(const pp::URLLoader& loader) { 375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delayed_progress_timer_id_ = ScheduleTimer(kProgressBarId, 376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kProgressDelayTimeoutMs); 377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return engine_->HandleDocumentLoad(loader); 378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool Instance::HandleInputEvent(const pp::InputEvent& event) { 381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // To simplify things, convert the event into device coordinates if it is 382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // a mouse event. 383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::InputEvent event_device_res(event); 384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) { 385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::MouseInputEvent mouse_event(event); 386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!mouse_event.is_null()) { 387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point point = mouse_event.GetPosition(); 388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point movement = mouse_event.GetMovement(); 389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScalePoint(device_scale_, &point); 390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScalePoint(device_scale_, &movement); 391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event = pp::MouseInputEvent( 392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this, 393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event.GetType(), 394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event.GetTimeStamp(), 395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event.GetModifiers(), 396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetButton(), 397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) point, 398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetClickCount(), 399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) movement); 400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event_device_res = mouse_event; 401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Check if we need to go to autoscroll mode. 405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (event.GetType() == PP_INPUTEVENT_TYPE_MOUSEMOVE && 406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (event.GetModifiers() & PP_INPUTEVENT_MODIFIER_MIDDLEBUTTONDOWN)) { 407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::MouseInputEvent mouse_event(event_device_res); 408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point pos = mouse_event.GetPosition(); 409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EnableAutoscroll(pos); 410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateCursor(CalculateAutoscroll(pos)); 411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Quit autoscrolling on any other event. 414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DisableAutoscroll(); 415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (event.GetType() == PP_INPUTEVENT_TYPE_MOUSELEAVE) 419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_.SlideOut(); 420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (thumbnails_.HandleEvent(event_device_res)) 422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (toolbar_->HandleEvent(event_device_res)) 426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get() && event.GetType() == PP_INPUTEVENT_TYPE_MOUSEMOVE) { 430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::MouseInputEvent mouse_event(event); 431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point pt = mouse_event.GetPosition(); 432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect v_scrollbar_rc; 433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->GetLocation(&v_scrollbar_rc); 434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // There is a bug (https://bugs.webkit.org/show_bug.cgi?id=45208) 435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // in the webkit that makes event.u.mouse.button 436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // equal to PP_INPUTEVENT_MOUSEBUTTON_LEFT, even when no button is pressed. 437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // To work around this issue we use modifier for now, and will switch 438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // to button once the bug is fixed and webkit got merged back to our tree. 439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_rc.Contains(pt) && 440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (event.GetModifiers() & PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN)) { 441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_.SlideIn(); 442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // When scrollbar is in the scrolling mode we should display thumbnails 445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // even the mouse is outside the thumbnail and scrollbar areas. 446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If mouse is outside plugin area, we are still getting mouse move events 447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // while scrolling. See bug description for details: 448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // http://code.google.com/p/chromium/issues/detail?id=56444 449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!v_scrollbar_rc.Contains(pt) && thumbnails_.visible() && 450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !(event.GetModifiers() & PP_INPUTEVENT_MODIFIER_LEFTBUTTONDOWN) && 451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !thumbnails_.rect().Contains(pt)) { 452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_.SlideOut(); 453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Need to pass the event to the engine first, since if we're over an edit 458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // control we want it to get keyboard events (like space) instead of the 459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // scrollbar. 460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO: will have to offset the mouse coordinates once we support bidi and 461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // there could be scrollbars on the left. 462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::InputEvent offset_event(event_device_res); 463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool try_engine_first = true; 464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (offset_event.GetType()) { 465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEDOWN: 466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEUP: 467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEMOVE: 468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSEENTER: 469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case PP_INPUTEVENT_TYPE_MOUSELEAVE: { 470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::MouseInputEvent mouse_event(event_device_res); 471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::MouseInputEvent mouse_event_dip(event); 472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point point = mouse_event.GetPosition(); 473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) point.set_x(point.x() - available_area_.x()); 474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) offset_event = pp::MouseInputEvent( 475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this, 476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event.GetType(), 477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event.GetTimeStamp(), 478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event.GetModifiers(), 479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetButton(), 480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) point, 481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetClickCount(), 482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetMovement()); 483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!engine_->IsSelecting()) { 484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!IsOverlayScrollbar() && 485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !available_area_.Contains(mouse_event.GetPosition())) { 486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) try_engine_first = false; 487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (IsOverlayScrollbar()) { 488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect temp; 489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((v_scrollbar_.get() && v_scrollbar_->GetLocation(&temp) && 490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) temp.Contains(mouse_event_dip.GetPosition())) || 491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (h_scrollbar_.get() && h_scrollbar_->GetLocation(&temp) && 492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) temp.Contains(mouse_event_dip.GetPosition()))) { 493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) try_engine_first = false; 494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (try_engine_first && engine_->HandleEvent(offset_event)) 503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Left/Right arrows should scroll to the beginning of the Prev/Next page if 506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // there is no horizontal scroll bar. 507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If fit-to-height, PgDown/PgUp should scroll to the beginning of the 5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Prev/Next page. Spacebar / shift+spacebar should do the same. 509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get() && event.GetType() == PP_INPUTEVENT_TYPE_KEYDOWN) { 510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::KeyboardInputEvent keyboard_event(event); 5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool no_h_scrollbar = !h_scrollbar_.get(); 5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) uint32_t key_code = keyboard_event.GetKeyCode(); 5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool page_down = no_h_scrollbar && key_code == ui::VKEY_RIGHT; 5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool page_up = no_h_scrollbar && key_code == ui::VKEY_LEFT; 5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (zoom_mode_ == ZOOM_FIT_TO_PAGE) { 5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool has_shift = 5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) keyboard_event.GetModifiers() & PP_INPUTEVENT_MODIFIER_SHIFTKEY; 5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) bool key_is_space = key_code == ui::VKEY_SPACE; 5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) page_down |= key_is_space || key_code == ui::VKEY_NEXT; 5205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) page_up |= (key_is_space && has_shift) || (key_code == ui::VKEY_PRIOR); 5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (page_down) { 523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int page = engine_->GetFirstVisiblePage(); 5241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (page == -1) 5251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Engine calculates visible page including delimiter to the page size. 527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We need to check here if the page itself is completely out of view and 528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // scroll to the next one in that case. 529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (engine_->GetPageRect(page).bottom() * zoom_ <= 530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->GetValue()) 531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page++; 532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScrollToPage(page + 1); 533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateCursor(PP_CURSORTYPE_POINTER); 534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (page_up) { 536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int page = engine_->GetFirstVisiblePage(); 5371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (page == -1) 5381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (engine_->GetPageRect(page).y() * zoom_ >= v_scrollbar_->GetValue()) 540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page--; 541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScrollToPage(page); 542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateCursor(PP_CURSORTYPE_POINTER); 543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get() && v_scrollbar_->HandleEvent(event)) { 548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateCursor(PP_CURSORTYPE_POINTER); 549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (h_scrollbar_.get() && h_scrollbar_->HandleEvent(event)) { 553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateCursor(PP_CURSORTYPE_POINTER); 554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (timer_pending_ && 558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (event.GetType() == PP_INPUTEVENT_TYPE_MOUSEUP || 559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event.GetType() == PP_INPUTEVENT_TYPE_MOUSEMOVE)) { 560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) timer_factory_.CancelAll(); 561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) timer_pending_ = false; 562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (event.GetType() == PP_INPUTEVENT_TYPE_MOUSEMOVE && 563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->IsSelecting()) { 564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool set_timer = false; 565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::MouseInputEvent mouse_event(event); 566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get() && 567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (mouse_event.GetPosition().y() <= 0 || 568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetPosition().y() >= (plugin_dip_size_.height() - 1))) { 569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->ScrollBy( 570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_SCROLLBY_LINE, mouse_event.GetPosition().y() >= 0 ? 1: -1); 571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) set_timer = true; 572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (h_scrollbar_.get() && 574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (mouse_event.GetPosition().x() <= 0 || 575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetPosition().x() >= (plugin_dip_size_.width() - 1))) { 576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_->ScrollBy(PP_SCROLLBY_LINE, 577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mouse_event.GetPosition().x() >= 0 ? 1: -1); 578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) set_timer = true; 579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (set_timer) { 582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) last_mouse_event_ = pp::MouseInputEvent(event); 583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::CompletionCallback callback = 585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) timer_factory_.NewCallback(&Instance::OnTimerFired); 586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Module::Get()->core()->CallOnMainThread(kDragTimerMs, callback); 587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) timer_pending_ = true; 588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event.GetType() == PP_INPUTEVENT_TYPE_KEYDOWN) { 592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::KeyboardInputEvent keyboard_event(event); 5931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const uint32 modifier = event.GetModifiers(); 5941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (modifier & kDefaultKeyModifier) { 5951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (keyboard_event.GetKeyCode()) { 5961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case 'A': 5971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci engine_->SelectAll(); 5981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 5991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 6001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } else if (modifier & PP_INPUTEVENT_MODIFIER_CONTROLKEY) { 6011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (keyboard_event.GetKeyCode()) { 6021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::VKEY_OEM_4: 6031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Left bracket. 6041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci engine_->RotateCounterclockwise(); 6051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 6061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case ui::VKEY_OEM_6: 6071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Right bracket. 6081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci engine_->RotateClockwise(); 6091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return true; 6101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Return true for unhandled clicks so the plugin takes focus. 615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return (event.GetType() == PP_INPUTEVENT_TYPE_MOUSEDOWN); 616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DidChangeView(const pp::View& view) { 619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect view_rect(view.GetRect()); 620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) float device_scale = 1.0f; 621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) float old_device_scale = device_scale_; 622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (hidpi_enabled_) 623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device_scale = view.GetDeviceScale(); 624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Size view_device_size(view_rect.width() * device_scale, 625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) view_rect.height() * device_scale); 626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (view_device_size == plugin_size_ && device_scale == device_scale_) 627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; // We don't care about the position, only the size. 628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) image_data_ = pp::ImageData(); 630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device_scale_ = device_scale; 631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_dip_size_ = view_rect.size(); 632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_size_ = view_device_size; 633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.SetSize(view_device_size, device_scale_); 635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) image_data_ = pp::ImageData(this, 637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_IMAGEDATAFORMAT_BGRA_PREMUL, 638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_size_, 639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false); 640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (image_data_.is_null()) { 641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(plugin_size_.IsEmpty()); 642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // View dimensions changed, disable autoscroll (if it was enabled). 646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DisableAutoscroll(); 647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnGeometryChanged(zoom_, old_device_scale); 649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::Var Instance::GetInstanceObject() { 652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (instance_object_.is_undefined()) { 653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PDFScriptableObject* object = new PDFScriptableObject(this); 654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The pp::Var takes ownership of object here. 655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) instance_object_ = pp::VarPrivate(this, object); 656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return instance_object_; 659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::Var Instance::GetLinkAtPosition(const pp::Point& point) { 662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point offset_point(point); 663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScalePoint(device_scale_, &offset_point); 664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) offset_point.set_x(offset_point.x() - available_area_.x()); 665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return engine_->GetLinkAtPosition(offset_point); 666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::Var Instance::GetSelectedText(bool html) { 669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (html || !engine_->HasPermission(PDFEngine::PERMISSION_COPY)) 670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return engine_->GetSelectedText(); 672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::InvalidateWidget(pp::Widget_Dev widget, 675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const pp::Rect& dirty_rect) { 676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get() && *v_scrollbar_ == widget) { 677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!image_data_.is_null()) 678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->Paint(dirty_rect.pp_rect(), &image_data_); 679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (h_scrollbar_.get() && *h_scrollbar_ == widget) { 680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!image_data_.is_null()) 681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_->Paint(dirty_rect.pp_rect(), &image_data_); 682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Possible to hit this condition since sometimes the scrollbar codes posts 684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // a task to do something later, and we could have deleted our reference in 685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the meantime. 686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect dirty_rect_scaled = dirty_rect; 690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScaleRect(device_scale_, &dirty_rect_scaled); 691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.InvalidateRect(dirty_rect_scaled); 692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::ScrollbarValueChanged(pp::Scrollbar_Dev scrollbar, 695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32_t value) { 696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) value = GetScaled(value); 697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get() && *v_scrollbar_ == scrollbar) { 698cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->ScrolledToYPosition(value); 699cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect rc; 700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->GetLocation(&rc); 701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32 doc_height = GetDocumentPixelHeight(); 702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) doc_height -= GetScaled(rc.height()); 703cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 704cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (thumbnails_.visible()) { 705cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_.SetPosition(value, doc_height, true); 706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point origin( 709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_size_.width() - page_indicator_.rect().width() - 710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetScaled(GetScrollbarReservedThickness()), 711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.GetYPosition(value, doc_height, plugin_size_.height())); 712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.MoveTo(origin, page_indicator_.visible()); 713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (h_scrollbar_.get() && *h_scrollbar_ == scrollbar) { 714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->ScrolledToXPosition(value); 715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::ScrollbarOverlayChanged(pp::Scrollbar_Dev scrollbar, 719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool overlay) { 720cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scrollbar_reserved_thickness_ = overlay ? 0 : scrollbar_thickness_; 721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnGeometryChanged(zoom_, device_scale_); 722cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 723cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 724cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)uint32_t Instance::QuerySupportedPrintOutputFormats() { 725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return engine_->QuerySupportedPrintOutputFormats(); 726cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 727cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 728cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int32_t Instance::PrintBegin(const PP_PrintSettings_Dev& print_settings) { 729cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For us num_pages is always equal to the number of pages in the PDF 730cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // document irrespective of the printable area. 731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32_t ret = engine_->GetNumberOfPages(); 732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!ret) 733cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0; 734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 735cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32_t supported_formats = engine_->QuerySupportedPrintOutputFormats(); 736cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((print_settings.format & supported_formats) == 0) 737cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return 0; 738cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print_settings_.is_printing = true; 740cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print_settings_.pepper_print_settings = print_settings; 741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->PrintBegin(); 742cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return ret; 743cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 744cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 745cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::Resource Instance::PrintPages( 746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const PP_PrintPageNumberRange_Dev* page_ranges, 747cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) uint32_t page_range_count) { 748cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!print_settings_.is_printing) 749cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Resource(); 750cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 751cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print_settings_.print_pages_called_ = true; 752cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return engine_->PrintPages(page_ranges, page_range_count, 753cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print_settings_.pepper_print_settings); 754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 756cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::PrintEnd() { 757cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (print_settings_.print_pages_called_) 758cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UserMetricsRecordAction("PDF.PrintPage"); 759cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print_settings_.Clear(); 760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->PrintEnd(); 761cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool Instance::IsPrintScalingDisabled() { 764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return !engine_->GetPrintScaling(); 765cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 766cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 767cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool Instance::StartFind(const std::string& text, bool case_sensitive) { 768cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->StartFind(text.c_str(), case_sensitive); 769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 770cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 771cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 772cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::SelectFindResult(bool forward) { 773cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->SelectFindResult(forward); 774cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 775cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 776cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::StopFind() { 777cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->StopFind(); 778cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 779cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 780cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::Zoom(double scale, bool text_only) { 781cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UserMetricsRecordAction("PDF.ZoomFromBrowser"); 782cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetZoom(ZOOM_SCALE, scale); 783cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 784cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 785cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::ZoomChanged(double factor) { 786cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (full_) 787cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Zoom_Dev::ZoomChanged(factor); 788cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 789cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 790cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::OnPaint(const std::vector<pp::Rect>& paint_rects, 791cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<PaintManager::ReadyRect>* ready, 792cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<pp::Rect>* pending) { 793cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (image_data_.is_null()) { 794cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(plugin_size_.IsEmpty()); 795cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 796cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 797cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (first_paint_) { 798cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) first_paint_ = false; 799cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect rect = pp::Rect(pp::Point(), plugin_size_); 800116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FillRect(rect, kBackgroundColor); 801cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ready->push_back(PaintManager::ReadyRect(rect, image_data_, true)); 802cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *pending = paint_rects; 803cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 804cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 805cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 806cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->PrePaint(); 807cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 808cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < paint_rects.size(); i++) { 809cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Intersect with plugin area since there could be pending invalidates from 810cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // when the plugin area was larger. 811cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect rect = 812cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_rects[i].Intersect(pp::Rect(pp::Point(), plugin_size_)); 813cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (rect.IsEmpty()) 814cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) continue; 815cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect pdf_rect = available_area_.Intersect(rect); 817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!pdf_rect.IsEmpty()) { 818cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_rect.Offset(available_area_.x() * -1, 0); 819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 820cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<pp::Rect> pdf_ready; 821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<pp::Rect> pdf_pending; 822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->Paint(pdf_rect, &image_data_, &pdf_ready, &pdf_pending); 823cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t j = 0; j < pdf_ready.size(); ++j) { 824cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_ready[j].Offset(available_area_.point()); 825cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ready->push_back( 826cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PaintManager::ReadyRect(pdf_ready[j], image_data_, false)); 827cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 828cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t j = 0; j < pdf_pending.size(); ++j) { 829cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pdf_pending[j].Offset(available_area_.point()); 830cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pending->push_back(pdf_pending[j]); 831cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 832cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 833cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 834cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t j = 0; j < background_parts_.size(); ++j) { 835cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect intersection = background_parts_[j].location.Intersect(rect); 836cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!intersection.IsEmpty()) { 837cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FillRect(intersection, background_parts_[j].color); 838cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ready->push_back( 839cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PaintManager::ReadyRect(intersection, image_data_, false)); 840cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 841cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 842cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 843cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (document_load_state_ == LOAD_STATE_FAILED) { 844cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point top_center; 845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) top_center.set_x(plugin_size_.width() / 2); 846cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) top_center.set_y(plugin_size_.height() / 2); 847cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DrawText(top_center, PP_RESOURCESTRING_PDFLOAD_FAILED); 848cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 849cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 850cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 851cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_.Paint(&image_data_, rect); 852cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 853cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 854cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 855cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->PostPaint(); 856cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 857cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Must paint scrollbars after the background parts, in case we have an 858cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // overlay scrollbar that's over the background. We also do this in a separate 859cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // loop because the scrollbar painting logic uses the signal of whether there 860cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // are pending paints or not to figure out if it should draw right away or 861cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // not. 862cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < paint_rects.size(); i++) { 863cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PaintIfWidgetIntersects(h_scrollbar_.get(), paint_rects[i], ready, pending); 864cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PaintIfWidgetIntersects(v_scrollbar_.get(), paint_rects[i], ready, pending); 865cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 866cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 867cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (progress_bar_.visible()) 868cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PaintOverlayControl(&progress_bar_, &image_data_, ready); 869cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 870cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (page_indicator_.visible()) 871cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PaintOverlayControl(&page_indicator_, &image_data_, ready); 872cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 873cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (toolbar_->current_transparency() != kTransparentAlpha) 874cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PaintOverlayControl(toolbar_.get(), &image_data_, ready); 875cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 876cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Paint autoscroll anchor if needed. 877cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (is_autoscroll_) { 878cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t limit = ready->size(); 879cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < limit; i++) { 880cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect anchor_rect = autoscroll_rect_.Intersect((*ready)[i].rect); 881cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!anchor_rect.IsEmpty()) { 882cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect draw_rc = pp::Rect( 883cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point(anchor_rect.x() - autoscroll_rect_.x(), 884cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) anchor_rect.y() - autoscroll_rect_.y()), 885cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) anchor_rect.size()); 886cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Paint autoscroll anchor. 887cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AlphaBlend(autoscroll_anchor_, draw_rc, 888cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &image_data_, anchor_rect.point(), kOpaqueAlpha); 889cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 890cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 891cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 892cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 893cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 894cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::PaintOverlayControl( 895cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Control* ctrl, 896cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::ImageData* image_data, 897cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<PaintManager::ReadyRect>* ready) { 898cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Make sure that we only paint overlay controls over an area that's ready, 899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // i.e. not pending. Otherwise we'll mark the control rect as ready and 900cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // it'll overwrite the pdf region. 901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<pp::Rect> ctrl_rects; 902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < ready->size(); i++) { 903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect rc = ctrl->rect().Intersect((*ready)[i].rect); 904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!rc.IsEmpty()) 905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ctrl_rects.push_back(rc); 906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 908cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!ctrl_rects.empty()) { 909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ctrl->PaintMultipleRects(image_data, ctrl_rects); 910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<pp::Rect>::iterator iter; 912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (iter = ctrl_rects.begin(); iter != ctrl_rects.end(); ++iter) { 913cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ready->push_back(PaintManager::ReadyRect(*iter, *image_data, false)); 914cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 915cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 916cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 917cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 918cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DidOpen(int32_t result) { 919cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (result == PP_OK) { 920cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->HandleDocumentLoad(embed_loader_); 921cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (result != PP_ERROR_ABORTED) { // Can happen in tests. 922cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 923cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 924cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 925cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 926cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DidOpenPreview(int32_t result) { 927cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (result == PP_OK) { 928cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_engine_.reset(PDFEngine::Create(new PreviewModeClient(this))); 929cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_engine_->HandleDocumentLoad(embed_preview_loader_); 930cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 931cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 932cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 933cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 934cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 935cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::PaintIfWidgetIntersects( 936cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Widget_Dev* widget, 937cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const pp::Rect& rect, 938cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<PaintManager::ReadyRect>* ready, 939cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<pp::Rect>* pending) { 940cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!widget) 941cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 942cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 943cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect location; 944cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!widget->GetLocation(&location)) 945cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 946cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 947cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScaleRect(device_scale_, &location); 948cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) location = location.Intersect(rect); 949cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (location.IsEmpty()) 950cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 951cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 952cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (IsOverlayScrollbar()) { 953cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If we're using overlay scrollbars, and there are pending paints under the 954cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // scrollbar, don't update the scrollbar instantly. While it would be nice, 955cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // we would need to double buffer the plugin area in order to make this 956cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // work. This is because we'd need to always have a copy of what the pdf 957cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // under the scrollbar looks like, and additionally we couldn't paint the 958cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // pdf under the scrollbar if it's ready until we got the preceding flush. 959cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // So in practice, it would make painting slower and introduce extra buffer 960cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // copies for the general case. 961cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < pending->size(); ++i) { 962cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((*pending)[i].Intersects(location)) 963cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 964cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 965cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 966cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Even if none of the pending paints are under the scrollbar, we never want 967cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // to paint it if it's over the pdf if there are other pending paints. 968cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Otherwise different parts of the pdf plugin would display at different 969cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // scroll offsets. 970cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!pending->empty() && available_area_.Intersects(rect)) { 971cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pending->push_back(location); 972cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 973cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 974cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 975cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 976cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect location_dip = location; 977cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScaleRect(1.0f / device_scale_, &location_dip); 978cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 979cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(!image_data_.is_null()); 980cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) widget->Paint(location_dip, &image_data_); 981cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 982cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ready->push_back(PaintManager::ReadyRect(location, image_data_, true)); 983cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 984cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 985cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::OnTimerFired(int32_t) { 986cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HandleInputEvent(last_mouse_event_); 987cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 988cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 989cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::OnClientTimerFired(int32_t id) { 990cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->OnCallback(id); 991cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 992cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 993cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::OnControlTimerFired(int32_t, 994cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const uint32& control_id, 995cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const uint32& timer_id) { 996cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (control_id == toolbar_->id()) { 997cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) toolbar_->OnTimerFired(timer_id); 998cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (control_id == progress_bar_.id()) { 999cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (timer_id == delayed_progress_timer_id_) { 1000cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (document_load_state_ == LOAD_STATE_LOADING && 1001cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !progress_bar_.visible()) { 1002cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress_bar_.Fade(true, kProgressFadeTimeoutMs); 1003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1004cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) delayed_progress_timer_id_ = 0; 1005cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 1006cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress_bar_.OnTimerFired(timer_id); 1007cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1008cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (control_id == kAutoScrollId) { 1009cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (is_autoscroll_) { 1010cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (autoscroll_x_ != 0 && h_scrollbar_.get()) { 1011cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_->ScrollBy(PP_SCROLLBY_PIXEL, autoscroll_x_); 1012cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1013cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (autoscroll_y_ != 0 && v_scrollbar_.get()) { 1014cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->ScrollBy(PP_SCROLLBY_PIXEL, autoscroll_y_); 1015cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1016cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1017cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Reschedule timer. 1018cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScheduleTimer(kAutoScrollId, kAutoScrollTimeoutMs); 1019cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1020cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (control_id == kPageIndicatorId) { 1021cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.OnTimerFired(timer_id); 1022cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1023cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 1024cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else if (control_id == thumbnails_.id()) { 1025cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_.OnTimerFired(timer_id); 1026cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1027cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 1028cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1029cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1030cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::CalculateBackgroundParts() { 1031cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) background_parts_.clear(); 1032cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int v_scrollbar_thickness = 1033cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetScaled(v_scrollbar_.get() ? GetScrollbarReservedThickness() : 0); 1034cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int h_scrollbar_thickness = 1035cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetScaled(h_scrollbar_.get() ? GetScrollbarReservedThickness() : 0); 1036cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int width_without_scrollbar = std::max( 1037cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_size_.width() - v_scrollbar_thickness, 0); 1038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int height_without_scrollbar = std::max( 1039cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_size_.height() - h_scrollbar_thickness, 0); 1040cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int left_width = available_area_.x(); 1041cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int right_start = available_area_.right(); 1042cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int right_width = abs(width_without_scrollbar - available_area_.right()); 1043cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int bottom = std::min(available_area_.bottom(), height_without_scrollbar); 1044cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1045cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Add the left, right, and bottom rectangles. Note: we assume only 1046cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // horizontal centering. 1047116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch BackgroundPart part = { 1048116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch pp::Rect(0, 0, left_width, bottom), 1049116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kBackgroundColor 1050116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 1051cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!part.location.IsEmpty()) 1052cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) background_parts_.push_back(part); 1053cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) part.location = pp::Rect(right_start, 0, right_width, bottom); 1054cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!part.location.IsEmpty()) 1055cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) background_parts_.push_back(part); 1056cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) part.location = pp::Rect( 1057cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 0, bottom, width_without_scrollbar, height_without_scrollbar - bottom); 1058cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!part.location.IsEmpty()) 1059cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) background_parts_.push_back(part); 1060cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1061cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (h_scrollbar_thickness 1062cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_MACOSX) 1063cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) || 1064cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else 1065cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) && 1066cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 1067cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_thickness) { 1068cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) part.color = 0xFFFFFFFF; 1069cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) part.location = pp::Rect(plugin_size_.width() - v_scrollbar_thickness, 1070cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_size_.height() - h_scrollbar_thickness, 1071cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_thickness, 1072cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_thickness); 1073cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) background_parts_.push_back(part); 1074cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1075cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1076cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1077cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int Instance::GetDocumentPixelWidth() const { 1078cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return static_cast<int>(ceil(document_size_.width() * zoom_ * device_scale_)); 1079cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1080cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1081cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int Instance::GetDocumentPixelHeight() const { 1082cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return static_cast<int>(ceil(document_size_.height() * 1083cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) zoom_ * 1084cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device_scale_)); 1085cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1086cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1087116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid Instance::FillRect(const pp::Rect& rect, uint32 color) { 1088cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(!image_data_.is_null() || rect.IsEmpty()); 1089116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32* buffer_start = static_cast<uint32*>(image_data_.data()); 1090cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int stride = image_data_.stride(); 1091116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch uint32* ptr = buffer_start + rect.y() * stride / 4 + rect.x(); 1092cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int height = rect.height(); 1093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int width = rect.width(); 1094cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (int y = 0; y < height; ++y) { 1095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (int x = 0; x < width; ++x) 1096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *(ptr + x) = color; 1097116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ptr += stride / 4; 1098cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1099cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DocumentSizeUpdated(const pp::Size& size) { 1102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) document_size_ = size; 1103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnGeometryChanged(zoom_, device_scale_); 1105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::Invalidate(const pp::Rect& rect) { 1108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect offset_rect(rect); 1109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) offset_rect.Offset(available_area_.point()); 1110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.InvalidateRect(offset_rect); 1111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::Scroll(const pp::Point& point) { 1114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect scroll_area = available_area_; 1115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (IsOverlayScrollbar()) { 1116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect rc; 1117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (h_scrollbar_.get()) { 1118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_->GetLocation(&rc); 1119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScaleRect(device_scale_, &rc); 1120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (scroll_area.bottom() > rc.y()) { 1121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scroll_area.set_height(rc.y() - scroll_area.y()); 1122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.InvalidateRect(rc); 1123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get()) { 1126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->GetLocation(&rc); 1127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScaleRect(device_scale_, &rc); 1128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (scroll_area.right() > rc.x()) { 1129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scroll_area.set_width(rc.x() - scroll_area.x()); 1130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.InvalidateRect(rc); 1131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.ScrollRect(scroll_area, point); 1135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (toolbar_->current_transparency() != kTransparentAlpha) 1137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.InvalidateRect(toolbar_->GetControlsRect()); 1138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (progress_bar_.visible()) 1140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.InvalidateRect(progress_bar_.rect()); 1141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (is_autoscroll_) 1143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.InvalidateRect(autoscroll_rect_); 1144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (show_page_indicator_) { 1146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.set_current_page(GetPageNumberToDisplay()); 1147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.Splash(); 1148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (page_indicator_.visible()) 1151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.InvalidateRect(page_indicator_.rect()); 1152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 11531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Run the scroll callback asynchronously. This function can be invoked by a 11541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // layout change which should not re-enter into JS synchronously. 11551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pp::CompletionCallback callback = 11561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_factory_.NewCallback(&Instance::RunCallback, 11571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci on_scroll_callback_); 11581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pp::Module::Get()->core()->CallOnMainThread(0, callback); 1159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::ScrollToX(int position) { 1162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!h_scrollbar_.get()) { 1163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 1164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int position_dip = static_cast<int>(position / device_scale_); 1167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_->SetValue(position_dip); 1168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::ScrollToY(int position) { 1171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!v_scrollbar_.get()) { 1172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 1173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int position_dip = static_cast<int>(position / device_scale_); 1176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->SetValue(ClipToRange(position_dip, 0, valid_v_range_)); 1177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::ScrollToPage(int page) { 1180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!v_scrollbar_.get()) 1181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (engine_->GetNumberOfPages() == 0) 1184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int index = ClipToRange(page, 0, engine_->GetNumberOfPages() - 1); 1187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect rect = engine_->GetPageRect(index); 1188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If we are trying to scroll pass the last page, 1189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // scroll to the end of the last page. 1190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int position = index < page ? rect.bottom() : rect.y(); 1191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScrollToY(position * zoom_ * device_scale_); 1192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::NavigateTo(const std::string& url, bool open_in_new_tab) { 1195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string url_copy(url); 1196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Empty |url_copy| is ok, and will effectively be a reload. 1198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Skip the code below so an empty URL does not turn into "http://", which 1199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // will cause GURL to fail a DCHECK. 1200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!url_copy.empty()) { 1201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If |url_copy| starts with '#', then it's for the same URL with a 1202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // different URL fragment. 1203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (url_copy[0] == '#') { 1204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url_copy = url_ + url_copy; 1205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Changing the href does not actually do anything when navigating in the 1206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // same tab, so do the actual page scroll here. Then fall through so the 1207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // href gets updated. 1208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!open_in_new_tab) { 1209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int page_number = GetInitialPage(url_copy); 1210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (page_number >= 0) 1211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ScrollToPage(page_number); 1212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 1214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If there's no scheme, add http. 1215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (url_copy.find("://") == std::string::npos && 1216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url_copy.find("mailto:") == std::string::npos) { 1217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url_copy = "http://" + url_copy; 1218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Make sure |url_copy| starts with a valid scheme. 1220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (url_copy.find("http://") != 0 && 1221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url_copy.find("https://") != 0 && 1222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url_copy.find("ftp://") != 0 && 1223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url_copy.find("file://") != 0 && 1224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url_copy.find("mailto:") != 0) { 1225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Make sure |url_copy| is not only a scheme. 1228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (url_copy == "http://" || 1229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url_copy == "https://" || 1230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url_copy == "ftp://" || 1231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch url_copy == "file://" || 1232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url_copy == "mailto:") { 1233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (open_in_new_tab) { 1237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetWindowObject().Call("open", url_copy); 1238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 1239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetWindowObject().GetProperty("top").GetProperty("location"). 1240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetProperty("href", url_copy); 1241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::UpdateCursor(PP_CursorType_Dev cursor) { 1245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (cursor == cursor_) 1246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cursor_ = cursor; 1248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const PPB_CursorControl_Dev* cursor_interface = 1250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<const PPB_CursorControl_Dev*>( 1251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Module::Get()->GetBrowserInterface(PPB_CURSOR_CONTROL_DEV_INTERFACE)); 1252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!cursor_interface) { 1253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 1254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) cursor_interface->SetCursor( 1258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp_instance(), cursor_, pp::ImageData().pp_resource(), NULL); 1259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::UpdateTickMarks(const std::vector<pp::Rect>& tickmarks) { 1262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!v_scrollbar_.get()) 1263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) float inverse_scale = 1.0f / device_scale_; 1266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<pp::Rect> scaled_tickmarks = tickmarks; 1267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < scaled_tickmarks.size(); i++) { 1268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScaleRect(inverse_scale, &scaled_tickmarks[i]); 1269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->SetTickMarks( 1272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scaled_tickmarks.empty() ? NULL : &scaled_tickmarks[0], tickmarks.size()); 1273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::NotifyNumberOfFindResultsChanged(int total, bool final_result) { 1276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NumberOfFindResultsChanged(total, final_result); 1277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::NotifySelectedFindResultChanged(int current_find_index) { 1280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SelectedFindResultChanged(current_find_index); 1281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::OnEvent(uint32 control_id, uint32 event_id, void* data) { 1284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (event_id == Button::EVENT_ID_BUTTON_CLICKED || 1285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event_id == Button::EVENT_ID_BUTTON_STATE_CHANGED) { 1286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (control_id) { 1287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case kFitToPageButtonId: 1288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UserMetricsRecordAction("PDF.FitToPageButton"); 1289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetZoom(ZOOM_FIT_TO_PAGE, 0); 1290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ZoomChanged(zoom_); 1291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 1292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case kFitToWidthButtonId: 1293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UserMetricsRecordAction("PDF.FitToWidthButton"); 1294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetZoom(ZOOM_FIT_TO_WIDTH, 0); 1295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ZoomChanged(zoom_); 1296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 1297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case kZoomOutButtonId: 1298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case kZoomInButtonId: 1299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UserMetricsRecordAction(control_id == kZoomOutButtonId ? 1300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "PDF.ZoomOutButton" : "PDF.ZoomInButton"); 1301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetZoom(ZOOM_SCALE, CalculateZoom(control_id)); 1302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ZoomChanged(zoom_); 1303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 1304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case kSaveButtonId: 1305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UserMetricsRecordAction("PDF.SaveButton"); 1306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SaveAs(); 1307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 1308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case kPrintButtonId: 1309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UserMetricsRecordAction("PDF.PrintButton"); 1310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Print(); 1311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 1312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (control_id == kThumbnailsId && 1315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) event_id == ThumbnailControl::EVENT_ID_THUMBNAIL_SELECTED) { 1316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int page = *static_cast<int*>(data); 1317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect page_rc(engine_->GetPageRect(page)); 1318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScrollToY(static_cast<int>(page_rc.y() * zoom_ * device_scale_)); 1319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::Invalidate(uint32 control_id, const pp::Rect& rc) { 1323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.InvalidateRect(rc); 1324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)uint32 Instance::ScheduleTimer(uint32 control_id, uint32 timeout_ms) { 1327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_timer_id_++; 1328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::CompletionCallback callback = 1329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) timer_factory_.NewCallback(&Instance::OnControlTimerFired, 1330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) control_id, 1331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_timer_id_); 1332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Module::Get()->core()->CallOnMainThread(timeout_ms, callback); 1333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return current_timer_id_; 1334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::SetEventCapture(uint32 control_id, bool set_capture) { 1337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(gene): set event capture here. 1338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::SetCursor(uint32 control_id, PP_CursorType_Dev cursor_type) { 1341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateCursor(cursor_type); 1342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::Instance* Instance::GetInstance() { 1345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return this; 1346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::GetDocumentPassword( 1349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::CompletionCallbackWithOutput<pp::Var> callback) { 1350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string message(GetLocalizedString(PP_RESOURCESTRING_PDFGETPASSWORD)); 1351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Var result = pp::PDF::ModalPromptForPassword(this, message); 1352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *callback.output() = result.pp_var(); 1353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(PP_OK); 1354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::Alert(const std::string& message) { 1357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetWindowObject().Call("alert", message); 1358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool Instance::Confirm(const std::string& message) { 1361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Var result = GetWindowObject().Call("confirm", message); 1362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return result.is_bool() ? result.AsBool() : false; 1363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string Instance::Prompt(const std::string& question, 1366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& default_answer) { 1367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Var result = GetWindowObject().Call("prompt", question, default_answer); 1368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return result.is_string() ? result.AsString() : std::string(); 1369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string Instance::GetURL() { 1372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return url_; 1373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::Email(const std::string& to, 1376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& cc, 1377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& bcc, 1378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& subject, 1379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& body) { 1380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string javascript = 1381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "var href = 'mailto:" + net::EscapeUrlEncodedData(to, false) + 1382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "?cc=" + net::EscapeUrlEncodedData(cc, false) + 1383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "&bcc=" + net::EscapeUrlEncodedData(bcc, false) + 1384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "&subject=" + net::EscapeUrlEncodedData(subject, false) + 1385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "&body=" + net::EscapeUrlEncodedData(body, false) + 1386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "';var temp = window.open(href, '_blank', " + 1387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "'width=1,height=1');if(temp) temp.close();"; 1388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExecuteScript(javascript); 1389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::Print() { 1392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!printing_enabled_ || 1393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (!engine_->HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY) && 1394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !engine_->HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY))) { 1395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::CompletionCallback callback = 13991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_factory_.NewCallback(&Instance::OnPrint); 1400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Module::Get()->core()->CallOnMainThread(0, callback); 1401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::OnPrint(int32_t) { 1404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::PDF::Print(this); 1405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::SaveAs() { 1408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::PDF::SaveAs(this); 1409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::SubmitForm(const std::string& url, 1412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const void* data, 1413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int length) { 1414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::URLRequestInfo request(this); 1415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) request.SetURL(url); 1416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) request.SetMethod("POST"); 1417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) request.AppendDataToBody(reinterpret_cast<const char*>(data), length); 1418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::CompletionCallback callback = 1420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_factory_.NewCallback(&Instance::FormDidOpen); 1421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) form_loader_ = CreateURLLoaderInternal(); 1422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int rv = form_loader_.Open(request, callback); 1423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (rv != PP_OK_COMPLETIONPENDING) 1424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(rv); 1425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::FormDidOpen(int32_t result) { 1428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO: inform the user of success/failure. 1429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (result != PP_OK) { 1430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 1431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string Instance::ShowFileSelectionDialog() { 1435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Seems like very low priority to implement, since the pdf has no way to get 1436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the file data anyways. Javascript doesn't let you do this synchronously. 1437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 1438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return std::string(); 1439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::URLLoader Instance::CreateURLLoader() { 1442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (full_) { 1443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!did_call_start_loading_) { 1444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) did_call_start_loading_ = true; 1445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::PDF::DidStartLoading(this); 1446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Disable save and print until the document is fully loaded, since they 1449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // would generate an incomplete document. Need to do this each time we 1450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // call DidStartLoading since that resets the content restrictions. 1451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::PDF::SetContentRestriction(this, CONTENT_RESTRICTION_SAVE | 1452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CONTENT_RESTRICTION_PRINT); 1453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return CreateURLLoaderInternal(); 1456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::ScheduleCallback(int id, int delay_in_ms) { 1459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::CompletionCallback callback = 1460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) timer_factory_.NewCallback(&Instance::OnClientTimerFired); 1461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Module::Get()->core()->CallOnMainThread(delay_in_ms, callback, id); 1462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::SearchString(const base::char16* string, 1465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::char16* term, 1466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool case_sensitive, 1467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<SearchStringResult>* results) { 1468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!pp::PDF::IsAvailable()) { 1469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 1470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_PrivateFindResult* pp_results; 1474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int count = 0; 1475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::PDF::SearchString( 1476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this, 1477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<const unsigned short*>(string), 1478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<const unsigned short*>(term), 1479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case_sensitive, 1480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &pp_results, 1481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) &count); 1482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) results->resize(count); 1484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (int i = 0; i < count; ++i) { 1485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (*results)[i].start_index = pp_results[i].start_index; 1486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (*results)[i].length = pp_results[i].length; 1487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Memory_Dev memory; 1490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) memory.MemFree(pp_results); 1491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DocumentPaintOccurred() { 1494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (painted_first_page_) 1495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) painted_first_page_ = true; 1498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateToolbarPosition(false); 1499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) toolbar_->Splash(kToolbarSplashTimeoutMs); 1500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (engine_->GetNumberOfPages() > 1) 1502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) show_page_indicator_ = true; 1503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 1504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) show_page_indicator_ = false; 1505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get() && show_page_indicator_) { 1507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.set_current_page(GetPageNumberToDisplay()); 1508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.Splash(kToolbarSplashTimeoutMs, 1509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kPageIndicatorInitialFadeTimeoutMs); 1510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DocumentLoadComplete(int page_count) { 1514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Clear focus state for OSK. 1515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FormTextFieldFocusChange(false); 1516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Update progress control. 1518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (progress_bar_.visible()) 1519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress_bar_.Fade(false, kProgressFadeTimeoutMs); 1520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(document_load_state_ == LOAD_STATE_LOADING); 1522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) document_load_state_ = LOAD_STATE_COMPLETE; 1523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UserMetricsRecordAction("PDF.LoadSuccess"); 15246e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 15256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (did_call_start_loading_) { 15266e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) pp::PDF::DidStopLoading(this); 15276e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) did_call_start_loading_ = false; 15286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 15296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 1530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (on_load_callback_.is_string()) 1531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExecuteScript(on_load_callback_); 1532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Note: If we are in print preview mode on_load_callback_ might call 1533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // ScrollTo{X|Y}() and we don't want to scroll again and override it. 1534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // #page=N is not supported in Print Preview. 1535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!IsPrintPreview()) { 1536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int initial_page = GetInitialPage(url_); 1537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (initial_page >= 0) 1538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScrollToPage(initial_page); 1539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!full_) 1542cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1543cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!pp::PDF::IsAvailable()) 1544cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1545cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1546cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int content_restrictions = 1547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CONTENT_RESTRICTION_CUT | CONTENT_RESTRICTION_PASTE; 1548cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!engine_->HasPermission(PDFEngine::PERMISSION_COPY)) 1549cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content_restrictions |= CONTENT_RESTRICTION_COPY; 1550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!engine_->HasPermission(PDFEngine::PERMISSION_PRINT_LOW_QUALITY) && 1552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) !engine_->HasPermission(PDFEngine::PERMISSION_PRINT_HIGH_QUALITY)) { 1553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) printing_enabled_ = false; 1554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (current_tb_info_ == kPDFToolbarButtons) { 1555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Remove Print button. 1556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateToolbar(kPDFNoPrintToolbarButtons, 1557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) arraysize(kPDFNoPrintToolbarButtons)); 1558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateToolbarPosition(false); 1559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Invalidate(pp::Rect(plugin_size_)); 1560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::PDF::SetContentRestriction(this, content_restrictions); 1564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::PDF::HistogramPDFPageCount(this, page_count); 1566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::RotateClockwise() { 1569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->RotateClockwise(); 1570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::RotateCounterclockwise() { 1573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->RotateCounterclockwise(); 1574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::PreviewDocumentLoadComplete() { 1577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (preview_document_load_state_ != LOAD_STATE_LOADING || 1578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_pages_info_.empty()) { 1579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_document_load_state_ = LOAD_STATE_COMPLETE; 1583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int dest_page_index = preview_pages_info_.front().second; 1585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int src_page_index = 1586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExtractPrintPreviewPageIndex(preview_pages_info_.front().first); 1587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (src_page_index > 0 && dest_page_index > -1 && preview_engine_.get()) 1588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->AppendPage(preview_engine_.get(), dest_page_index); 1589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_pages_info_.pop(); 1591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |print_preview_page_count_| is not updated yet. Do not load any 1592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // other preview pages till we get this information. 1593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (print_preview_page_count_ == 0) 1594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (preview_pages_info_.size()) 1597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadAvailablePreviewPage(); 1598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DocumentLoadFailed() { 1601cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(document_load_state_ == LOAD_STATE_LOADING); 1602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UserMetricsRecordAction("PDF.LoadFailure"); 1603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Hide progress control. 1605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress_bar_.Fade(false, kProgressFadeTimeoutMs); 1606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (did_call_start_loading_) { 1608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::PDF::DidStopLoading(this); 1609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) did_call_start_loading_ = false; 1610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) document_load_state_ = LOAD_STATE_FAILED; 1613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.InvalidateRect(pp::Rect(pp::Point(), plugin_size_)); 1614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::PreviewDocumentLoadFailed() { 1617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UserMetricsRecordAction("PDF.PreviewDocumentLoadFailure"); 1618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (preview_document_load_state_ != LOAD_STATE_LOADING || 1619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_pages_info_.empty()) { 1620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_document_load_state_ = LOAD_STATE_FAILED; 1624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_pages_info_.pop(); 1625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (preview_pages_info_.size()) 1627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadAvailablePreviewPage(); 1628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::Instance* Instance::GetPluginInstance() { 1631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetInstance(); 1632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DocumentHasUnsupportedFeature(const std::string& feature) { 1635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string metric("PDF_Unsupported_"); 1636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) metric += feature; 1637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!unsupported_features_reported_.count(metric)) { 1638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) unsupported_features_reported_.insert(metric); 1639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UserMetricsRecordAction(metric); 1640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Since we use an info bar, only do this for full frame plugins.. 1643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!full_) 1644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (told_browser_about_unsupported_feature_) 1647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) told_browser_about_unsupported_feature_ = true; 1649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::PDF::HasUnsupportedFeature(this); 1651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DocumentLoadProgress(uint32 available, uint32 doc_size) { 1654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double progress = 0.0; 1655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (doc_size == 0) { 1656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Document size is unknown. Use heuristics. 1657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We'll make progress logarithmic from 0 to 100M. 1658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static const double kFactor = log(100000000.0) / 100.0; 1659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (available > 0) { 1660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress = log(static_cast<double>(available)) / kFactor; 1661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (progress > 100.0) 1662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress = 100.0; 1663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 1665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress = 100.0 * static_cast<double>(available) / doc_size; 1666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress_bar_.SetProgress(progress); 1668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::FormTextFieldFocusChange(bool in_focus) { 1671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!text_input_.get()) 1672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 1673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (in_focus) 1674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) text_input_->SetTextInputType(PP_TEXTINPUT_TYPE_DEV_TEXT); 1675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) else 1676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) text_input_->SetTextInputType(PP_TEXTINPUT_TYPE_DEV_NONE); 1677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Called by PDFScriptableObject. 1680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool Instance::HasScriptableMethod(const pp::Var& method, pp::Var* exception) { 1681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string method_str = method.AsString(); 1682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return (method_str == kJSAccessibility || 1683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSDocumentLoadComplete || 1684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSGetHeight || 1685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSGetHorizontalScrollbarThickness || 1686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSGetPageLocationNormalized || 168734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) method_str == kJSGetSelectedText || 1688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSGetVerticalScrollbarThickness || 1689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSGetWidth || 1690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSGetZoomLevel || 1691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSGoToPage || 1692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSGrayscale || 1693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSLoadPreviewPage || 1694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSOnLoad || 1695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSOnPluginSizeChanged || 1696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSOnScroll || 1697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSPageXOffset || 1698cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSPageYOffset || 1699cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSPrintPreviewPageCount || 1700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSReload || 1701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSRemovePrintButton || 1702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSResetPrintPreviewUrl || 1703cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSSendKeyEvent || 1704cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSSetPageNumbers || 1705cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSSetPageXOffset || 1706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSSetPageYOffset || 1707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSSetZoomLevel || 1708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSZoomFitToHeight || 1709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSZoomFitToWidth || 1710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSZoomIn || 1711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) method_str == kJSZoomOut); 1712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::Var Instance::CallScriptableMethod(const pp::Var& method, 1715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<pp::Var>& args, 1716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Var* exception) { 1717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string method_str = method.AsString(); 1718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSGrayscale) { 1719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() == 1 && args[0].is_bool()) { 1720cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->SetGrayscale(args[0].AsBool()); 1721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Redraw 1722cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.InvalidateRect(pp::Rect(pp::Point(), plugin_size_)); 1723cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 1724cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (thumbnails_.visible()) 1725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_.Show(true, true); 1726cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 1727cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(true); 1728cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1729cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(false); 1730cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSOnLoad) { 1732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() == 1 && args[0].is_string()) { 1733cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) on_load_callback_ = args[0]; 1734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(true); 1735cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1736cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(false); 1737cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1738cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSOnScroll) { 1739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() == 1 && args[0].is_string()) { 1740cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) on_scroll_callback_ = args[0]; 1741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(true); 1742cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1743cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(false); 1744cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1745cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSOnPluginSizeChanged) { 1746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() == 1 && args[0].is_string()) { 1747cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) on_plugin_size_changed_callback_ = args[0]; 1748cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(true); 1749cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1750cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(false); 1751cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1752cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSReload) { 1753cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) document_load_state_ = LOAD_STATE_LOADING; 1754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!full_) 1755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadUrl(url_); 1756cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_engine_.reset(); 1757cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print_preview_page_count_ = 0; 1758cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_.reset(PDFEngine::Create(this)); 1759cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->New(url_.c_str()); 1760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 1761cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_.ResetEngine(engine_.get()); 1762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 1763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1765cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSResetPrintPreviewUrl) { 1766cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() == 1 && args[0].is_string()) { 1767cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) url_ = args[0].AsString(); 1768cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_pages_info_ = std::queue<PreviewPageInfo>(); 1769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_document_load_state_ = LOAD_STATE_COMPLETE; 1770cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1771cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1772cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1773cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSZoomFitToHeight) { 1774cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetZoom(ZOOM_FIT_TO_PAGE, 0); 1775cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1776cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1777cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSZoomFitToWidth) { 1778cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetZoom(ZOOM_FIT_TO_WIDTH, 0); 1779cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1780cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1781cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSZoomIn) { 1782cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetZoom(ZOOM_SCALE, CalculateZoom(kZoomInButtonId)); 1783cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1784cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1785cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSZoomOut) { 1786cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetZoom(ZOOM_SCALE, CalculateZoom(kZoomOutButtonId)); 1787cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1788cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1789cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSSetZoomLevel) { 17901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (args.size() == 1 && args[0].is_number()) 1791cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetZoom(ZOOM_SCALE, args[0].AsDouble()); 1792cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1793cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1794cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSGetZoomLevel) { 1795cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(zoom_); 1796cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1797cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSGetHeight) { 1798cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(plugin_size_.height()); 1799cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1800cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSGetWidth) { 1801cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(plugin_size_.width()); 1802cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1803cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSGetHorizontalScrollbarThickness) { 1804cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var( 1805cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_.get() ? GetScrollbarReservedThickness() : 0); 1806cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1807cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSGetVerticalScrollbarThickness) { 1808cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var( 1809cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_.get() ? GetScrollbarReservedThickness() : 0); 1810cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 181134680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) if (method_str == kJSGetSelectedText) { 181234680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) return GetSelectedText(false); 181334680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles) } 1814cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSDocumentLoadComplete) { 1815cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var((document_load_state_ != LOAD_STATE_LOADING)); 1816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSPageYOffset) { 1818cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(static_cast<int32_t>( 1819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_.get() ? v_scrollbar_->GetValue() : 0)); 1820cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSSetPageYOffset) { 1822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() == 1 && args[0].is_number() && v_scrollbar_.get()) 1823cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScrollToY(GetScaled(args[0].AsInt())); 1824cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1825cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1826cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSPageXOffset) { 1827cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(static_cast<int32_t>( 1828cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_.get() ? h_scrollbar_->GetValue() : 0)); 1829cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1830cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSSetPageXOffset) { 1831cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() == 1 && args[0].is_number() && h_scrollbar_.get()) 1832cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScrollToX(GetScaled(args[0].AsInt())); 1833cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1834cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1835cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSRemovePrintButton) { 1836cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateToolbar(kPrintPreviewToolbarButtons, 1837cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) arraysize(kPrintPreviewToolbarButtons)); 1838cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateToolbarPosition(false); 1839cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Invalidate(pp::Rect(plugin_size_)); 1840cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1841cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1842cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSGoToPage) { 1843cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() == 1 && args[0].is_string()) { 1844cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScrollToPage(atoi(args[0].AsString().c_str())); 1845cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1846cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1847cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1848cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSAccessibility) { 1849cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() == 0) { 1850cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::DictionaryValue node; 1851cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) node.SetInteger(kAccessibleNumberOfPages, engine_->GetNumberOfPages()); 1852cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) node.SetBoolean(kAccessibleLoaded, 1853cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) document_load_state_ != LOAD_STATE_LOADING); 1854cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool has_permissions = 1855cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->HasPermission(PDFEngine::PERMISSION_COPY) || 1856cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->HasPermission(PDFEngine::PERMISSION_COPY_ACCESSIBLE); 1857cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) node.SetBoolean(kAccessibleCopyable, has_permissions); 1858cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string json; 1859cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::JSONWriter::Write(&node, &json); 1860cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(json); 1861cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (args[0].is_number()) { 1862cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(engine_->GetPageAsJSON(args[0].AsInt())); 1863cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1864cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1865cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSPrintPreviewPageCount) { 1866cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() == 1 && args[0].is_number()) 1867cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetPrintPreviewMode(args[0].AsInt()); 1868cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1869cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1870cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSLoadPreviewPage) { 1871cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() == 2 && args[0].is_string() && args[1].is_number()) 1872cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ProcessPreviewPageInfo(args[0].AsString(), args[1].AsInt()); 1873cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1874cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1875cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSGetPageLocationNormalized) { 1876cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const size_t kMaxLength = 30; 1877cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) char location_info[kMaxLength]; 1878cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int page_idx = engine_->GetMostVisiblePage(); 1879cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (page_idx < 0) 1880cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(std::string()); 1881cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect rect = engine_->GetPageContentsRect(page_idx); 1882cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int v_scrollbar_reserved_thickness = 1883cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_.get() ? GetScaled(GetScrollbarReservedThickness()) : 0; 1884cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1885cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rect.set_x(rect.x() + ((plugin_size_.width() - 1886cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_reserved_thickness - available_area_.width()) / 2)); 1887cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::snprintf(location_info, 1888cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kMaxLength, 1889cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "%0.4f;%0.4f;%0.4f;%0.4f;", 1890cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rect.x() / static_cast<float>(plugin_size_.width()), 1891cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rect.y() / static_cast<float>(plugin_size_.height()), 1892cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rect.width() / static_cast<float>(plugin_size_.width()), 1893cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) rect.height()/ static_cast<float>(plugin_size_.height())); 1894cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(std::string(location_info)); 1895cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1896cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSSetPageNumbers) { 1897cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() != 1 || !args[0].is_string()) 1898cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1899cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const int num_pages_signed = engine_->GetNumberOfPages(); 1900cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (num_pages_signed <= 0) 1901cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1902cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<base::ListValue> page_ranges(static_cast<base::ListValue*>( 1903cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::JSONReader::Read(args[0].AsString(), false))); 1904cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const size_t num_pages = static_cast<size_t>(num_pages_signed); 1905cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!page_ranges.get() || page_ranges->GetSize() != num_pages) 1906cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1907cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1908cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<int> print_preview_page_numbers; 1909cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t index = 0; index < num_pages; ++index) { 1910cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int page_number = 0; // |page_number| is 1-based. 1911cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!page_ranges->GetInteger(index, &page_number) || page_number < 1) 1912cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1913cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print_preview_page_numbers.push_back(page_number); 1914cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1915cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print_preview_page_numbers_ = print_preview_page_numbers; 1916cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.set_current_page(GetPageNumberToDisplay()); 1917cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1918cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1919cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This is here to work around https://bugs.webkit.org/show_bug.cgi?id=16735. 1920cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // In JS, creating a synthetic keyboard event and dispatching it always 1921cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // result in a keycode of 0. 1922cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (method_str == kJSSendKeyEvent) { 1923cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (args.size() == 1 && args[0].is_number()) { 1924cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::KeyboardInputEvent event( 1925cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) this, // instance 1926cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_INPUTEVENT_TYPE_KEYDOWN, // HandleInputEvent only care about this. 1927cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 0, // timestamp, not used for kbd events. 1928cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 0, // no modifiers. 1929cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) args[0].AsInt(), // keycode. 1930cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Var()); // no char text needed. 1931cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HandleInputEvent(event); 1932cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1933cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1934cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return pp::Var(); 1935cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 1936cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1937cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::OnGeometryChanged(double old_zoom, float old_device_scale) { 1938cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool force_no_horizontal_scrollbar = false; 1939cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int scrollbar_thickness = GetScrollbarThickness(); 1940cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1941cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (old_device_scale != device_scale_) { 1942cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Change in device scale forces us to recreate resources 1943cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ConfigureNumberImageGenerator(); 1944cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1945cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateToolbar(current_tb_info_, current_tb_info_size_); 1946cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Load autoscroll anchor image. 1947cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_anchor_ = 1948cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateResourceImage(PP_RESOURCEIMAGE_PDF_PAN_SCROLL_ICON); 1949cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1950cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ConfigurePageIndicator(); 1951cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ConfigureProgressBar(); 1952cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1953cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point scroll_position = engine_->GetScrollPosition(); 1954cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScalePoint(device_scale_ / old_device_scale, &scroll_position); 1955cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->SetScrollPosition(scroll_position); 1956cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1957cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1958cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateZoomScale(); 1959cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (zoom_ != old_zoom || device_scale_ != old_device_scale) 1960cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->ZoomUpdated(zoom_ * device_scale_); 1961cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (zoom_ != old_zoom) 1962cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ZoomChanged(zoom_); 1963cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1964cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) available_area_ = pp::Rect(plugin_size_); 1965cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetDocumentPixelHeight() > plugin_size_.height()) { 1966cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateVerticalScrollbar(); 1967cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 1968cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DestroyVerticalScrollbar(); 1969cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1970cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1971cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int v_scrollbar_reserved_thickness = 1972cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_.get() ? GetScaled(GetScrollbarReservedThickness()) : 0; 1973cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1974cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!force_no_horizontal_scrollbar && 1975cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetDocumentPixelWidth() > 1976cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (plugin_size_.width() - v_scrollbar_reserved_thickness)) { 1977cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateHorizontalScrollbar(); 1978cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1979cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Adding the horizontal scrollbar now might cause us to need vertical 1980cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // scrollbars. 1981cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (GetDocumentPixelHeight() > 1982cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_size_.height() - GetScaled(GetScrollbarReservedThickness())) { 1983cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateVerticalScrollbar(); 1984cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1985cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1986cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 1987cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DestroyHorizontalScrollbar(); 1988cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 1989cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1990cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 1991cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int thumbnails_pos = 0, thumbnails_total = 0; 1992cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 1993cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get()) { 1994cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->SetScale(device_scale_); 1995cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) available_area_.set_width( 1996cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::max(0, plugin_size_.width() - v_scrollbar_reserved_thickness)); 1997cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1998cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 1999cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int height = plugin_size_.height(); 2000cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 2001cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int height_dip = plugin_dip_size_.height(); 2002cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2003cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_MACOSX) 2004cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Before Lion, Mac always had the resize at the bottom. After that, it 2005cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // never did. 2006cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((base::mac::IsOSSnowLeopard() && full_) || 2007cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (base::mac::IsOSLionOrLater() && h_scrollbar_.get())) { 2008cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else 2009cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (h_scrollbar_.get()) { 2010cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // defined(OS_MACOSX) 2011cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 2012cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) height -= GetScaled(GetScrollbarThickness()); 2013cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 2014cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) height_dip -= GetScrollbarThickness(); 2015cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2016cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 2017cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32 doc_height = GetDocumentPixelHeight(); 2018cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 2019cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32 doc_height_dip = 2020cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<int32>(GetDocumentPixelHeight() / device_scale_); 2021cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_MACOSX) 2022cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // On the Mac we always allow room for the resize button (whose width is 2023cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the same as that of the scrollbar) in full mode. However, if there is no 2024cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // no horizontal scrollbar, the end of the scrollbar will scroll past the 2025cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // end of the document. This is because the scrollbar assumes that its own 2026cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // height (in the case of a vscroll bar) is the same as the height of the 2027cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // viewport. Since the viewport is actually larger, we compensate by 2028cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // adjusting the document height. Similar logic applies below for the 2029cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // horizontal scrollbar. 2030cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // For example, if the document size is 1000, and the viewport size is 200, 2031cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // then the scrollbar position at the end will be 800. In this case the 2032cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // viewport is actally 215 (assuming 15 as the scrollbar width) but the 2033cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // scrollbar thinks it is 200. We want the scrollbar position at the end to 2034cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // be 785. Making the document size 985 achieves this. 2035cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (full_ && !h_scrollbar_.get()) { 2036cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 2037cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) doc_height -= GetScaled(GetScrollbarThickness()); 2038cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 2039cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) doc_height_dip -= GetScrollbarThickness(); 2040cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2041cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // defined(OS_MACOSX) 2042cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2043cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32 position; 2044cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) position = v_scrollbar_->GetValue(); 2045cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) position = static_cast<int>(position * zoom_ / old_zoom); 2046cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) valid_v_range_ = doc_height_dip - height_dip; 2047cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (position > valid_v_range_) 2048cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) position = valid_v_range_; 2049cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2050cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->SetValue(position); 2051cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2052cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_Rect loc; 2053cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loc.point.x = static_cast<int>(available_area_.right() / device_scale_); 2054cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (IsOverlayScrollbar()) 2055cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loc.point.x -= scrollbar_thickness; 2056cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loc.point.y = 0; 2057cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loc.size.width = scrollbar_thickness; 2058cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loc.size.height = height_dip; 2059cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->SetLocation(loc); 2060cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_->SetDocumentSize(doc_height_dip); 2061cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2062cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 2063cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_pos = position; 2064cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_total = doc_height - height; 2065cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 2066cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2067cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2068cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (h_scrollbar_.get()) { 2069cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_->SetScale(device_scale_); 2070cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) available_area_.set_height( 2071cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::max(0, plugin_size_.height() - 2072cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetScaled(GetScrollbarReservedThickness()))); 2073cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2074cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int width_dip = plugin_dip_size_.width(); 2075cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2076cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // See note above. 2077cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_MACOSX) 2078cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((base::mac::IsOSSnowLeopard() && full_) || 2079cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) (base::mac::IsOSLionOrLater() && v_scrollbar_.get())) { 2080cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#else 2081cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get()) { 2082cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 2083cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) width_dip -= GetScrollbarThickness(); 2084cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2085cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32 doc_width_dip = 2086cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<int32>(GetDocumentPixelWidth() / device_scale_); 2087cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_MACOSX) 2088cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // See comment in the above if (v_scrollbar_.get()) block. 2089cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (full_ && !v_scrollbar_.get()) 2090cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) doc_width_dip -= GetScrollbarThickness(); 2091cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // defined(OS_MACOSX) 2092cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2093cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32 position; 2094cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) position = h_scrollbar_->GetValue(); 2095cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) position = static_cast<int>(position * zoom_ / old_zoom); 2096cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) position = std::min(position, doc_width_dip - width_dip); 2097cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2098cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_->SetValue(position); 2099cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_Rect loc; 2101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loc.point.x = 0; 2102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loc.point.y = static_cast<int>(available_area_.bottom() / device_scale_); 2103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (IsOverlayScrollbar()) 2104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loc.point.y -= scrollbar_thickness; 2105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loc.size.width = width_dip; 2106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) loc.size.height = scrollbar_thickness; 2107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_->SetLocation(loc); 2108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_->SetDocumentSize(doc_width_dip); 2109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int doc_width = GetDocumentPixelWidth(); 2112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (doc_width < available_area_.width()) { 2113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) available_area_.Offset((available_area_.width() - doc_width) / 2, 0); 2114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) available_area_.set_width(doc_width); 2115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int doc_height = GetDocumentPixelHeight(); 2117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (doc_height < available_area_.height()) { 2118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) available_area_.set_height(doc_height); 2119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We'll invalidate the entire plugin anyways. 2122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateToolbarPosition(false); 2123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateProgressBarPosition(false); 2124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdatePageIndicatorPosition(false); 2125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifdef ENABLE_THUMBNAILS 2127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Update thumbnail control position. 2128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_.SetPosition(thumbnails_pos, thumbnails_total, false); 2129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect thumbnails_rc(plugin_size_.width() - GetScaled(kThumbnailsWidth), 0, 2130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetScaled(kThumbnailsWidth), plugin_size_.height()); 2131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get()) 2132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_rc.Offset(-v_scrollbar_reserved_thickness, 0); 2133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (h_scrollbar_.get()) 2134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_rc.Inset(0, 0, 0, v_scrollbar_reserved_thickness); 2135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_.SetRect(thumbnails_rc, false); 2136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif 2137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CalculateBackgroundParts(); 2139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->PageOffsetUpdated(available_area_.point()); 2140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->PluginSizeUpdated(available_area_.size()); 2141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!document_size_.GetArea()) 2143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) paint_manager_.InvalidateRect(pp::Rect(pp::Point(), plugin_size_)); 2145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 21461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Run the plugin size change callback asynchronously. This function can be 21471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // invoked by a layout change which should not re-enter into JS synchronously. 21481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pp::CompletionCallback callback = 21491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci callback_factory_.NewCallback(&Instance::RunCallback, 21501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci on_plugin_size_changed_callback_); 21511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci pp::Module::Get()->core()->CallOnMainThread(0, callback); 21521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 21531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 21541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid Instance::RunCallback(int32_t, pp::Var callback) { 21551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (callback.is_string()) 21561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ExecuteScript(callback); 2157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::CreateHorizontalScrollbar() { 2160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (h_scrollbar_.get()) 2161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_.reset(new pp::Scrollbar_Dev(this, false)); 2164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::CreateVerticalScrollbar() { 2167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get()) 2168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_.reset(new pp::Scrollbar_Dev(this, true)); 2171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DestroyHorizontalScrollbar() { 2174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!h_scrollbar_.get()) 2175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (h_scrollbar_->GetValue()) 2177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->ScrolledToXPosition(0); 2178cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) h_scrollbar_.reset(); 2179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DestroyVerticalScrollbar() { 2182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!v_scrollbar_.get()) 2183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_->GetValue()) 2185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->ScrolledToYPosition(0); 2186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) v_scrollbar_.reset(); 2187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.Show(false, true); 2188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int Instance::GetScrollbarThickness() { 2191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (scrollbar_thickness_ == -1) { 2192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Scrollbar_Dev temp_scrollbar(this, false); 2193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scrollbar_thickness_ = temp_scrollbar.GetThickness(); 2194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scrollbar_reserved_thickness_ = 2195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) temp_scrollbar.IsOverlay() ? 0 : scrollbar_thickness_; 2196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return scrollbar_thickness_; 2199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int Instance::GetScrollbarReservedThickness() { 2202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetScrollbarThickness(); 2203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return scrollbar_reserved_thickness_; 2204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool Instance::IsOverlayScrollbar() { 2207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetScrollbarReservedThickness() == 0; 2208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::CreateToolbar(const ToolbarButtonInfo* tb_info, size_t size) { 2211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) toolbar_.reset(new FadingControls()); 2212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(tb_info); 2214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(size >= 0); 2215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Remember the current toolbar information in case we need to recreate the 2217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // images later. 2218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_tb_info_ = tb_info; 2219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) current_tb_info_size_ = size; 2220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int max_height = 0; 2222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point origin(kToolbarFadingOffsetLeft, kToolbarFadingOffsetTop); 2223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScalePoint(device_scale_, &origin); 2224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<Button*> buttons; 2226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < size; i++) { 2227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Button* btn = new Button; 2228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::ImageData normal_face = 2229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateResourceImage(tb_info[i].normal); 2230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) btn->CreateButton(tb_info[i].id, 2231cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) origin, 2232cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) true, 2233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) toolbar_.get(), 2234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) tb_info[i].style, 2235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) normal_face, 2236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateResourceImage(tb_info[i].highlighted), 2237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateResourceImage(tb_info[i].pressed)); 2238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) buttons.push_back(btn); 2239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) origin += pp::Point(normal_face.size().width(), 0); 2241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) max_height = std::max(max_height, normal_face.size().height()); 2242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2244cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect rc_toolbar(0, 0, 2245cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) origin.x() + GetToolbarRightOffset(), 2246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) origin.y() + max_height + GetToolbarBottomOffset()); 2247cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) toolbar_->CreateFadingControls( 2248cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kToolbarId, rc_toolbar, false, this, kTransparentAlpha); 2249cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::list<Button*>::iterator iter; 2251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (iter = buttons.begin(); iter != buttons.end(); ++iter) { 2252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) toolbar_->AddControl(*iter); 2253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int Instance::GetToolbarRightOffset() { 2257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int scrollbar_thickness = GetScrollbarThickness(); 2258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetScaled(kToolbarFadingOffsetRight) + 2 * scrollbar_thickness; 2259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int Instance::GetToolbarBottomOffset() { 2262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int scrollbar_thickness = GetScrollbarThickness(); 2263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return GetScaled(kToolbarFadingOffsetBottom) + scrollbar_thickness; 2264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2266cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::vector<pp::ImageData> Instance::GetThumbnailResources() { 2267cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<pp::ImageData> num_images(10); 2268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_images[0] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_0); 2269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_images[1] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_1); 2270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_images[2] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_2); 2271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_images[3] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_3); 2272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_images[4] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_4); 2273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_images[5] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_5); 2274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_images[6] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_6); 2275cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_images[7] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_7); 2276cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_images[8] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_8); 2277cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_images[9] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_9); 2278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return num_images; 2279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::vector<pp::ImageData> Instance::GetProgressBarResources( 2282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::ImageData* background) { 2283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<pp::ImageData> result(9); 2284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result[0] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_0); 2285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result[1] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_1); 2286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result[2] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_2); 2287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result[3] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_3); 2288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result[4] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_4); 2289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result[5] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_5); 2290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result[6] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_6); 2291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result[7] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_7); 2292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) result[8] = CreateResourceImage(PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_8); 2293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *background = CreateResourceImage( 2294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_PROGRESS_BAR_BACKGROUND); 2295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return result; 2296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::CreatePageIndicator(bool always_visible) { 2299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.CreatePageIndicator(kPageIndicatorId, false, this, 2300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) number_image_generator(), always_visible); 2301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ConfigurePageIndicator(); 2302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::ConfigurePageIndicator() { 2305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::ImageData background = 2306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CreateResourceImage(PP_RESOURCEIMAGE_PDF_PAGE_INDICATOR_BACKGROUND); 2307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.Configure(pp::Point(), background); 2308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::CreateProgressBar() { 2311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::ImageData background; 2312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<pp::ImageData> images = GetProgressBarResources(&background); 2313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string text = GetLocalizedString(PP_RESOURCESTRING_PDFPROGRESSLOADING); 2314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress_bar_.CreateProgressControl(kProgressBarId, false, this, 0.0, 2315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device_scale_, images, background, text); 2316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::ConfigureProgressBar() { 2319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::ImageData background; 2320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<pp::ImageData> images = GetProgressBarResources(&background); 2321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress_bar_.Reconfigure(background, images, device_scale_); 2322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::CreateThumbnails() { 2325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) thumbnails_.CreateThumbnailControl( 2326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kThumbnailsId, pp::Rect(), false, this, engine_.get(), 2327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) number_image_generator()); 2328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::LoadUrl(const std::string& url) { 2331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadUrlInternal(url, &embed_loader_, &Instance::DidOpen); 2332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::LoadPreviewUrl(const std::string& url) { 2335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadUrlInternal(url, &embed_preview_loader_, &Instance::DidOpenPreview); 2336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::LoadUrlInternal(const std::string& url, pp::URLLoader* loader, 2339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void (Instance::* method)(int32_t)) { 2340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::URLRequestInfo request(this); 2341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) request.SetURL(url); 2342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) request.SetMethod("GET"); 2343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) *loader = CreateURLLoaderInternal(); 2345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::CompletionCallback callback = loader_factory_.NewCallback(method); 2346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int rv = loader->Open(request, callback); 2347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (rv != PP_OK_COMPLETIONPENDING) 2348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) callback.Run(rv); 2349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::URLLoader Instance::CreateURLLoaderInternal() { 2352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::URLLoader loader(this); 2353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const PPB_URLLoaderTrusted* trusted_interface = 2355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) reinterpret_cast<const PPB_URLLoaderTrusted*>( 2356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Module::Get()->GetBrowserInterface( 2357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PPB_URLLOADERTRUSTED_INTERFACE)); 2358cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (trusted_interface) 2359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) trusted_interface->GrantUniversalAccess(loader.pp_resource()); 2360cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return loader; 2361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int Instance::GetInitialPage(const std::string& url) { 2364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) size_t found_idx = url.find('#'); 2365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (found_idx == std::string::npos) 2366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return -1; 2367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& ref = url.substr(found_idx + 1); 2369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string> fragments; 2370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Tokenize(ref, kDelimiters, &fragments); 2371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Page number to return, zero-based. 2373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int page = -1; 2374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Handle the case of http://foo.com/bar#NAMEDDEST. This is not explicitly 2376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // mentioned except by example in the Adobe "PDF Open Parameters" document. 2377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if ((fragments.size() == 1) && (fragments[0].find('=') == std::string::npos)) 2378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return engine_->GetNamedDestinationPage(fragments[0]); 2379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < fragments.size(); ++i) { 2381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<std::string> key_value; 2382cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::SplitString(fragments[i], '=', &key_value); 2383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (key_value.size() != 2) 2384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) continue; 2385cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& key = key_value[0]; 2386cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::string& value = key_value[1]; 2387cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (base::strcasecmp(kPage, key.c_str()) == 0) { 2389cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |page_value| is 1-based. 2390cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int page_value = -1; 2391cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (base::StringToInt(value, &page_value) && page_value > 0) 2392cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page = page_value - 1; 2393cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) continue; 2394cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (base::strcasecmp(kNamedDest, key.c_str()) == 0) { 2396cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // |page_value| is 0-based. 2397cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int page_value = engine_->GetNamedDestinationPage(value); 2398cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (page_value >= 0) 2399cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page = page_value; 2400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) continue; 2401cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2402cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2403cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return page; 2404cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::UpdateToolbarPosition(bool invalidate) { 2407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect ctrl_rc = toolbar_->GetControlsRect(); 2408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int min_toolbar_width = ctrl_rc.width() + GetToolbarRightOffset() + 2409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetScaled(kToolbarFadingOffsetLeft); 2410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int min_toolbar_height = ctrl_rc.width() + GetToolbarBottomOffset() + 2411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetScaled(kToolbarFadingOffsetBottom); 2412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Update toolbar position 2414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (plugin_size_.width() < min_toolbar_width || 2415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_size_.height() < min_toolbar_height) { 2416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Disable toolbar if it does not fit on the screen. 2417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) toolbar_->Show(false, invalidate); 2418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 2419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point offset( 2420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_size_.width() - GetToolbarRightOffset() - ctrl_rc.right(), 2421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_size_.height() - GetToolbarBottomOffset() - ctrl_rc.bottom()); 2422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) toolbar_->MoveBy(offset, invalidate); 2423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int toolbar_width = std::max(plugin_size_.width() / 2, min_toolbar_width); 2425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) toolbar_->ExpandLeft(toolbar_width - toolbar_->rect().width()); 2426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) toolbar_->Show(painted_first_page_, invalidate); 2427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::UpdateProgressBarPosition(bool invalidate) { 2431cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // TODO(gene): verify we don't overlap with toolbar. 2432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int scrollbar_thickness = GetScrollbarThickness(); 2433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point progress_origin( 2434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scrollbar_thickness + GetScaled(kProgressOffsetLeft), 2435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_size_.height() - progress_bar_.rect().height() - 2436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scrollbar_thickness - GetScaled(kProgressOffsetBottom)); 2437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) progress_bar_.MoveTo(progress_origin, invalidate); 2438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::UpdatePageIndicatorPosition(bool invalidate) { 2441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int32 doc_height = static_cast<int>(document_size_.height() * zoom_); 2442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point origin( 2443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_size_.width() - page_indicator_.rect().width() - 2444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetScaled(GetScrollbarReservedThickness()), 2445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.GetYPosition(engine_->GetVerticalScrollbarYPosition(), 2446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) doc_height, plugin_size_.height())); 2447cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page_indicator_.MoveTo(origin, invalidate); 2448cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2449cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2450cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::SetZoom(ZoomMode zoom_mode, double scale) { 2451cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double old_zoom = zoom_; 2452cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2453cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) zoom_mode_ = zoom_mode; 2454cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (zoom_mode_ == ZOOM_SCALE) 2455cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) zoom_ = scale; 2456cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) UpdateZoomScale(); 2457cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2458cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->ZoomUpdated(zoom_ * device_scale_); 2459cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) OnGeometryChanged(old_zoom, device_scale_); 2460cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2461cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If fit-to-height, snap to the beginning of the most visible page. 2462cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (zoom_mode_ == ZOOM_FIT_TO_PAGE) { 2463cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScrollToPage(engine_->GetMostVisiblePage()); 2464cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2465cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2466cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Update sticky buttons to the current zoom style. 2467cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Button* ftp_btn = static_cast<Button*>( 2468cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) toolbar_->GetControl(kFitToPageButtonId)); 2469cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Button* ftw_btn = static_cast<Button*>( 2470cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) toolbar_->GetControl(kFitToWidthButtonId)); 2471cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (zoom_mode_) { 2472cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ZOOM_FIT_TO_PAGE: 2473cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ftp_btn->SetPressedState(true); 2474cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ftw_btn->SetPressedState(false); 2475cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 2476cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ZOOM_FIT_TO_WIDTH: 2477cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ftw_btn->SetPressedState(true); 2478cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ftp_btn->SetPressedState(false); 2479cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 2480cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 2481cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ftw_btn->SetPressedState(false); 2482cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ftp_btn->SetPressedState(false); 2483cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2484cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2485cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2486cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::UpdateZoomScale() { 2487cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (zoom_mode_) { 2488cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ZOOM_SCALE: 2489cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; // Keep current scale. 2490cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ZOOM_FIT_TO_PAGE: { 2491cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int page_num = engine_->GetFirstVisiblePage(); 2492cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (page_num == -1) 2493cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 2494cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Rect rc = engine_->GetPageRect(page_num); 2495cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!rc.height()) 2496cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 2497cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Calculate fit to width zoom level. 2498cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double ftw_zoom = static_cast<double>(plugin_dip_size_.width() - 2499cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetScrollbarReservedThickness()) / document_size_.width(); 2500cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Calculate fit to height zoom level. If document will not fit 2501cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // horizontally, adjust zoom level to allow space for horizontal 2502cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // scrollbar. 2503cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double fth_zoom = 2504cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<double>(plugin_dip_size_.height()) / rc.height(); 2505cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (fth_zoom * document_size_.width() > 2506cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) plugin_dip_size_.width() - GetScrollbarReservedThickness()) 2507cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) fth_zoom = static_cast<double>(plugin_dip_size_.height() 2508cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) - GetScrollbarReservedThickness()) / rc.height(); 2509cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) zoom_ = std::min(ftw_zoom, fth_zoom); 2510cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } break; 2511cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ZOOM_FIT_TO_WIDTH: 2512cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ZOOM_AUTO: 2513cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!document_size_.width()) 2514cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 2515cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) zoom_ = static_cast<double>(plugin_dip_size_.width() - 2516cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) GetScrollbarReservedThickness()) / document_size_.width(); 2517cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (zoom_mode_ == ZOOM_AUTO && zoom_ > 1.0) 2518cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) zoom_ = 1.0; 2519cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 2520cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2521cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) zoom_ = ClipToRange(zoom_, kMinZoom, kMaxZoom); 2522cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2523cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2524cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)double Instance::CalculateZoom(uint32 control_id) const { 2525cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (control_id == kZoomInButtonId) { 2526cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < chrome_page_zoom::kPresetZoomFactorsSize; ++i) { 2527cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double current_zoom = chrome_page_zoom::kPresetZoomFactors[i]; 2528cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (current_zoom - content::kEpsilon > zoom_) 2529cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return current_zoom; 2530cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2531cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 2532cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = chrome_page_zoom::kPresetZoomFactorsSize; i > 0; --i) { 2533cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double current_zoom = chrome_page_zoom::kPresetZoomFactors[i - 1]; 2534cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (current_zoom + content::kEpsilon < zoom_) 2535cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return current_zoom; 2536cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2537cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2538cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return zoom_; 2539cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2540cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2541cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::ImageData Instance::CreateResourceImage(PP_ResourceImage image_id) { 254203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pp::ImageData resource_data; 254303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (hidpi_enabled_) { 254403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) resource_data = 254503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) pp::PDF::GetResourceImageForScale(this, image_id, device_scale_); 254603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 2547cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 254803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return resource_data.data() ? resource_data 254903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : pp::PDF::GetResourceImage(this, image_id); 2550cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2551cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2552cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string Instance::GetLocalizedString(PP_ResourceString id) { 2553cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Var rv(pp::PDF::GetLocalizedString(this, id)); 2554cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!rv.is_string()) 2555cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return std::string(); 2556cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2557cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return rv.AsString(); 2558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DrawText(const pp::Point& top_center, PP_ResourceString id) { 2561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string str(GetLocalizedString(id)); 2562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::FontDescription_Dev description; 2564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) description.set_family(PP_FONTFAMILY_SANSSERIF); 2565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) description.set_size(kMessageTextSize * device_scale_); 2566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Font_Dev font(this, description); 2567cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int length = font.MeasureSimpleText(str); 2568cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point point(top_center); 2569cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) point.set_x(point.x() - length / 2); 2570cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DCHECK(!image_data_.is_null()); 2571cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) font.DrawSimpleText(&image_data_, str, point, kMessageTextColor); 2572cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2573cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2574cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::SetPrintPreviewMode(int page_count) { 2575cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!IsPrintPreview() || page_count <= 0) { 2576cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print_preview_page_count_ = 0; 2577cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) print_preview_page_count_ = page_count; 2581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScrollToPage(0); 2582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) engine_->AppendBlankPages(print_preview_page_count_); 2583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (preview_pages_info_.size() > 0) 2584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadAvailablePreviewPage(); 2585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool Instance::IsPrintPreview() { 2588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return IsPrintPreviewUrl(url_); 2589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int Instance::GetPageNumberToDisplay() { 2592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int page = engine_->GetMostVisiblePage(); 2593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (IsPrintPreview() && !print_preview_page_numbers_.empty()) { 2594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) page = ClipToRange<int>(page, 0, print_preview_page_numbers_.size() - 1); 2595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return print_preview_page_numbers_[page]; 2596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return page + 1; 2598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::ProcessPreviewPageInfo(const std::string& url, 2601cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int dst_page_index) { 2602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!IsPrintPreview() || print_preview_page_count_ < 0) 2603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int src_page_index = ExtractPrintPreviewPageIndex(url); 2606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (src_page_index < 1) 2607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_pages_info_.push(std::make_pair(url, dst_page_index)); 2610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadAvailablePreviewPage(); 2611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::LoadAvailablePreviewPage() { 2614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (preview_pages_info_.size() <= 0) 2615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string url = preview_pages_info_.front().first; 2618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int dst_page_index = preview_pages_info_.front().second; 2619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int src_page_index = ExtractPrintPreviewPageIndex(url); 2620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (src_page_index < 1 || 2621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dst_page_index >= print_preview_page_count_ || 2622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_document_load_state_ == LOAD_STATE_LOADING) { 2623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) preview_document_load_state_ = LOAD_STATE_LOADING; 2627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) LoadPreviewUrl(url); 2628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::EnableAutoscroll(const pp::Point& origin) { 2631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (is_autoscroll_) 2632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Size client_size = plugin_size_; 2635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (v_scrollbar_.get()) 2636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client_size.Enlarge(-GetScrollbarThickness(), 0); 2637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (h_scrollbar_.get()) 2638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client_size.Enlarge(0, -GetScrollbarThickness()); 2639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Do not allow autoscroll if client area is too small. 2641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (autoscroll_anchor_.size().width() > client_size.width() || 2642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_anchor_.size().height() > client_size.height()) 2643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return; 2644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_rect_ = pp::Rect( 2646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point(origin.x() - autoscroll_anchor_.size().width() / 2, 2647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) origin.y() - autoscroll_anchor_.size().height() / 2), 2648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_anchor_.size()); 2649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Make sure autoscroll anchor is in the client area. 2651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (autoscroll_rect_.right() > client_size.width()) { 2652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_rect_.set_x( 2653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client_size.width() - autoscroll_anchor_.size().width()); 2654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (autoscroll_rect_.bottom() > client_size.height()) { 2656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_rect_.set_y( 2657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) client_size.height() - autoscroll_anchor_.size().height()); 2658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (autoscroll_rect_.x() < 0) 2661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_rect_.set_x(0); 2662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (autoscroll_rect_.y() < 0) 2663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_rect_.set_y(0); 2664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_autoscroll_ = true; 2666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Invalidate(kAutoScrollId, autoscroll_rect_); 2667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScheduleTimer(kAutoScrollId, kAutoScrollTimeoutMs); 2669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::DisableAutoscroll() { 2672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (is_autoscroll_) { 2673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) is_autoscroll_ = false; 2674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Invalidate(kAutoScrollId, autoscroll_rect_); 2675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PP_CursorType_Dev Instance::CalculateAutoscroll(const pp::Point& mouse_pos) { 2679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Scroll only if mouse pointer is outside of the anchor area. 2680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (autoscroll_rect_.Contains(mouse_pos)) { 2681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_x_ = 0; 2682cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_y_ = 0; 2683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PP_CURSORTYPE_MIDDLEPANNING; 2684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Relative position to the center of anchor area. 2687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Point rel_pos = mouse_pos - autoscroll_rect_.CenterPoint(); 2688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Calculate angle from the X axis. Angle is in range from -pi to pi. 2690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) double angle = atan2(static_cast<double>(rel_pos.y()), 2691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static_cast<double>(rel_pos.x())); 2692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_x_ = rel_pos.x() * kAutoScrollFactor; 2694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) autoscroll_y_ = rel_pos.y() * kAutoScrollFactor; 2695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2696cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Angle is from -pi to pi. Screen Y is increasing toward bottom, 2697cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // so negative angle represent north direction. 2698cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (angle < - (M_PI * 7.0 / 8.0)) { 2699cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // going west 2700cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PP_CURSORTYPE_WESTPANNING; 2701cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (angle < - (M_PI * 5.0 / 8.0)) { 2702cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // going north-west 2703cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PP_CURSORTYPE_NORTHWESTPANNING; 2704cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (angle < - (M_PI * 3.0 / 8.0)) { 2705cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // going north. 2706cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PP_CURSORTYPE_NORTHPANNING; 2707cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (angle < - (M_PI * 1.0 / 8.0)) { 2708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // going north-east 2709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PP_CURSORTYPE_NORTHEASTPANNING; 2710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (angle < M_PI * 1.0 / 8.0) { 2711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // going east. 2712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PP_CURSORTYPE_EASTPANNING; 2713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (angle < M_PI * 3.0 / 8.0) { 2714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // going south-east 2715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PP_CURSORTYPE_SOUTHEASTPANNING; 2716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (angle < M_PI * 5.0 / 8.0) { 2717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // going south. 2718cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PP_CURSORTYPE_SOUTHPANNING; 2719cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else if (angle < M_PI * 7.0 / 8.0) { 2720cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // going south-west 2721cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PP_CURSORTYPE_SOUTHWESTPANNING; 2722cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2723cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2724cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // went around the circle, going west again 2725cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return PP_CURSORTYPE_WESTPANNING; 2726cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2727cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2728cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::ConfigureNumberImageGenerator() { 2729cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<pp::ImageData> num_images = GetThumbnailResources(); 2730cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::ImageData number_background = CreateResourceImage( 2731cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PP_RESOURCEIMAGE_PDF_BUTTON_THUMBNAIL_NUM_BACKGROUND); 2732cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) number_image_generator_->Configure(number_background, 2733cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) num_images, 2734cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) device_scale_); 2735cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2736cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2737cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)NumberImageGenerator* Instance::number_image_generator() { 2738cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!number_image_generator_.get()) { 2739cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) number_image_generator_.reset(new NumberImageGenerator(this)); 2740cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ConfigureNumberImageGenerator(); 2741cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 2742cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return number_image_generator_.get(); 2743cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2744cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2745cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)int Instance::GetScaled(int x) const { 2746cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return static_cast<int>(x * device_scale_); 2747cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2748cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2749cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void Instance::UserMetricsRecordAction(const std::string& action) { 2750cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::PDF::UserMetricsRecordAction(this, pp::Var(action)); 2751cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2752cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2753cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PDFScriptableObject::PDFScriptableObject(Instance* instance) 2754cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : instance_(instance) { 2755cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2756cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2757cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)PDFScriptableObject::~PDFScriptableObject() { 2758cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2759cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2760cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool PDFScriptableObject::HasMethod(const pp::Var& name, pp::Var* exception) { 2761cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return instance_->HasScriptableMethod(name, exception); 2762cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2763cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2764cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)pp::Var PDFScriptableObject::Call(const pp::Var& method, 2765cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const std::vector<pp::Var>& args, 2766cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) pp::Var* exception) { 2767cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return instance_->CallScriptableMethod(method, args, exception); 2768cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 2769cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2770cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace chrome_pdf 2771