diff --git a/extensions/firefox/chrome-mozcentral.manifest b/extensions/firefox/chrome-mozcentral.manifest new file mode 100644 index 000000000..2618c476b --- /dev/null +++ b/extensions/firefox/chrome-mozcentral.manifest @@ -0,0 +1,3 @@ +resource pdf.js content/ +component {6457a96b-2d68-439a-bcfa-44465fbcdbb1} components/PdfStreamConverter.js +contract @mozilla.org/streamconv;1?from=application/pdf&to=*/* {6457a96b-2d68-439a-bcfa-44465fbcdbb1} diff --git a/make.js b/make.js index 88f7c69a0..7862b1dc5 100755 --- a/make.js +++ b/make.js @@ -377,9 +377,10 @@ target.mozcentral = function() { echo('### Building mozilla-central extension'); var MOZCENTRAL_DIR = BUILD_DIR + 'mozcentral/', - MOZCENTRAL_EXTENSION_DIR = MOZCENTRAL_DIR + 'browser/app/profile/extensions/uriloader@pdf.js/', + MOZCENTRAL_EXTENSION_DIR = MOZCENTRAL_DIR + 'browser/extensions/pdfjs/', MOZCENTRAL_CONTENT_DIR = MOZCENTRAL_EXTENSION_DIR + 'content/', MOZCENTRAL_L10N_DIR = MOZCENTRAL_DIR + 'browser/locales/en-US/pdfviewer/', + MOZCENTRAL_TEST_DIR = MOZCENTRAL_EXTENSION_DIR + 'test/', FIREFOX_CONTENT_DIR = EXTENSION_SRC_DIR + '/firefox/content/', FIREFOX_EXTENSION_FILES_TO_COPY = ['*.js', @@ -393,8 +394,7 @@ target.mozcentral = function() { DEFAULT_LOCALE_FILES = [LOCALE_SRC_DIR + 'en-US/viewer.properties'], FIREFOX_MC_EXTENSION_FILES = - ['bootstrap.js', - 'icon.png', + ['icon.png', 'icon64.png', 'chrome.manifest', 'components', @@ -415,6 +415,8 @@ target.mozcentral = function() { // Copy extension files cd('extensions/firefox'); cp('-R', FIREFOX_EXTENSION_FILES_TO_COPY, ROOT_DIR + MOZCENTRAL_EXTENSION_DIR); + mv('-f', ROOT_DIR + MOZCENTRAL_EXTENSION_DIR + '/chrome-mozcentral.manifest', + ROOT_DIR + MOZCENTRAL_EXTENSION_DIR + '/chrome.manifest') cd(ROOT_DIR); // Copy a standalone version of pdf.js inside the content directory @@ -457,6 +459,11 @@ target.mozcentral = function() { extensionFiles += file+'\n'; }); extensionFiles.to('extension-files'); + cd(ROOT_DIR); + + // Copy test files + mkdir('-p', MOZCENTRAL_TEST_DIR); + cp('-Rf', 'test/mozcentral/*', MOZCENTRAL_TEST_DIR); }; // diff --git a/test/mozcentral/Makefile.in b/test/mozcentral/Makefile.in new file mode 100644 index 000000000..8c9face17 --- /dev/null +++ b/test/mozcentral/Makefile.in @@ -0,0 +1,21 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this file, +# You can obtain one at http://mozilla.org/MPL/2.0/. + +DEPTH = ../../../.. +topsrcdir = @top_srcdir@ +srcdir = @srcdir@ +VPATH = @srcdir@ +relativesrcdir = browser/extensions/pdfjs/test + +include $(DEPTH)/config/autoconf.mk +include $(topsrcdir)/config/rules.mk + +_BROWSER_TEST_FILES = \ + head.js \ + browser_pdfjs_main.js \ + file_pdfjs_test.pdf \ + $(NULL) + +libs:: $(_BROWSER_TEST_FILES) + $(INSTALL) $(foreach f,$^,"$f") $(DEPTH)/_tests/testing/mochitest/browser/$(relativesrcdir) diff --git a/test/mozcentral/browser_pdfjs_main.js b/test/mozcentral/browser_pdfjs_main.js new file mode 100644 index 000000000..d3f5dd646 --- /dev/null +++ b/test/mozcentral/browser_pdfjs_main.js @@ -0,0 +1,102 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +const RELATIVE_DIR = "browser/extensions/pdfjs/test/"; +const TESTROOT = "http://example.com/browser/" + RELATIVE_DIR; + +function test() { + waitForExplicitFinish(); + + var tab = gBrowser.addTab(TESTROOT + "file_pdfjs_test.pdf"); + var newTabBrowser = gBrowser.getBrowserForTab(tab); + newTabBrowser.addEventListener("pagechange", function onPageChange() { + newTabBrowser.removeEventListener("pagechange", onPageChange, true); + + var document = newTabBrowser.contentDocument, + window = newTabBrowser.contentWindow; + + // + // Overall sanity tests + // + ok(document.querySelector('div#viewer'), "document content has viewer UI"); + ok('PDFJS' in window.wrappedJSObject, "window content has PDFJS object"); + + // + // Sidebar: open + // + var sidebar = document.querySelector('button#sidebarToggle'), + outerContainer = document.querySelector('div#outerContainer'); + + sidebar.click(); + ok(outerContainer.classList.contains('sidebarOpen'), 'sidebar opens on click'); + + // Thumbnails are created asynchronously - wait for them + waitForElement(document, 'canvas#thumbnail2', function(error) { + if (error) + finish(); + + // + // Page change from thumbnail click + // + var pageNumber = document.querySelector('input#pageNumber'); + is(parseInt(pageNumber.value), 1, 'initial page is 1'); + + var thumbnail = document.querySelector('canvas#thumbnail2'); + ok(thumbnail, 'thumbnail2 is available'); + if (thumbnail) { + thumbnail.click(); + is(parseInt(pageNumber.value), 2, 'clicking on thumbnail changes page'); + } + + // + // Sidebar: close + // + sidebar.click(); + ok(!outerContainer.classList.contains('sidebarOpen'), 'sidebar closes on click'); + + // + // Page change from prev/next buttons + // + var prevPage = document.querySelector('button#previous'), + nextPage = document.querySelector('button#next'); + + nextPage.click(); + is(parseInt(pageNumber.value), 2, 'page increases after clicking on next'); + + prevPage.click(); + is(parseInt(pageNumber.value), 1, 'page decreases after clicking on previous'); + + // + // Bookmark button + // + var viewBookmark = document.querySelector('a#viewBookmark'); + viewBookmark.click(); + ok(viewBookmark.href.length > 0, 'viewBookmark button has href'); + + // + // Zoom in/out + // + var zoomOut = document.querySelector('button.zoomOut'), + zoomIn = document.querySelector('button.zoomIn'); + + // Zoom in + var oldWidth = document.querySelector('canvas#page1').width; + zoomIn.click(); + var newWidth = document.querySelector('canvas#page1').width; + ok(oldWidth < newWidth, 'zooming in increases page width (old: '+oldWidth+', new: '+newWidth+')'); + + // Zoom out + var oldWidth = document.querySelector('canvas#page1').width; + zoomOut.click(); + var newWidth = document.querySelector('canvas#page1').width; + ok(oldWidth > newWidth, 'zooming out decreases page width (old: '+oldWidth+', new: '+newWidth+')'); + + finish(); + }); + }, true, true); + + registerCleanupFunction(function() { + gBrowser.removeTab(tab); + }); +} diff --git a/test/mozcentral/file_pdfjs_test.pdf b/test/mozcentral/file_pdfjs_test.pdf new file mode 100644 index 000000000..ea5ebe395 Binary files /dev/null and b/test/mozcentral/file_pdfjs_test.pdf differ diff --git a/test/mozcentral/head.js b/test/mozcentral/head.js new file mode 100644 index 000000000..6ee421b2f --- /dev/null +++ b/test/mozcentral/head.js @@ -0,0 +1,21 @@ +// Waits for element 'el' to exist in the DOM of 'doc' before executing 'callback' +// Useful when elements are created asynchronously, e.g. after a Web Worker task +function waitForElement(doc, el, callback) { + var time = 0, + interval = 10, + timeout = 5000; + + var checkEl = setInterval(function() { + if (doc.querySelector(el)) { + clearInterval(checkEl); + if (callback) callback(); + } + + time += interval; + if (time > timeout) { + ok(false, 'waitForElement timed out on element: '+el); + clearInterval(checkEl); + if (callback) callback(true); + } + }, interval); +}