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 @@ + + + + + + + + + + + diff --git a/extensions/chromium/pageActionPopup.js b/extensions/chromium/pageActionPopup.js new file mode 100644 index 000000000..0c3c18459 --- /dev/null +++ b/extensions/chromium/pageActionPopup.js @@ -0,0 +1,22 @@ +/* Copyright 2012 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. + */ +var url = location.search.match(/[&?]file=([^&]+)/i); +if (url) { + url = decodeURIComponent(url[1]); + document.body.textContent = url; + // Set cursor to end of the content-editable section. + getSelection().selectAllChildren(document.body); + getSelection().collapseToEnd(); +} diff --git a/web/pdf_history.js b/web/pdf_history.js index e1a32f43b..c63a109a0 100644 --- a/web/pdf_history.js +++ b/web/pdf_history.js @@ -143,6 +143,9 @@ var PDFHistory = { window.history.pushState(stateObj, '', document.URL); //#else // window.history.pushState(stateObj, ''); +//#endif +//#if CHROME +// chrome.runtime.sendMessage('showPageAction'); //#endif } }, diff --git a/web/viewer.js b/web/viewer.js index 9ea0388d3..8e591bc09 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -1530,6 +1530,7 @@ var DocumentOutlineView = function documentOutlineView(outline) { // // Example: chrome-extension://.../http://example.com/file.pdf // var humanReadableUrl = '/' + DEFAULT_URL + location.hash; // history.replaceState(history.state, '', humanReadableUrl); +// chrome.runtime.sendMessage('showPageAction'); // } //})(); //#endif