forked from gorhill/uBlock
-
Notifications
You must be signed in to change notification settings - Fork 99
/
vapi-webrequest.js
119 lines (104 loc) · 4.69 KB
/
vapi-webrequest.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
/*******************************************************************************
uBlock - a browser extension to block requests.
Copyright (C) 2018 The uBlock authors
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see {http://www.gnu.org/licenses/}.
Home: https://github.com/gorhill/uBlock
*/
/* global self, safari, SafariBrowserTab, µBlock */
// For background page
'use strict';
/******************************************************************************/
vAPI.net = {
onBeforeRequest: {},
onBeforeMaybeSpuriousCSPReport: {},
onHeadersReceived: {},
nativeCSPReportFiltering: false
};
vAPI.net.registerListeners = function() {
var µb = µBlock,
µburi = µb.URI;
// Until Safari has more specific events, those are instead handled
// in the onBeforeRequestAdapter; clean them up so they're garbage-collected
vAPI.net.onBeforeSendHeaders = null;
var onBeforeRequest = vAPI.net.onBeforeRequest,
onBeforeRequestClient = onBeforeRequest.callback,
onHeadersReceivedClient = vAPI.net.onHeadersReceived.callback;
// https://github.com/el1t/uBlock-Safari/issues/32
// Ignore directives
var shouldBlockResponseHeader = {
script: /script-src/,
worker: /child-src/
};
var onBeforeRequestAdapter = function(e) {
if ( e.name !== 'canLoad' ) {
return;
}
e.stopPropagation && e.stopPropagation();
switch ( e.message.type ) {
case 'main_frame':
vAPI.tabs.onNavigation({
url: e.message.url,
frameId: 0,
tabId: vAPI.tabs.getTabId(e.target).toString()
});
e.message.hostname = µburi.hostnameFromURI(e.message.url);
e.message.tabId = vAPI.tabs.getTabId(e.target);
e.message.responseHeaders = [];
onBeforeRequestClient(e.message);
var blockVerdict = onHeadersReceivedClient(e.message);
blockVerdict = blockVerdict && blockVerdict.responseHeaders && blockVerdict.responseHeaders[0] &&
shouldBlockResponseHeader.script.test(blockVerdict.responseHeaders[0].value);
e.message = {
shouldBlock: blockVerdict === true
};
return;
case 'popup':
var openerTabId = vAPI.tabs.getTabId(e.target).toString();
var shouldBlock = !!vAPI.tabs.onPopupUpdated('preempt', openerTabId, e.message.url);
if ( !shouldBlock ) {
vAPI.tabs.popupCandidate = openerTabId;
}
e.message = {
shouldBlock: shouldBlock
};
break;
case 'popstate':
// No return value/message
vAPI.tabs.onUpdated(vAPI.tabs.getTabId(e.target), {
url: e.message.url
}, {
url: e.message.url
});
break;
case 'worker':
e.message.type = 'sub_frame';
e.message.hostname = µburi.hostnameFromURI(e.message.url);
e.message.tabId = vAPI.tabs.getTabId(e.target);
e.message.responseHeaders = [];
var blockVerdict = onHeadersReceivedClient(e.message);
blockVerdict = blockVerdict && blockVerdict.responseHeaders && blockVerdict.responseHeaders[0] &&
shouldBlockResponseHeader.worker.test(blockVerdict.responseHeaders[0].value);
e.message = {
shouldBlock: blockVerdict === true
}
return;
default:
e.message.hostname = µburi.hostnameFromURI(e.message.url);
e.message.tabId = vAPI.tabs.getTabId(e.target);
var blockVerdict = onBeforeRequestClient(e.message) || {};
blockVerdict.shouldBlock = blockVerdict.cancel === true || blockVerdict.redirectUrl !== undefined;
e.message = blockVerdict;
return;
}
};
safari.application.addEventListener('message', onBeforeRequestAdapter, true);
};