forked from tombfix/patch
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathfilt.js
More file actions
200 lines (173 loc) · 5.17 KB
/
filt.js
File metadata and controls
200 lines (173 loc) · 5.17 KB
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
(function(){
const TYPE_DOCUMENT = IContentPolicy.TYPE_DOCUMENT;
const REDIRECTION_LIMIT = getPrefValue('network.http.redirection-limit') || 20;
// 初期化されていないか?
// (アプリケーションを通じて一度だけ通過する)
var filt = grobal.filt;
var checked = {};
var disabled = false;
if(!filt){
var dir = getPatchDir();
filt = grobal.filt = {
conds : {},
debug : false,
files : {
host : dir.clone(),
regexp : dir.clone(),
},
};
filt.files.host.append('filt.host.txt');
filt.files.regexp.append('filt.regexp.txt');
ObserverService.addObserver(filt, 'http-on-modify-request', false);
setInterval(function(){
checked = {};
}, 3 * 60 * 1000);
reloadList();
}
// policyチェックが開始する前に起きる通信をブロックする
// (画像などで先読みが行われているよう)
filt.observe = function(subject, topic, data){
try{
var channel = subject.QueryInterface(IHttpChannel);
// リダイレクトしている場合はメインページとして開いているか元コンテンツなので通す
// (カウンタなどリダイレクトする画像はブロックできない)
if(channel.referrer && (REDIRECTION_LIMIT == channel.redirectionLimit) && isBlock(channel.URI))
subject.cancel(Cr.NS_BINDING_ABORTED);
}catch(e){
error(e);
return;
}
};
loadPolicies.push(function(contentType, contentLocation, requestOrigin, context, mimeTypeGuess, extra){
try{
// メインページとして開かれた場合は無条件に通す
var url = contentLocation.spec;
if(contentType == TYPE_DOCUMENT)
return checked[url] = false;
return isBlock(contentLocation);
}catch(e){
error(e);
return false;
}
});
function isBlock(uri){
if(disabled)
return;
var url = uri.spec;
// observeかpolicyで処理済みか(または最近アクセスされ判定済みか)?
var res = checked[url];
if(res != null)
return res;
var host = uri.host;
var hosts = filt.conds.hosts;
for(var i=0, len=hosts.length ; i<len ; i++){
if(host.lastIndexOf(hosts[i]) != -1){
if(filt.debug)
log([host, hosts[i]]);
return checked[url] = true;;
}
}
var regexps = filt.conds.regexps;
for(var i=0, len=regexps.length ; i<len ; i++){
if(regexps[i].test(url)){
if(filt.debug)
log([url, ''+regexps[i]]);
return checked[url] = true;;
}
}
return checked[url] = false;
}
function reloadList(){
filt.conds.hosts = loadList('host');
filt.conds.regexps = loadList('regexp').map(function(r){
return new RegExp(r);
});
checked = {};
}
function loadList(type){
// 重複定義を省く
var lines = keys(getContents(filt.files[type]).split(/[\n\r]+/).reduce(function(memo, r){
if(r)
memo[r] = r;
return memo;
}, {})).sort();
putContents(filt.files[type], lines.join('\n') + '\n');
return lines;
}
Tombloo.Service.actions.register({
name : 'filt',
type : 'menu',
icon : "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAFWSURBVHjaYvz//z8DJQAggJgYKAQAAUSxAQABxILC285SyfD6rwKDGDMDAwcbAwM7FwMDrwADA6ckEMsxMPy8y8DAJvOAQXpNO0wLQACxoBl4C4jbGLgYgQqBUpwcQJoXiIGGsIowMPx6xMDAyByCrAEggFC94PlnLZDcz/AVGLCcIFdwAjXzAzULMzD8/QCU+r+fQWrlWmQtAAGEGQaizDlAb/xmePsDIfbjPhA/+M3AoZyDrhwggDAN8PxzDUjOYkCRAbqG4d8sBomF19CVAwQQ9lgQZa5nePXjLcP7twwMX54CA+/VWwYOxXpsSgECiAGUkLDivRzZ/7cx/v9/kv///3tO2bjUAQQQvnQwi+EvwzWGvyAv/ZyFSxFAAOE2wOn7bwbm/08Y/v19wqB45DcuZQABxII3mQkKbmPg5serBCCAGCnNTAABRHFeAAggig0ACDAAHjd13iiV8AcAAAAASUVORK5CYII=",
children : [
{
name : 'Disable',
check : function(){
this.name = ((disabled)? 'Enable' : 'Disable');
return true;
},
execute : function(){
disabled = !disabled;
},
},
{
name : 'Reload List',
execute : reloadList,
},
{
name : 'Open Host List',
execute : partial(openInEditor, filt.files.host),
},
{
name : 'Open RegExp List',
execute : partial(openInEditor, filt.files.regexp),
},
{
name : 'Debug - On',
check : function(){
this.name = 'Debug - ' + ((filt.debug)? 'Off' : 'On');
return true;
},
execute : function(){
filt.debug = !filt.debug;
// デバッグをオンの場合はキャッシュをクリアして確認できるようにする
if(filt.debug)
checked = {};
},
},
],
}, '----');
})();
connect(grobal, 'content-ready', function(win){
var non = function(){};
var names = 'urchinTracker __utmSetVar pageTracker _gat'.split(' ');
names.forEach(function(name){
win[name] = non;
});
var pageTracker = {
_setDomainName : non,
_initData : non,
_trackPageview : non,
_trackEvent : non,
};
win._gat = {
_getTracker : function(){
return pageTracker;
},
}
win.pageTracker = pageTracker;
names.forEach(function(name){
sealProp(win, name);
});
function sealProp(obj, prop){
Object.defineProperty(obj, prop, {
configurable : false,
enumerable : false,
writable : false,
value : obj[prop],
});
obj = obj[prop];
if(typeof(obj)=='object')
for(var prop in obj)
sealProp(obj, prop);
}
});