123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261 |
- "use strict";
- var VIEWER_URL = chrome.extension.getURL("content/web/viewer.html");
- function getViewerURL(pdf_url) {
- return VIEWER_URL + "?file=" + encodeURIComponent(pdf_url);
- }
- function isPdfDownloadable(details) {
- if (details.url.includes("pdfjs.action=download")) {
- return true;
- }
-
-
-
-
-
-
-
- if (details.type === "main_frame" && !details.url.includes("=download")) {
- return false;
- }
- var cdHeader =
- details.responseHeaders &&
- getHeaderFromHeaders(details.responseHeaders, "content-disposition");
- return cdHeader && /^attachment/i.test(cdHeader.value);
- }
- function getHeaderFromHeaders(headers, headerName) {
- for (const header of headers) {
- if (header.name.toLowerCase() === headerName) {
- return header;
- }
- }
- return undefined;
- }
- function isPdfFile(details) {
- var header = getHeaderFromHeaders(details.responseHeaders, "content-type");
- if (header) {
- var headerValue = header.value.toLowerCase().split(";", 1)[0].trim();
- if (headerValue === "application/pdf") {
- return true;
- }
- if (headerValue === "application/octet-stream") {
- if (details.url.toLowerCase().indexOf(".pdf") > 0) {
- return true;
- }
- var cdHeader = getHeaderFromHeaders(
- details.responseHeaders,
- "content-disposition"
- );
- if (cdHeader && /\.pdf(["']|$)/i.test(cdHeader.value)) {
- return true;
- }
- }
- }
- return false;
- }
- function getHeadersWithContentDispositionAttachment(details) {
- var headers = details.responseHeaders;
- var cdHeader = getHeaderFromHeaders(headers, "content-disposition");
- if (!cdHeader) {
- cdHeader = { name: "Content-Disposition" };
- headers.push(cdHeader);
- }
- if (!/^attachment/i.test(cdHeader.value)) {
- cdHeader.value = "attachment" + cdHeader.value.replace(/^[^;]+/i, "");
- return { responseHeaders: headers };
- }
- return undefined;
- }
- chrome.webRequest.onHeadersReceived.addListener(
- function (details) {
- if (details.method !== "GET") {
-
- return undefined;
- }
- if (!isPdfFile(details)) {
- return undefined;
- }
- if (isPdfDownloadable(details)) {
-
- return getHeadersWithContentDispositionAttachment(details);
- }
- var viewerUrl = getViewerURL(details.url);
-
- saveReferer(details);
- return { redirectUrl: viewerUrl };
- },
- {
- urls: ["<all_urls>"],
- types: ["main_frame", "sub_frame"],
- },
- ["blocking", "responseHeaders"]
- );
- chrome.webRequest.onBeforeRequest.addListener(
- function (details) {
- if (isPdfDownloadable(details)) {
- return undefined;
- }
- var viewerUrl = getViewerURL(details.url);
- return { redirectUrl: viewerUrl };
- },
- {
- urls: [
- "file://*/*.pdf",
- "file://*/*.PDF",
- ...
- (MediaError.prototype.hasOwnProperty("message")
- ? []
- : [
-
-
- "ftp://*/*.pdf",
- "ftp://*/*.PDF",
- ]),
- ],
- types: ["main_frame", "sub_frame"],
- },
- ["blocking"]
- );
- chrome.extension.isAllowedFileSchemeAccess(function (isAllowedAccess) {
- if (isAllowedAccess) {
- return;
- }
-
-
-
-
-
- chrome.webNavigation.onBeforeNavigate.addListener(
- function (details) {
- if (details.frameId === 0 && !isPdfDownloadable(details)) {
- chrome.tabs.update(details.tabId, {
- url: getViewerURL(details.url),
- });
- }
- },
- {
- url: [
- {
- urlPrefix: "file://",
- pathSuffix: ".pdf",
- },
- {
- urlPrefix: "file://",
- pathSuffix: ".PDF",
- },
- ],
- }
- );
- });
- chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) {
- if (message && message.action === "getParentOrigin") {
-
-
- if (!sender.tab) {
- sendResponse("");
- return undefined;
- }
-
-
-
-
- var parentUrl = sender.tab.url;
- if (!parentUrl) {
- sendResponse("");
- return undefined;
- }
- if (parentUrl.lastIndexOf("file:", 0) === 0) {
- sendResponse("file://");
- return undefined;
- }
-
-
- var origin = /^[^:]+:\/\/[^/]+/.exec(parentUrl);
- sendResponse(origin ? origin[1] : parentUrl);
- return true;
- }
- if (message && message.action === "isAllowedFileSchemeAccess") {
- chrome.extension.isAllowedFileSchemeAccess(sendResponse);
- return true;
- }
- if (message && message.action === "openExtensionsPageForFileAccess") {
- var url = "chrome://extensions/?id=" + chrome.runtime.id;
- if (message.data.newTab) {
- chrome.tabs.create({
- windowId: sender.tab.windowId,
- index: sender.tab.index + 1,
- url,
- openerTabId: sender.tab.id,
- });
- } else {
- chrome.tabs.update(sender.tab.id, {
- url,
- });
- }
- }
- return undefined;
- });
- chrome.storage.local.remove([
- "featureDetectLastUA",
- "webRequestRedirectUrl",
- "extensionSupportsFTP",
- ]);
|