123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- /*
- 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.
- */
- "use strict";
- (function ExtensionRouterClosure() {
- var VIEWER_URL = chrome.extension.getURL("content/web/viewer.html");
- var CRX_BASE_URL = chrome.extension.getURL("/");
- var schemes = [
- "http",
- "https",
- "ftp",
- "file",
- "chrome-extension",
- "blob",
- "data",
- // Chromium OS
- "filesystem",
- // Chromium OS, shorthand for filesystem:<origin>/external/
- "drive",
- ];
- /**
- * @param {string} url The URL prefixed with chrome-extension://.../
- * @returns {string|undefined} The percent-encoded URL of the (PDF) file.
- */
- function parseExtensionURL(url) {
- url = url.substring(CRX_BASE_URL.length);
- // Find the (url-encoded) colon and verify that the scheme is allowed.
- var schemeIndex = url.search(/:|%3A/i);
- if (schemeIndex === -1) {
- return undefined;
- }
- var scheme = url.slice(0, schemeIndex).toLowerCase();
- if (schemes.includes(scheme)) {
- url = url.split("#")[0];
- if (url.charAt(schemeIndex) === ":") {
- url = encodeURIComponent(url);
- }
- return url;
- }
- return undefined;
- }
- // 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 = parseExtensionURL(details.url);
- if (url) {
- url = VIEWER_URL + "?file=" + url;
- var i = details.url.indexOf("#");
- if (i > 0) {
- url += details.url.slice(i);
- }
- console.log("Redirecting " + details.url + " to " + url);
- return { redirectUrl: url };
- }
- return undefined;
- },
- {
- types: ["main_frame", "sub_frame"],
- urls: schemes.map(function (scheme) {
- // Format: "chrome-extension://[EXTENSIONID]/<scheme>*"
- return CRX_BASE_URL + scheme + "*";
- }),
- },
- ["blocking"]
- );
- // When session restore is used, viewer pages may be loaded before the
- // webRequest event listener is attached (= page not found).
- // Or the extension could have been crashed (OOM), leaving a sad tab behind.
- // Reload these tabs.
- chrome.tabs.query(
- {
- url: CRX_BASE_URL + "*:*",
- },
- function (tabsFromLastSession) {
- for (const { id } of tabsFromLastSession) {
- chrome.tabs.reload(id);
- }
- }
- );
- console.log("Set up extension URL router.");
- Object.keys(localStorage).forEach(function (key) {
- // The localStorage item is set upon unload by chromecom.js.
- var parsedKey = /^unload-(\d+)-(true|false)-(.+)/.exec(key);
- if (parsedKey) {
- var timeStart = parseInt(parsedKey[1], 10);
- var isHidden = parsedKey[2] === "true";
- var url = parsedKey[3];
- if (Date.now() - timeStart < 3000) {
- // Is it a new item (younger than 3 seconds)? Assume that the extension
- // just reloaded, so restore the tab (work-around for crbug.com/511670).
- chrome.tabs.create({
- url:
- chrome.runtime.getURL("restoretab.html") +
- "?" +
- encodeURIComponent(url) +
- "#" +
- encodeURIComponent(localStorage.getItem(key)),
- active: !isHidden,
- });
- }
- localStorage.removeItem(key);
- }
- });
- })();
|