diff --git a/extensions/chromium/extension-router.js b/extensions/chromium/extension-router.js new file mode 100644 index 000000000..6ee6c29fb --- /dev/null +++ b/extensions/chromium/extension-router.js @@ -0,0 +1,54 @@ +/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set shiftwidth=2 tabstop=2 autoindent cindent expandtab: */ +/* +Copyright 2013 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 chrome */ + +'use strict'; +(function ExtensionRouterClosure() { + var VIEWER_URL = chrome.extension.getURL('content/web/viewer.html'); + var CRX_BASE_URL = chrome.extension.getURL('/'); + + // TODO(rob): Use declarativeWebRequest once declared URL-encoding is + // supported, see http://crbug.com/273589 + // (or rewrite the query string parser in viewer.js to get it to + // recognize the non-URL-encoded PDF URL.) + chrome.webRequest.onBeforeRequest.addListener(function(details) { + // This listener converts chrome-extension://.../http://...pdf to + // chrome-extension://.../content/web/viewer.html?file=http%3A%2F%2F...pdf + var url = details.url.substring(CRX_BASE_URL.length); + var matchingUrl = /^(?:https?|file|ftp|chrome-extension)(:|%3A)/.exec(url); + if (matchingUrl) { + // location.hash is restored when "#" is missing from URL. + url = url.split('#')[0]; + if (matchingUrl[1] === ':') { + url = encodeURIComponent(url); + } + url = VIEWER_URL + '?file=' + url; + console.log('Redirecting ' + details.url + ' to ' + url); + return { redirectUrl: url }; + } + }, { + types: ['main_frame', 'sub_frame'], + urls: [ + CRX_BASE_URL + 'http*', // and https + CRX_BASE_URL + 'file*', + CRX_BASE_URL + 'ftp*', + CRX_BASE_URL + 'chrome-extension*' + ] + }, ['blocking']); + console.log('Set up extension URL router.'); +})(); diff --git a/extensions/chromium/manifest.json b/extensions/chromium/manifest.json index 36c0ff1d9..b30aa40d5 100644 --- a/extensions/chromium/manifest.json +++ b/extensions/chromium/manifest.json @@ -24,6 +24,11 @@ "incognito": "split", "web_accessible_resources": [ "getFrameId", - "content/web/viewer.html" + "content/web/viewer.html", + "http:/*", + "https:/*", + "ftp:/*", + "file:/*", + "chrome-extension:/*" ] } diff --git a/extensions/chromium/pdfHandler.html b/extensions/chromium/pdfHandler.html index 7e6f6254d..dcb70cb31 100644 --- a/extensions/chromium/pdfHandler.html +++ b/extensions/chromium/pdfHandler.html @@ -16,3 +16,4 @@ limitations under the License. --> + diff --git a/web/viewer-snippet-chrome-extension.html b/web/viewer-snippet-chrome-extension.html new file mode 100644 index 000000000..e97f2f62c --- /dev/null +++ b/web/viewer-snippet-chrome-extension.html @@ -0,0 +1,5 @@ + + + + + diff --git a/web/viewer.html b/web/viewer.html index 3eb22ab06..6bac6b583 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -25,6 +25,9 @@ limitations under the License. + + + @@ -53,7 +56,7 @@ limitations under the License. - + diff --git a/web/viewer.js b/web/viewer.js index cbf166cfc..b2a1df078 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -670,15 +670,19 @@ var PDFView = { }, /** - * For the firefox extension we prefix the full url on anchor links so they - * don't come up as resource:// urls and so open in new tab/window works. - * @param {String} anchor The anchor hash include the #. + * Prefix the full url on anchor links to make sure that links are resolved + * relative to the current URL instead of the one defined in . + * @param {String} anchor The anchor hash, including the #. */ getAnchorUrl: function getAnchorUrl(anchor) { -//#if !(FIREFOX || MOZCENTRAL) +//#if !(FIREFOX || MOZCENTRAL || CHROME) return anchor; //#else +//#if CHROME +// return location.href.split('#')[0] + anchor; +//#else // return this.url.split('#')[0] + anchor; +//#endif //#endif }, @@ -1459,15 +1463,36 @@ var DocumentOutlineView = function documentOutlineView(outline) { } }; +//#if CHROME +//(function rewriteUrlClosure() { +// // Run this code outside DOMContentLoaded to make sure that the URL +// // is rewritten as soon as possible. +// if (location.origin + '/' !== chrome.extension.getURL('/')) { +// DEFAULT_URL = window.location.href.split('#')[0]; +// } else { +// var params = PDFView.parseQueryString(document.location.search.slice(1)); +// DEFAULT_URL = params.file || DEFAULT_URL; +// +// // Example: chrome-extension://.../http://example.com/file.pdf +// var humanReadableUrl = '/' + DEFAULT_URL + location.hash; +// history.replaceState(history.state, '', humanReadableUrl); +// } +//})(); +//#endif + document.addEventListener('DOMContentLoaded', function webViewerLoad(evt) { PDFView.initialize(); -//#if !(FIREFOX || MOZCENTRAL) +//#if !(FIREFOX || MOZCENTRAL || CHROME) var params = PDFView.parseQueryString(document.location.search.substring(1)); var file = params.file || DEFAULT_URL; //#else +//#if CHROME +//var file = DEFAULT_URL; +//#else //var file = window.location.href.split('#')[0]; //#endif +//#endif //#if CHROME //if (location.protocol !== 'chrome-extension:') {