Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: lib/contentPolicy.js

Issue 29329419: Issue 3208 - Unify handling of $document and $elemhide exceptions and improve performance (Closed)
Patch Set: Created Oct. 27, 2015, 2:28 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * This file is part of Adblock Plus <https://adblockplus.org/>, 2 * This file is part of Adblock Plus <https://adblockplus.org/>,
3 * Copyright (C) 2006-2015 Eyeo GmbH 3 * Copyright (C) 2006-2015 Eyeo GmbH
4 * 4 *
5 * Adblock Plus is free software: you can redistribute it and/or modify 5 * Adblock Plus is free software: you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 3 as 6 * it under the terms of the GNU General Public License version 3 as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
8 * 8 *
9 * Adblock Plus is distributed in the hope that it will be useful, 9 * Adblock Plus is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 if (!topWnd || !topWnd.location || !topWnd.location.href) 167 if (!topWnd || !topWnd.location || !topWnd.location.href)
168 return true; 168 return true;
169 169
170 let originWindow = Utils.getOriginWindow(wnd); 170 let originWindow = Utils.getOriginWindow(wnd);
171 let wndLocation = originWindow.location.href; 171 let wndLocation = originWindow.location.href;
172 let docDomain = getHostname(wndLocation); 172 let docDomain = getHostname(wndLocation);
173 let match = null; 173 let match = null;
174 let [sitekey, sitekeyWnd] = getSitekey(wnd); 174 let [sitekey, sitekeyWnd] = getSitekey(wnd);
175 let nogeneric = false; 175 let nogeneric = false;
176 176
177 function cleanWindowLocation(wnd)
Thomas Greiner 2015/11/10 18:22:33 This function doesn't need to be inside `processNo
Wladimir Palant 2015/11/10 19:13:15 Given that this is a temporary solution I'd rather
178 {
179 let url = getWindowLocation(wnd);
180 let index = url.indexOf("#");
181 if (index >= 0)
182 url = url.substring(0, index);
183
184 return url;
185 }
186
177 if (!match && Prefs.enabled) 187 if (!match && Prefs.enabled)
178 { 188 {
179 let testWnd = wnd; 189 let testWnd = wnd;
180 let testSitekey = sitekey; 190 let testSitekey = sitekey;
181 let testSitekeyWnd = sitekeyWnd; 191 let testSitekeyWnd = sitekeyWnd;
182 let parentWndLocation = getWindowLocation(testWnd); 192 let parentWndLocation = cleanWindowLocation(testWnd);
183 while (true) 193 while (true)
184 { 194 {
185 let testWndLocation = parentWndLocation; 195 let testWndLocation = parentWndLocation;
186 parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : getWi ndowLocation(testWnd.parent)); 196 parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : clean WindowLocation(testWnd.parent));
187 match = Policy.isWhitelisted(testWndLocation, parentWndLocation, testSit ekey); 197 let parentDocDomain = getHostname(parentWndLocation);
188 198
189 if (match instanceof WhitelistFilter) 199 let typeMap = RegExpFilter.typeMap.DOCUMENT;
200 if (contentType == Policy.type.ELEMHIDE)
201 typeMap = typeMap | RegExpFilter.typeMap.ELEMHIDE;
202 let whitelistMatch = defaultMatcher.matchesAny(testWndLocation, typeMap, parentDocDomain, false, sitekey);
Thomas Greiner 2015/11/10 18:22:34 `sitekey` is the bottom window's sitekey so should
Wladimir Palant 2015/11/10 19:13:15 Yes, this should really be testSitekey - this was
Wladimir Palant 2015/11/11 07:54:20 Done.
203 if (whitelistMatch instanceof WhitelistFilter)
190 { 204 {
191 FilterStorage.increaseHitCount(match, wnd); 205 FilterStorage.increaseHitCount(whitelistMatch, wnd);
192 RequestNotifier.addNodeData(testWnd.document, topWnd, Policy.type.DOCU MENT, getHostname(parentWndLocation), false, testWndLocation, match); 206 RequestNotifier.addNodeData(testWnd.document, topWnd,
207 (whitelistMatch.contentType & RegExpFilter.typeMap.DOCUMENT) ? Polic y.type.DOCUMENT : Policy.type.ELEMHIDE,
208 parentDocDomain, false, testWndLocation, whitelistMatch);
193 return true; 209 return true;
194 } 210 }
195 211
196 let genericType = (contentType == Policy.type.ELEMHIDE ? 212 let genericType = (contentType == Policy.type.ELEMHIDE ?
197 Policy.type.GENERICHIDE : 213 Policy.type.GENERICHIDE :
198 Policy.type.GENERICBLOCK); 214 Policy.type.GENERICBLOCK);
199 let parentDocDomain = getHostname(parentWndLocation);
200 let nogenericMatch = defaultMatcher.matchesAny(testWndLocation, 215 let nogenericMatch = defaultMatcher.matchesAny(testWndLocation,
201 Policy.typeMask[genericType], parentDocDomain, false, testSitekey); 216 Policy.typeMask[genericType], parentDocDomain, false, testSitekey);
202 if (nogenericMatch instanceof WhitelistFilter) 217 if (nogenericMatch instanceof WhitelistFilter)
203 { 218 {
204 nogeneric = true; 219 nogeneric = true;
205 220
206 FilterStorage.increaseHitCount(nogenericMatch, wnd); 221 FilterStorage.increaseHitCount(nogenericMatch, wnd);
207 RequestNotifier.addNodeData(testWnd.document, topWnd, genericType, 222 RequestNotifier.addNodeData(testWnd.document, topWnd, genericType,
208 parentDocDomain, false, testWndLocation, 223 parentDocDomain, false, testWndLocation,
209 nogenericMatch); 224 nogenericMatch);
(...skipping 12 matching lines...) Expand all
222 if (contentType == Policy.type.OBJECT_SUBREQUEST && node instanceof Ci.nsIDO MElement) 237 if (contentType == Policy.type.OBJECT_SUBREQUEST && node instanceof Ci.nsIDO MElement)
223 node = node.ownerDocument; 238 node = node.ownerDocument;
224 239
225 // Fix type for objects misrepresented as frames or images 240 // Fix type for objects misrepresented as frames or images
226 if (contentType != Policy.type.OBJECT && (node instanceof Ci.nsIDOMHTMLObjec tElement || node instanceof Ci.nsIDOMHTMLEmbedElement)) 241 if (contentType != Policy.type.OBJECT && (node instanceof Ci.nsIDOMHTMLObjec tElement || node instanceof Ci.nsIDOMHTMLEmbedElement))
227 contentType = Policy.type.OBJECT; 242 contentType = Policy.type.OBJECT;
228 243
229 let locationText = location.spec; 244 let locationText = location.spec;
230 if (!match && contentType == Policy.type.ELEMHIDE) 245 if (!match && contentType == Policy.type.ELEMHIDE)
231 { 246 {
232 let testWnd = wnd;
233 let parentWndLocation = getWindowLocation(testWnd);
234 while (true)
235 {
236 let testWndLocation = parentWndLocation;
237 parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : getWi ndowLocation(testWnd.parent));
238 let parentDocDomain = getHostname(parentWndLocation);
239 match = defaultMatcher.matchesAny(testWndLocation, RegExpFilter.typeMap. ELEMHIDE, parentDocDomain, false, sitekey);
240 if (match instanceof WhitelistFilter)
241 {
242 FilterStorage.increaseHitCount(match, wnd);
243 RequestNotifier.addNodeData(testWnd.document, topWnd, contentType, par entDocDomain, false, testWndLocation, match);
244 return true;
245 }
246
247 if (testWnd.parent == testWnd)
248 break;
249 else
250 testWnd = testWnd.parent;
251 }
252
253 match = location; 247 match = location;
254 locationText = match.text.replace(/^.*?#/, '#'); 248 locationText = match.text.replace(/^.*?#/, '#');
255 location = locationText; 249 location = locationText;
256 250
257 if (!match.isActiveOnDomain(docDomain)) 251 if (!match.isActiveOnDomain(docDomain))
258 return true; 252 return true;
259 253
260 let exception = ElemHide.getException(match, docDomain); 254 let exception = ElemHide.getException(match, docDomain);
261 if (exception) 255 if (exception)
262 { 256 {
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
725 if (!wnd || wnd.closed) 719 if (!wnd || wnd.closed)
726 return; 720 return;
727 721
728 if (entry.type == Policy.type.OBJECT) 722 if (entry.type == Policy.type.OBJECT)
729 { 723 {
730 node.removeEventListener("mouseover", objectMouseEventHander, true); 724 node.removeEventListener("mouseover", objectMouseEventHander, true);
731 node.removeEventListener("mouseout", objectMouseEventHander, true); 725 node.removeEventListener("mouseout", objectMouseEventHander, true);
732 } 726 }
733 Policy.processNode(wnd, node, entry.type, Utils.makeURI(entry.location), true) ; 727 Policy.processNode(wnd, node, entry.type, Utils.makeURI(entry.location), true) ;
734 } 728 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld