This repository has been archived by the owner on Mar 23, 2019. It is now read-only.
forked from diracdeltas/pdf.js
-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathpdfHandler.js
146 lines (132 loc) · 4.87 KB
/
pdfHandler.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/*
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.
*/
/* globals chrome */
'use strict'
chrome.extension.isAllowedFileSchemeAccess = (cb) => {
cb(true)
}
var VIEWER_URL = chrome.extension.getURL('content/web/viewer.html')
function getViewerURL (pdfUrl) {
return VIEWER_URL + '?file=' + encodeURIComponent(pdfUrl)
}
/**
* @param {Object} details First argument of the webRequest.onHeadersReceived
* event. The property "url" is read.
* @return {boolean} True if the PDF file should be downloaded.
*/
function isPdfDownloadable (details) {
if (details.url.indexOf('pdfjs.action=download') >= 0) {
return true
}
// Display the PDF viewer regardless of the Content-Disposition header if the
// file is displayed in the main frame, since most often users want to view
// a PDF, and servers are often misconfigured.
// If the query string contains "=download", do not unconditionally force the
// viewer to open the PDF, but first check whether the Content-Disposition
// header specifies an attachment. This allows sites like Google Drive to
// operate correctly (#6106).
if (details.type === 'main_frame' &&
details.url.indexOf('=download') === -1) {
return false
}
var cdHeader = (details.responseHeaders &&
getHeaderFromHeaders(details.responseHeaders, 'content-disposition'))
return (cdHeader && /^attachment/i.test(cdHeader.value))
}
/**
* Get the header from the list of headers for a given name.
* @param {Array} headers responseHeaders of webRequest.onHeadersReceived
* @return {undefined|{name: string, value: string}} The header, if found.
*/
function getHeaderFromHeaders (headers, headerName) {
for (var i = 0; i < headers.length; ++i) {
var header = headers[i]
if (header.name.toLowerCase() === headerName) {
return header
}
}
}
/**
* Check if the request is a PDF file.
* @param {Object} details First argument of the webRequest.onHeadersReceived
* event. The properties "responseHeaders" and "url"
* are read.
* @return {boolean} True if the resource is a PDF file.
*/
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
}
}
}
}
/**
* Takes a set of headers, and set "Content-Disposition: attachment".
* @param {Object} details First argument of the webRequest.onHeadersReceived
* event. The property "responseHeaders" is read and
* modified if needed.
* @return {Object|undefined} The return value for the onHeadersReceived event.
* Object with key "responseHeaders" if the headers
* have been modified, undefined otherwise.
*/
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 }
}
}
chrome.webRequest.onHeadersReceived.addListener(
function (details) {
if (details.method !== 'GET') {
// Don't intercept POST requests until http://crbug.com/104058 is fixed.
return
}
if (!isPdfFile(details)) {
return
}
if (isPdfDownloadable(details)) {
// Force download by ensuring that Content-Disposition: attachment is set
return getHeadersWithContentDispositionAttachment(details)
}
var viewerUrl = getViewerURL(details.url)
// Replace frame with viewer
if (chrome.ipcRenderer) {
chrome.ipcRenderer.send('load-url-requested', details.tabId, viewerUrl)
return { cancel: true }
}
},
{
urls: [
'<all_urls>'
],
types: ['main_frame']
},
['blocking', 'responseHeaders'])