diff --git a/extensions/chromium/extension-router.js b/extensions/chromium/extension-router.js index 07cac9b69..8f53cc118 100644 --- a/extensions/chromium/extension-router.js +++ b/extensions/chromium/extension-router.js @@ -22,6 +22,55 @@ limitations under the License. var VIEWER_URL = chrome.extension.getURL('content/web/viewer.html'); var CRX_BASE_URL = chrome.extension.getURL('/'); + /** + * @param {string} url The URL prefixed with chrome-extension://.../ + * @return {string|undefined} The percent-encoded URL of the (PDF) file. + */ + function parseExtensionURL(url) { + url = url.substring(CRX_BASE_URL.length); + var matchingUrl = /^(?:https?|file|ftp|chrome-extension)(:|%3A)/i.exec(url); + if (matchingUrl) { + url = url.split('#')[0]; + if (matchingUrl[1] === ':') { + url = encodeURIComponent(url); + } + return url; + } + } + + /** + * @param {string} url URL of PDF Viewer. + * @return {string|undefined} The percent-encoded URL of the (PDF) file. + */ + function parseViewerURL(url) { + if (url.lastIndexOf(VIEWER_URL, 0) !== 0) { + // Does not even start with the correct URL. Bye! + return; + } + url = url.match(/[&?]file=([^]+)/); + if (url) { + url = url[1]; + return url; + } + } + + /** + * @param {number} tabId ID of tab where the page action will be shown + * @param {string} url URL to be displayed in page action + */ + function showPageAction(tabId, displayUrl) { + var url = parseExtensionURL(displayUrl) || parseViewerURL(displayUrl); + if (url) { + chrome.pageAction.setPopup({ + tabId: tabId, + popup: 'pageActionPopup.html?file=' + url + }); + chrome.pageAction.show(tabId); + } else { + console.log('Unable to get PDF url from ' + displayUrl); + } + } + // 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 @@ -29,14 +78,8 @@ limitations under the License. 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); - } + var url = parseExtensionURL(details.url); + if (url) { url = VIEWER_URL + '?file=' + url; console.log('Redirecting ' + details.url + ' to ' + url); return { redirectUrl: url }; @@ -51,6 +94,15 @@ limitations under the License. ] }, ['blocking']); + chrome.runtime.onMessage.addListener(function(message, sender) { + if (message === 'showPageAction' && sender.tab) { + if (sender.tab.url === sender.url) { + // Only respond to messages from the top-level frame + showPageAction(sender.tab.id, sender.url); + } + } + }); + // When session restore is used, viewer pages may be loaded before the // webRequest event listener is attached (= page not found). // Reload these tabs. diff --git a/extensions/chromium/icon19.png b/extensions/chromium/icon19.png new file mode 100644 index 000000000..55f4628a6 Binary files /dev/null and b/extensions/chromium/icon19.png differ diff --git a/extensions/chromium/icon38.png b/extensions/chromium/icon38.png new file mode 100644 index 000000000..86afc6a1b Binary files /dev/null and b/extensions/chromium/icon38.png differ diff --git a/extensions/chromium/manifest.json b/extensions/chromium/manifest.json index b30aa40d5..b709b780d 100644 --- a/extensions/chromium/manifest.json +++ b/extensions/chromium/manifest.json @@ -21,6 +21,14 @@ "background": { "page": "pdfHandler.html" }, + "page_action": { + "default_icon": { + "19": "icon19.png", + "38": "icon38.png" + }, + "default_title": "Show PDF URL", + "default_popup": "pageActionPopup.html" + }, "incognito": "split", "web_accessible_resources": [ "getFrameId", diff --git a/extensions/chromium/pageActionPopup.html b/extensions/chromium/pageActionPopup.html new file mode 100644 index 000000000..93baed80a --- /dev/null +++ b/extensions/chromium/pageActionPopup.html @@ -0,0 +1,43 @@ + + + +
+