[Pkg-javascript-commits] [pdf.js] 25/157: Using pdfjs-dist as a library for b2g viewer.

David Prévot taffit at moszumanska.debian.org
Tue Aug 11 06:46:29 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository pdf.js.

commit 1b847df2f376d9d7749e790a9a62ff7c00556f0d
Author: Yury Delendik <ydelendik at mozilla.com>
Date:   Sat Mar 14 14:07:17 2015 -0500

    Using pdfjs-dist as a library for b2g viewer.
---
 extensions/b2g/viewer.css   |  18 +--
 extensions/b2g/viewer.html  | 214 ++-------------------------
 extensions/b2g/viewer.js    | 349 ++++++++++++++++++++++++++++++++++++++++++++
 make.js                     |  28 ++--
 web/pdf_viewer.component.js |   3 +-
 web/pdf_viewer.js           |  15 +-
 web/ui_utils.js             |   3 +-
 web/viewer.js               |  10 +-
 8 files changed, 400 insertions(+), 240 deletions(-)

diff --git a/extensions/b2g/viewer.css b/extensions/b2g/viewer.css
index 94519bf..2d494e9 100644
--- a/extensions/b2g/viewer.css
+++ b/extensions/b2g/viewer.css
@@ -14,7 +14,6 @@
  */
 
 * {
-  box-sizing: border-box;
   padding: 0;
   margin: 0;
 }
@@ -148,22 +147,7 @@ canvas {
   display: block;
 }
 
-.page {
-  direction: ltr;
-  width: 81.6rem;
-  height: 105.6rem;
-  margin: 1rem auto;
-  position: relative;
-  overflow: hidden;
-  background-color: white;
-}
-
-.page > a {
-  display: block;
-  position: absolute;
-}
-
-.loadingIcon {
+.pdfViewer .page .loadingIcon {
   width: 2.9rem;
   height: 2.9rem;
   background: url("images/spinner.png") no-repeat left top / 38rem ;
diff --git a/extensions/b2g/viewer.html b/extensions/b2g/viewer.html
index 83aad6c..7baa1f7 100644
--- a/extensions/b2g/viewer.html
+++ b/extensions/b2g/viewer.html
@@ -20,22 +20,25 @@ limitations under the License.
     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
     <title>PDF.js viewer</title>
 
+    <script src="../pdfjs-components/build/pdf.js"></script>
+    <script src="../pdfjs-components/web/pdf_viewer.js"></script>
+    <script src="/shared/js/l10n.js"></script>
 
-    <link rel="stylesheet" href="viewer.css"/>
-    <link rel="resource" type="application/l10n" href="locale/locale.properties"/>
-    <script src="l10n.js"></script>
-    <script src="../build/pdf.js"></script>
-    <script src="/shared/js/async_storage.js"></script>
+    <!-- Localization -->
+    <meta name="defaultLanguage" content="en-US">
+    <meta name="availableLanguages" content="ach,af,ak,an,ar,as,ast,az,be,bg,bn-BD,bn-IN,br,bs,ca,cs,csb,cy,da,de,el,en-GB,en-ZA,eo,es-AR,es-CL,es-ES,es-MX,et,eu,fa,ff,fi,fr,fy-NL,ga-IE,gd,gl,gu-IN,he,hi-IN,hr,hu,hy-AM,id,is,it,ja,ka,kk,km,kn,ko,ku,lg,lij,lt,lv,mai,mk,ml,mn,mr,ms,my,nb-NO,nl,nn-NO,nso,oc,or,pa-IN,pl,pt-BR,pt-PT,rm,ro,ru,rw,sah,si,sk,sl,son,sq,sr,sv-SE,sw,ta,ta-LK,te,th,tl,tn,tr,uk,ur,vi,wo,xh,zh-CN,zh-TW,zu">
+    <link rel="localization" href="locale/{locale}/viewer.properties">
 
     <script src="viewer.js"></script>
 
     <!-- Web Components -->
-    <link rel="stylesheet" type="text/css" href="/shared/elements/gaia-theme/style.css" />
-    <!-- <link rel="stylesheet" type="text/css" href="/shared/elements/gaia-icons/style.css" /> -->
-    <script type="text/javascript" src="/shared/elements/config.js"></script>
-    <script type="text/javascript" src="/shared/elements/gaia-header/dist/script.js"></script>
-  </head>
+    <link rel="stylesheet" type="text/css" href="/shared/elements/gaia-theme/gaia-theme.css">
+    <script src="/shared/elements/config.js" defer></script>
+    <script src="/shared/elements/gaia-header/dist/gaia-header.js" defer></script>
 
+    <link rel="stylesheet" type="text/css" href="../pdfjs-components/web/pdf_viewer.css">
+    <link rel="stylesheet" type="text/css" href="viewer.css">
+  </head>
 
   <body>
     <section role="region" id="activityHeader" class="skin-organic theme-settings">
@@ -55,7 +58,7 @@ limitations under the License.
     </section>
 
     <div id="viewerContainer">
-      <div id="viewer"></div>
+      <div id="viewer" class="pdfViewer"></div>
     </div>
 
     <div id="loadingBar">
@@ -81,194 +84,5 @@ limitations under the License.
       <div class="clearBoth"></div>
       <textarea id="errorMoreInfo" hidden='true' readonly="readonly"></textarea>
     </div>
-
-    <!-- BEGIN STUBS -->
-    <!--
-      Nothing below here is visible, the elements are just here
-      to prevent the viewer from breaking until we refactor it.
-    -->
-    <div id="stubs" style="display: none;">
-      <div id="outerContainer"></div>
-      <div id="sidebarContainer">
-        <div id="toolbarSidebar">
-          <button id="viewThumbnail"></button>
-          <button id="viewOutline"></button>
-          <button id="viewAttachments"></button>
-        </div>
-        <div id="sidebarContent">
-          <div id="thumbnailView"></div>
-          <div id="outlineView"></div>
-          <div id="attachmentsView"></div>
-        </div>
-      </div>  <!-- sidebarContainer -->
-
-      <button id="secondaryToolbarToggle" class="toolbarButton" title="Tools" tabindex="17" data-l10n-id="tools">
-        <span data-l10n-id="tools_label">Tools</span>
-      </button>
-      <div id="secondaryToolbar" class="secondaryToolbar hidden doorHangerRight">
-        <div id="secondaryToolbarButtonContainer">
-          <button id="secondaryPresentationMode" class="secondaryToolbarButton presentationMode visibleLargeView" title="Switch to Presentation Mode" tabindex="18" data-l10n-id="presentation_mode">
-            <span data-l10n-id="presentation_mode_label">Presentation Mode</span>
-          </button>
-
-          <button id="secondaryOpenFile" class="secondaryToolbarButton openFile visibleLargeView" title="Open File" tabindex="19" data-l10n-id="open_file">
-            <span data-l10n-id="open_file_label">Open</span>
-          </button>
-
-          <button id="secondaryPrint" class="secondaryToolbarButton print visibleMediumView" title="Print" tabindex="20" data-l10n-id="print">
-            <span data-l10n-id="print_label">Print</span>
-          </button>
-
-          <button id="secondaryDownload" class="secondaryToolbarButton download visibleMediumView" title="Download" tabindex="21" data-l10n-id="download">
-            <span data-l10n-id="download_label">Download</span>
-          </button>
-
-          <a href="#" id="secondaryViewBookmark" class="secondaryToolbarButton bookmark visibleSmallView" title="Current view (copy or open in new window)" tabindex="22" data-l10n-id="bookmark">
-              <span data-l10n-id="bookmark_label">Current View</span>
-          </a>
-
-          <div class="horizontalToolbarSeparator visibleLargeView"></div>
-
-          <button id="firstPage" class="secondaryToolbarButton firstPage" title="Go to First Page" tabindex="22" data-l10n-id="first_page">
-            <span data-l10n-id="first_page_label">Go to First Page</span>
-          </button>
-          <button id="lastPage" class="secondaryToolbarButton lastPage" title="Go to Last Page" tabindex="23" data-l10n-id="last_page">
-            <span data-l10n-id="last_page_label">Go to Last Page</span>
-          </button>
-
-          <div class="horizontalToolbarSeparator"></div>
-
-          <button id="pageRotateCw" class="secondaryToolbarButton rotateCw" title="Rotate Clockwise" tabindex="24" data-l10n-id="page_rotate_cw">
-            <span data-l10n-id="page_rotate_cw_label">Rotate Clockwise</span>
-          </button>
-          <button id="pageRotateCcw" class="secondaryToolbarButton rotateCcw" title="Rotate Counterclockwise" tabindex="25" data-l10n-id="page_rotate_ccw">
-            <span data-l10n-id="page_rotate_ccw_label">Rotate Counterclockwise</span>
-          </button>
-        </div>
-      </div>  <!-- secondaryToolbar -->
-
-      <div id="mainContainer">
-        <div id="findbar">
-          <input id="findInput">
-          <button id="findPrevious"></button>
-          <button id="findNext"></button>
-          <input type="checkbox" id="findHighlightAll">
-          <input type="checkbox" id="findMatchCase">
-          <span id="findMsg"></span>
-        </div>
-        <div id="toolbarContainer">
-          <div id="toolbarViewer">
-            <div id="toolbarViewerLeft">
-              <button id="sidebarToggle"></button>
-              <button id="viewFind"></button>
-              <span id="numPages"></span>
-            </div>
-            <div id="toolbarViewerRight">
-              <button id="presentationMode"></button>
-              <input id="fileInput" type="file" />
-              <button id="fullscreen"></button>
-              <button id="openFile"></button>
-              <button id="print"></button>
-              <button id="download"></button>
-              <!-- <div class="toolbarButtonSpacer"></div> -->
-              <a href="#" id="viewBookmark"></a>
-            </div>
-            <div id="toolbarViewerMiddle">
-              <span id="scaleSelectContainer">
-                 <select id="scaleSelect">
-                  <option id="pageAutoOption" value="auto" selected="selected">Automatic Zoom</option>
-                  <option id="pageActualOption" value="page-actual">Actual Size</option>
-                  <option id="pageFitOption" value="page-fit">Fit Page</option>
-                  <option id="pageWidthOption" value="page-width">Full Width</option>
-                  <option id="customScaleOption" value="custom"></option>
-                  <option value="0.5">50%</option>
-                  <option value="0.75">75%</option>
-                  <option value="1">100%</option>
-                  <option value="1.25">125%</option>
-                  <option value="1.5">150%</option>
-                  <option value="2">200%</option>
-                </select>
-              </span>
-            </div>
-          </div>
-        </div>
-        <menu type="context" id="viewerContextMenu">
-          <menuitem id="contextFirstPage" label="First Page"
-                    data-l10n-id="first_page"></menuitem>
-          <menuitem id="contextLastPage" label="Last Page"
-                    data-l10n-id="last_page"></menuitem>
-          <menuitem id="contextPageRotateCw" label="Rotate Clockwise"
-                    data-l10n-id="page_rotate_cw"></menuitem>
-          <menuitem id="contextPageRotateCcw" label="Rotate Counter-Clockwise"
-                    data-l10n-id="page_rotate_ccw"></menuitem>
-        </menu>
-
-      </div> <!-- mainContainer -->
-
-      <div id="overlayContainer" class="hidden">
-        <div id="passwordOverlay" class="container hidden">
-          <div class="dialog">
-            <div class="row">
-              <p id="passwordText" data-l10n-id="password_label">Enter the password to open this PDF file:</p>
-            </div>
-            <div class="row">
-              <input type="password" id="password" class="toolbarField" />
-            </div>
-            <div class="buttonRow">
-              <button id="passwordCancel" class="overlayButton"><span data-l10n-id="password_cancel">Cancel</span></button>
-              <button id="passwordSubmit" class="overlayButton"><span data-l10n-id="password_ok">OK</span></button>
-            </div>
-          </div>
-        </div>
-        <div id="documentPropertiesOverlay" class="container hidden">
-          <div class="dialog">
-            <div class="row">
-              <span data-l10n-id="document_properties_file_name">File name:</span> <p id="fileNameField">-</p>
-            </div>
-            <div class="row">
-              <span data-l10n-id="document_properties_file_size">File size:</span> <p id="fileSizeField">-</p>
-            </div>
-            <div class="separator"></div>
-            <div class="row">
-              <span data-l10n-id="document_properties_title">Title:</span> <p id="titleField">-</p>
-            </div>
-            <div class="row">
-              <span data-l10n-id="document_properties_author">Author:</span> <p id="authorField">-</p>
-            </div>
-            <div class="row">
-              <span data-l10n-id="document_properties_subject">Subject:</span> <p id="subjectField">-</p>
-            </div>
-            <div class="row">
-              <span data-l10n-id="document_properties_keywords">Keywords:</span> <p id="keywordsField">-</p>
-            </div>
-            <div class="row">
-              <span data-l10n-id="document_properties_creation_date">Creation Date:</span> <p id="creationDateField">-</p>
-            </div>
-            <div class="row">
-              <span data-l10n-id="document_properties_modification_date">Modification Date:</span> <p id="modificationDateField">-</p>
-            </div>
-            <div class="row">
-              <span data-l10n-id="document_properties_creator">Creator:</span> <p id="creatorField">-</p>
-            </div>
-            <div class="separator"></div>
-            <div class="row">
-              <span data-l10n-id="document_properties_producer">PDF Producer:</span> <p id="producerField">-</p>
-            </div>
-            <div class="row">
-              <span data-l10n-id="document_properties_version">PDF Version:</span> <p id="versionField">-</p>
-            </div>
-            <div class="row">
-              <span data-l10n-id="document_properties_page_count">Page Count:</span> <p id="pageCountField">-</p>
-            </div>
-            <div class="buttonRow">
-              <button id="documentPropertiesClose" class="overlayButton"><span data-l10n-id="document_properties_close">Close</span></button>
-            </div>
-          </div>
-        </div>
-      </div>  <!-- overlayContainer -->
-
-      <div id="printContainer"></div>
-    </div>
-    <!-- END STUBS -->
   </body>
 </html>
diff --git a/extensions/b2g/viewer.js b/extensions/b2g/viewer.js
new file mode 100644
index 0000000..94bb77c
--- /dev/null
+++ b/extensions/b2g/viewer.js
@@ -0,0 +1,349 @@
+/* Copyright 2014 Mozilla Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* globals PDFJS, Promise */
+
+'use strict';
+
+PDFJS.useOnlyCssZoom = true;
+PDFJS.disableTextLayer = true;
+PDFJS.maxImageSize = 1024 * 1024;
+PDFJS.workerSrc = '../pdfjs-components/build/pdf.worker.js';
+PDFJS.cMapUrl = '../pdfjs-components/cmaps/';
+PDFJS.cMapPacked = true;
+
+var DEFAULT_SCALE_DELTA = 1.1;
+var MIN_SCALE = 0.25;
+var MAX_SCALE = 10.0;
+var DEFAULT_SCALE_VALUE = 'auto';
+
+var PDFViewerApplication = {
+  pdfDocument: null,
+  pdfViewer: null,
+  pdfHistory: null,
+  pdfLinkService: null,
+
+  open: function (params) {
+    var url = params.url, originalUrl = params.originalUrl;
+    var self = this;
+    this.setTitleUsingUrl(originalUrl);
+
+    // Loading document.
+    var loadingTask = PDFJS.getDocument(url);
+    loadingTask.onProgress = function (progressData) {
+      self.progress(progressData.loaded / progressData.total);
+    };
+    loadingTask.then(function (pdfDocument) {
+      // Document loaded, specifying document for the viewer.
+      this.pdfDocument = pdfDocument;
+      this.pdfViewer.setDocument(pdfDocument);
+      this.pdfLinkService.setDocument(pdfDocument);
+      this.pdfHistory.initialize(pdfDocument.fingerprint);
+
+      this.loadingBar.hide();
+      this.setTitleUsingMetadata(pdfDocument);
+    }.bind(this), function (exception) {
+      var message = exception && exception.message;
+      var loadingErrorMessage = mozL10n.get('loading_error', null,
+        'An error occurred while loading the PDF.');
+
+      if (exception instanceof PDFJS.InvalidPDFException) {
+        // change error message also for other builds
+        loadingErrorMessage = mozL10n.get('invalid_file_error', null,
+          'Invalid or corrupted PDF file.');
+      } else if (exception instanceof PDFJS.MissingPDFException) {
+        // special message for missing PDFs
+        loadingErrorMessage = mozL10n.get('missing_file_error', null,
+          'Missing PDF file.');
+      } else if (exception instanceof PDFJS.UnexpectedResponseException) {
+        loadingErrorMessage = mozL10n.get('unexpected_response_error', null,
+          'Unexpected server response.');
+      }
+
+      var moreInfo = {
+        message: message
+      };
+      self.error(loadingErrorMessage, moreInfo);
+      self.loadingBar.hide();
+    });
+  },
+
+  get loadingBar() {
+    var bar = new PDFJS.ProgressBar('#loadingBar', {});
+
+    return PDFJS.shadow(this, 'loadingBar', bar);
+  },
+
+  setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) {
+    this.url = url;
+    var title = PDFJS.getFileName(url) || url;
+    try {
+      title = decodeURIComponent(title);
+    } catch (e) {
+      // decodeURIComponent may throw URIError,
+      // fall back to using the unprocessed url in that case
+    }
+    this.setTitle(title);
+  },
+
+  setTitleUsingMetadata: function (pdfDocument) {
+    var self = this;
+    pdfDocument.getMetadata().then(function(data) {
+      var info = data.info, metadata = data.metadata;
+      self.documentInfo = info;
+      self.metadata = metadata;
+
+      // Provides some basic debug information
+      console.log('PDF ' + pdfDocument.fingerprint + ' [' +
+                  info.PDFFormatVersion + ' ' + (info.Producer || '-').trim() +
+                  ' / ' + (info.Creator || '-').trim() + ']' +
+                  ' (PDF.js: ' + (PDFJS.version || '-') +
+                  (!PDFJS.disableWebGL ? ' [WebGL]' : '') + ')');
+
+      var pdfTitle;
+      if (metadata && metadata.has('dc:title')) {
+        var title = metadata.get('dc:title');
+        // Ghostscript sometimes returns 'Untitled', so prevent setting the
+        // title to 'Untitled.
+        if (title !== 'Untitled') {
+          pdfTitle = title;
+        }
+      }
+
+      if (!pdfTitle && info && info['Title']) {
+        pdfTitle = info['Title'];
+      }
+
+      if (pdfTitle) {
+        self.setTitle(pdfTitle + ' - ' + document.title);
+      }
+    });
+  },
+
+  setTitle: function pdfViewSetTitle(title) {
+    document.title = title;
+    document.getElementById('activityTitle').textContent = title;
+  },
+
+  error: function pdfViewError(message, moreInfo) {
+    var moreInfoText = mozL10n.get('error_version_info',
+      {version: PDFJS.version || '?', build: PDFJS.build || '?'},
+      'PDF.js v{{version}} (build: {{build}})') + '\n';
+
+    if (moreInfo) {
+      moreInfoText +=
+        mozL10n.get('error_message', {message: moreInfo.message},
+          'Message: {{message}}');
+      if (moreInfo.stack) {
+        moreInfoText += '\n' +
+        mozL10n.get('error_stack', {stack: moreInfo.stack},
+          'Stack: {{stack}}');
+      } else {
+        if (moreInfo.filename) {
+          moreInfoText += '\n' +
+          mozL10n.get('error_file', {file: moreInfo.filename},
+            'File: {{file}}');
+        }
+        if (moreInfo.lineNumber) {
+          moreInfoText += '\n' +
+          mozL10n.get('error_line', {line: moreInfo.lineNumber},
+            'Line: {{line}}');
+        }
+      }
+    }
+
+    var errorWrapper = document.getElementById('errorWrapper');
+    errorWrapper.removeAttribute('hidden');
+
+    var errorMessage = document.getElementById('errorMessage');
+    errorMessage.textContent = message;
+
+    var closeButton = document.getElementById('errorClose');
+    closeButton.onclick = function() {
+      errorWrapper.setAttribute('hidden', 'true');
+    };
+
+    var errorMoreInfo = document.getElementById('errorMoreInfo');
+    var moreInfoButton = document.getElementById('errorShowMore');
+    var lessInfoButton = document.getElementById('errorShowLess');
+    moreInfoButton.onclick = function() {
+      errorMoreInfo.removeAttribute('hidden');
+      moreInfoButton.setAttribute('hidden', 'true');
+      lessInfoButton.removeAttribute('hidden');
+      errorMoreInfo.style.height = errorMoreInfo.scrollHeight + 'px';
+    };
+    lessInfoButton.onclick = function() {
+      errorMoreInfo.setAttribute('hidden', 'true');
+      moreInfoButton.removeAttribute('hidden');
+      lessInfoButton.setAttribute('hidden', 'true');
+    };
+    moreInfoButton.removeAttribute('hidden');
+    lessInfoButton.setAttribute('hidden', 'true');
+    errorMoreInfo.value = moreInfoText;
+  },
+
+  progress: function pdfViewProgress(level) {
+    var percent = Math.round(level * 100);
+    // Updating the bar if value increases.
+    if (percent > this.loadingBar.percent || isNaN(percent)) {
+      this.loadingBar.percent = percent;
+    }
+  },
+
+  get pagesCount() {
+    return this.pdfDocument.numPages;
+  },
+
+  set page(val) {
+    this.pdfViewer.currentPageNumber = val;
+  },
+
+  get page() {
+    return this.pdfViewer.currentPageNumber;
+  },
+
+  zoomIn: function pdfViewZoomIn(ticks) {
+    var newScale = this.pdfViewer.currentScale;
+    do {
+      newScale = (newScale * DEFAULT_SCALE_DELTA).toFixed(2);
+      newScale = Math.ceil(newScale * 10) / 10;
+      newScale = Math.min(MAX_SCALE, newScale);
+    } while (--ticks && newScale < MAX_SCALE);
+    this.pdfViewer.currentScaleValue = newScale;
+  },
+
+  zoomOut: function pdfViewZoomOut(ticks) {
+    var newScale = this.pdfViewer.currentScale;
+    do {
+      newScale = (newScale / DEFAULT_SCALE_DELTA).toFixed(2);
+      newScale = Math.floor(newScale * 10) / 10;
+      newScale = Math.max(MIN_SCALE, newScale);
+    } while (--ticks && newScale > MIN_SCALE);
+    this.pdfViewer.currentScaleValue = newScale;
+  },
+
+  initUI: function pdfViewInitUI() {
+    var linkService = new PDFJS.PDFLinkService();
+    this.pdfLinkService = linkService;
+
+    var container = document.getElementById('viewerContainer');
+    var pdfViewer = new PDFJS.PDFViewer({
+      container: container,
+      linkService: linkService
+    });
+    this.pdfViewer = pdfViewer;
+    linkService.setViewer(pdfViewer);
+
+    this.pdfHistory = new PDFJS.PDFHistory({
+      linkService: linkService
+    });
+    linkService.setHistory(this.pdfHistory);
+
+    document.getElementById('previous').addEventListener('click', function() {
+      PDFViewerApplication.page--;
+    });
+
+    document.getElementById('next').addEventListener('click', function() {
+      PDFViewerApplication.page++;
+    });
+
+    document.getElementById('zoomIn').addEventListener('click', function() {
+      PDFViewerApplication.zoomIn();
+    });
+
+    document.getElementById('zoomOut').addEventListener('click', function() {
+      PDFViewerApplication.zoomOut();
+    });
+
+    document.getElementById('pageNumber').addEventListener('click', function() {
+      this.select();
+    });
+
+    document.getElementById('pageNumber').addEventListener('change',
+        function() {
+      // Handle the user inputting a floating point number.
+      PDFViewerApplication.page = (this.value | 0);
+
+      if (this.value !== (this.value | 0).toString()) {
+        this.value = PDFViewerApplication.page;
+      }
+    });
+
+    container.addEventListener('pagesinit', function () {
+      // We can use pdfViewer now, e.g. let's change default scale.
+      pdfViewer.currentScaleValue = DEFAULT_SCALE_VALUE;
+    });
+
+    container.addEventListener('pagechange', function (evt) {
+      var page = evt.pageNumber;
+      if (evt.previousPageNumber !== page) {
+        document.getElementById('pageNumber').value = page;
+      }
+      var numPages = PDFViewerApplication.pagesCount;
+
+      document.getElementById('previous').disabled = (page <= 1);
+      document.getElementById('next').disabled = (page >= numPages);
+    }, true);
+  }
+};
+
+document.addEventListener('DOMContentLoaded', function () {
+  PDFViewerApplication.initUI();
+}, true);
+
+(function animationStartedClosure() {
+  // The offsetParent is not set until the PDF.js iframe or object is visible.
+  // Waiting for first animation.
+  PDFViewerApplication.animationStartedPromise = new Promise(
+    function (resolve) {
+      window.requestAnimationFrame(resolve);
+    });
+})();
+
+// Support of the new version of navigator.mozL10n -- in PDF.js older/custom
+// version is used.
+var mozL10n = {
+  get: function (id, args, fallback) {
+    var s = (navigator.mozL10n && navigator.mozL10n.get(id)) || fallback;
+    s = s.replace(/\{\{\s*(\w+)\s*\}\}/g, function (all, key) {
+      return args[key] || '';
+    });
+    return s;
+  },
+
+  translate: function (fragment) {
+    if (navigator.mozL10n) {
+      navigator.mozL10n.translateFragment(fragment);
+    }
+  }
+};
+
+window.navigator.mozSetMessageHandler('activity', function(activity) {
+  var blob = activity.source.data.blob;
+  var fileURL = activity.source.data.url ||
+                activity.source.data.filename ||
+                ' '; // if no url or filename, use a non-empty string
+
+  var url = URL.createObjectURL(blob);
+  // We need to delay opening until all HTML is loaded.
+  PDFViewerApplication.animationStartedPromise.then(function () {
+    PDFViewerApplication.open({url: url, originalUrl: fileURL});
+
+    var header = document.getElementById('header');
+    header.addEventListener('action', function() {
+      activity.postResult('close');
+    });
+  });
+});
diff --git a/make.js b/make.js
index 0c8380c..83aff5b 100644
--- a/make.js
+++ b/make.js
@@ -979,7 +979,8 @@ target.mozcentral = function() {
 };
 
 target.b2g = function() {
-  target.locale();
+  target.generic();
+  target.components();
 
   echo();
   echo('### Building B2G (Firefox OS App)');
@@ -991,9 +992,11 @@ target.b2g = function() {
   cd(ROOT_DIR);
   rm('-Rf', B2G_BUILD_DIR);
   mkdir('-p', B2G_BUILD_CONTENT_DIR);
-  mkdir('-p', B2G_BUILD_CONTENT_DIR + BUILD_DIR);
   mkdir('-p', B2G_BUILD_CONTENT_DIR + '/web');
-  mkdir('-p', B2G_BUILD_CONTENT_DIR + '/web/cmaps');
+  // Simulating pdfjs-dist structure in the pdfjs-components folder.
+  mkdir('-p', B2G_BUILD_CONTENT_DIR + '/pdfjs-components/web');
+  mkdir('-p', B2G_BUILD_CONTENT_DIR + '/pdfjs-components/build');
+  mkdir('-p', B2G_BUILD_CONTENT_DIR + '/pdfjs-components/cmaps');
 
   var setup = {
     defines: defines,
@@ -1001,14 +1004,21 @@ target.b2g = function() {
       ['extensions/b2g/images', B2G_BUILD_CONTENT_DIR + '/web'],
       ['extensions/b2g/viewer.html', B2G_BUILD_CONTENT_DIR + '/web'],
       ['extensions/b2g/viewer.css', B2G_BUILD_CONTENT_DIR + '/web'],
+      ['extensions/b2g/viewer.js', B2G_BUILD_CONTENT_DIR + '/web'],
       ['web/locale', B2G_BUILD_CONTENT_DIR + '/web'],
-      ['external/bcmaps/*', B2G_BUILD_CONTENT_DIR + '/web/cmaps'],
-      ['external/webL10n/l10n.js', B2G_BUILD_CONTENT_DIR + '/web']
+      ['build/generic/build/pdf.js',
+        B2G_BUILD_CONTENT_DIR + '/pdfjs-components/build'],
+      ['build/generic/build/pdf.worker.js',
+        B2G_BUILD_CONTENT_DIR + '/pdfjs-components/build'],
+      ['build/components/pdf_viewer.js',
+        B2G_BUILD_CONTENT_DIR + '/pdfjs-components/web'],
+      ['build/components/pdf_viewer.css',
+        B2G_BUILD_CONTENT_DIR + '/pdfjs-components/web'],
+      ['build/components/images',
+        B2G_BUILD_CONTENT_DIR + '/pdfjs-components/web'],
+      ['external/bcmaps/*', B2G_BUILD_CONTENT_DIR + '/pdfjs-components/cmaps']
     ],
-    preprocess: [
-      ['web/viewer.js', B2G_BUILD_CONTENT_DIR + '/web'],
-      [BUILD_TARGETS, B2G_BUILD_CONTENT_DIR + BUILD_DIR]
-    ]
+    preprocess: []
   };
   builder.build(setup);
 
diff --git a/web/pdf_viewer.component.js b/web/pdf_viewer.component.js
index c59e982..cb3dbad 100644
--- a/web/pdf_viewer.component.js
+++ b/web/pdf_viewer.component.js
@@ -17,7 +17,7 @@
 /*jshint globalstrict: false */
 /* globals PDFJS, PDFViewer, PDFPageView, TextLayerBuilder, PDFLinkService,
            DefaultTextLayerFactory, AnnotationsLayerBuilder, PDFHistory,
-           DefaultAnnotationsLayerFactory, getFileName */
+           DefaultAnnotationsLayerFactory, getFileName, ProgressBar */
 
 // Initializing PDFJS global object (if still undefined)
 if (typeof PDFJS === 'undefined') {
@@ -42,4 +42,5 @@ if (typeof PDFJS === 'undefined') {
   PDFJS.PDFHistory = PDFHistory;
 
   PDFJS.getFileName = getFileName;
+  PDFJS.ProgressBar = ProgressBar;
 }).call((typeof window === 'undefined') ? this : window);
diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js
index 75dcf32..a719d62 100644
--- a/web/pdf_viewer.js
+++ b/web/pdf_viewer.js
@@ -18,7 +18,7 @@
            SCROLLBAR_PADDING, VERTICAL_PADDING, MAX_AUTO_SCALE, CSS_UNITS,
            DEFAULT_SCALE, scrollIntoView, getVisibleElements, RenderingStates,
            PDFJS, Promise, TextLayerBuilder, PDFRenderingQueue,
-           AnnotationsLayerBuilder */
+           AnnotationsLayerBuilder, DEFAULT_SCALE_VALUE */
 
 'use strict';
 
@@ -149,7 +149,8 @@ var PDFViewer = (function pdfViewer() {
      * @returns {number}
      */
     get currentScale() {
-      return this._currentScale;
+      return this._currentScale !== UNKNOWN_SCALE ? this._currentScale :
+                                                    DEFAULT_SCALE;
     },
 
     /**
@@ -161,7 +162,7 @@ var PDFViewer = (function pdfViewer() {
       }
       if (!this.pdfDocument) {
         this._currentScale = val;
-        this._currentScaleValue = val.toString();
+        this._currentScaleValue = val !== UNKNOWN_SCALE ? val.toString() : null;
         return;
       }
       this._setScale(val, false);
@@ -265,7 +266,7 @@ var PDFViewer = (function pdfViewer() {
       // Fetch a single page so we can get a viewport that will be the default
       // viewport for all pages
       return firstPagePromise.then(function(pdfPage) {
-        var scale = this._currentScale || 1.0;
+        var scale = this.currentScale;
         var viewport = pdfPage.getViewport(scale * CSS_UNITS);
         for (var pageNum = 1; pageNum <= pagesCount; ++pageNum) {
           var textLayerFactory = null;
@@ -523,10 +524,10 @@ var PDFViewer = (function pdfViewer() {
           return;
       }
 
-      if (scale && scale !== this.currentScale) {
+      if (scale && scale !== this._currentScale) {
         this.currentScaleValue = scale;
-      } else if (this.currentScale === UNKNOWN_SCALE) {
-        this.currentScaleValue = DEFAULT_SCALE;
+      } else if (this._currentScale === UNKNOWN_SCALE) {
+        this.currentScaleValue = DEFAULT_SCALE_VALUE;
       }
 
       if (scale === 'page-fit' && !dest[4]) {
diff --git a/web/ui_utils.js b/web/ui_utils.js
index b8128f2..e58b771 100644
--- a/web/ui_utils.js
+++ b/web/ui_utils.js
@@ -17,7 +17,8 @@
 'use strict';
 
 var CSS_UNITS = 96.0 / 72.0;
-var DEFAULT_SCALE = 'auto';
+var DEFAULT_SCALE_VALUE = 'auto';
+var DEFAULT_SCALE = 1.0;
 var UNKNOWN_SCALE = 0;
 var MAX_AUTO_SCALE = 1.25;
 var SCROLLBAR_PADDING = 40;
diff --git a/web/viewer.js b/web/viewer.js
index ea09d86..fff17f4 100644
--- a/web/viewer.js
+++ b/web/viewer.js
@@ -22,8 +22,8 @@
            Promise, PDFLinkService, PDFOutlineView, PDFAttachmentView,
            OverlayManager, PDFFindController, PDFFindBar, getVisibleElements,
            watchScroll, PDFViewer, PDFRenderingQueue, PresentationModeState,
-           parseQueryString, RenderingStates, DEFAULT_SCALE, UNKNOWN_SCALE,
-           IGNORE_CURRENT_POSITION_ON_ZOOM: true */
+           parseQueryString, RenderingStates, UNKNOWN_SCALE,
+           DEFAULT_SCALE_VALUE, IGNORE_CURRENT_POSITION_ON_ZOOM: true */
 
 'use strict';
 
@@ -994,10 +994,10 @@ var PDFViewerApplication = {
       this.page = 1;
     }
 
-    if (this.pdfViewer.currentScale === UNKNOWN_SCALE) {
+    if (!this.pdfViewer.currentScaleValue) {
       // Scale was not initialized: invalid bookmark or scale was not specified.
       // Setting the default one.
-      this.setScale(DEFAULT_SCALE, true);
+      this.setScale(DEFAULT_SCALE_VALUE, true);
     }
   },
 
@@ -1903,7 +1903,7 @@ window.addEventListener('keydown', function keydown(evt) {
           // keeping it unhandled (to restore page zoom to 100%)
           setTimeout(function () {
             // ... and resetting the scale after browser adjusts its scale
-            PDFViewerApplication.setScale(DEFAULT_SCALE, true);
+            PDFViewerApplication.setScale(DEFAULT_SCALE_VALUE, true);
           });
           handled = false;
         }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/pdf.js.git



More information about the Pkg-javascript-commits mailing list