diff --git a/make.js b/make.js index df732ce1e..fa04b6c1d 100755 --- a/make.js +++ b/make.js @@ -6,6 +6,7 @@ var ROOT_DIR = __dirname + '/', // absolute path to project's root BUILD_DIR = 'build/', BUILD_TARGET = BUILD_DIR + 'pdf.js', FIREFOX_BUILD_DIR = BUILD_DIR + '/firefox/', + CHROME_BUILD_DIR = BUILD_DIR + '/chrome/', EXTENSION_SRC_DIR = 'extensions/', LOCALE_SRC_DIR = 'l10n/', GH_PAGES_DIR = BUILD_DIR + 'gh-pages/', @@ -107,6 +108,8 @@ target.web = function() { cp('-R', GENERIC_DIR + '/*', GH_PAGES_DIR); cp(FIREFOX_BUILD_DIR + '/*.xpi', FIREFOX_BUILD_DIR + '/*.rdf', GH_PAGES_DIR + EXTENSION_SRC_DIR + 'firefox/'); + cp(CHROME_BUILD_DIR + '/*.crx', FIREFOX_BUILD_DIR + '/*.rdf', + GH_PAGES_DIR + EXTENSION_SRC_DIR + 'chrome/'); cp('web/index.html.template', GH_PAGES_DIR + '/index.html'); cd(GH_PAGES_DIR); @@ -258,6 +261,7 @@ target.pagesrepo = function() { mkdir('-p', GH_PAGES_DIR + '/web/images'); mkdir('-p', GH_PAGES_DIR + BUILD_DIR); mkdir('-p', GH_PAGES_DIR + EXTENSION_SRC_DIR + '/firefox'); + mkdir('-p', GH_PAGES_DIR + EXTENSION_SRC_DIR + '/chrome'); }; @@ -574,6 +578,70 @@ target.chrome = function() { ] }; builder.build(setup); + + // Bundle the files to a Chrome extension file .crx if path to key is set + var pem = env['PDFJS_CHROME_KEY']; + if (!pem) { + return; + } + + echo(); + echo('### Bundling .crx extension into ' + CHROME_BUILD_DIR); + + if (!test('-f', pem)) { + echo('Incorrect PDFJS_CHROME_KEY path'); + exit(1); + } + + var browserManifest = env['PDF_BROWSERS'] || + 'test/resources/browser_manifests/browser_manifest.json'; + + if (!test('-f', browserManifest)) { + echo('Browser manifest file ' + browserManifest + ' does not exist.'); + echo('Try copying one of the examples in test/resources/browser_manifests'); + exit(1); + } + + try { + var manifest = JSON.parse(cat(browserManifest)); + } catch (e) { + echo('Malformed browser manifest file'); + echo(e.message); + exit(1); + } + + var executable; + manifest.forEach(function(browser) { + if (browser.name === 'chrome') { + executable = browser.path; + } + }); + + // If there was no chrome entry in the browser manifest, exit + if(!executable) { + echo('There was no \'chrome\' entry in the browser manifest'); + exit(1); + } + + // If we're on a Darwin (Mac) OS, then let's check for an .app path + if (process.platform === 'darwin' && executable.indexOf('.app') !== -1) { + executable = executable + '/Contents/MacOS/Google Chrome'); + } + + // If the chrome executable doesn't exist + if(!test('-f', executable)) { + echo('Incorrect executable path to chrome'); + exit(1); + } + + // Let chrome pack the extension for us + exec('"' + executable + '"' + + ' --no-message-box' + + ' "--pack-extension=' + ROOT_DIR + CHROME_BUILD_DIR + '"' + + ' "--pack-extension-key=' + pem + '"'); + + // Rename to pdf.js.crx + mv(BUILD_DIR + 'chrome.crx', CHROME_BUILD_DIR + 'pdf.js.crx'); }; diff --git a/web/viewer.js b/web/viewer.js index f93c5247b..0d88aae23 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -385,7 +385,13 @@ var PDFView = { setTitleUsingUrl: function pdfViewSetTitleUsingUrl(url) { this.url = url; - document.title = decodeURIComponent(getFileName(url)) || url; + try { + document.title = decodeURIComponent(getFileName(url)) || url; + } catch (e) { + // decodeURIComponent may throw URIError, + // fall back to using the unprocessed url in that case + document.title = url; + } }, open: function pdfViewOpen(url, scale, password) {