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

Delta Between Two Patch Sets: lib/contentPolicy.js

Issue 4559243822759936: Issue 431/432 - Remove special handling for the $sitekey option (Closed)
Left Patch Set: Created July 28, 2014, 2:44 p.m.
Right Patch Set: Made changes for WebKit bug 132872 Created Sept. 1, 2014, 3:27 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « no previous file | lib/filterClasses.js » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 /* 1 /*
2 * This file is part of Adblock Plus <http://adblockplus.org/>, 2 * This file is part of Adblock Plus <http://adblockplus.org/>,
3 * Copyright (C) 2006-2014 Eyeo GmbH 3 * Copyright (C) 2006-2014 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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 processNode: function(wnd, node, contentType, location, collapse) 155 processNode: function(wnd, node, contentType, location, collapse)
156 { 156 {
157 let topWnd = wnd.top; 157 let topWnd = wnd.top;
158 if (!topWnd || !topWnd.location || !topWnd.location.href) 158 if (!topWnd || !topWnd.location || !topWnd.location.href)
159 return true; 159 return true;
160 160
161 let originWindow = Utils.getOriginWindow(wnd); 161 let originWindow = Utils.getOriginWindow(wnd);
162 let wndLocation = originWindow.location.href; 162 let wndLocation = originWindow.location.href;
163 let docDomain = getHostname(wndLocation); 163 let docDomain = getHostname(wndLocation);
164 let match = null; 164 let match = null;
165 let [sitekey, sitekeyWnd] = getSitekey(wnd);
165 if (!match && Prefs.enabled) 166 if (!match && Prefs.enabled)
166 { 167 {
167 let testWnd = wnd; 168 let testWnd = wnd;
169 let testSitekey = sitekey;
170 let testSitekeyWnd = sitekeyWnd;
168 let parentWndLocation = getWindowLocation(testWnd); 171 let parentWndLocation = getWindowLocation(testWnd);
169 while (true) 172 while (true)
170 { 173 {
171 let testWndLocation = parentWndLocation; 174 let testWndLocation = parentWndLocation;
172 parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : getWi ndowLocation(testWnd.parent)); 175 parentWndLocation = (testWnd == testWnd.parent ? testWndLocation : getWi ndowLocation(testWnd.parent));
173 176 match = Policy.isWhitelisted(testWndLocation, parentWndLocation, testSit ekey);
174 let siteKey = getSiteKey(node, testWnd);
175 match = Policy.isWhitelisted(testWndLocation, parentWndLocation, siteKey );
Wladimir Palant 2014/08/01 10:50:21 The logic here seems wrong to me. I've extended th
Thomas Greiner 2014/08/11 17:18:15 Done.
176 177
177 if (match instanceof WhitelistFilter) 178 if (match instanceof WhitelistFilter)
178 { 179 {
179 FilterStorage.increaseHitCount(match, wnd); 180 FilterStorage.increaseHitCount(match, wnd);
180 RequestNotifier.addNodeData(testWnd.document, topWnd, Policy.type.DOCU MENT, getHostname(parentWndLocation), false, testWndLocation, match); 181 RequestNotifier.addNodeData(testWnd.document, topWnd, Policy.type.DOCU MENT, getHostname(parentWndLocation), false, testWndLocation, match);
181 return true; 182 return true;
182 } 183 }
183 184
184 if (testWnd.parent == testWnd) 185 if (testWnd.parent == testWnd)
185 break; 186 break;
186 else 187
187 testWnd = testWnd.parent; 188 if (testWnd == testSitekeyWnd)
189 [testSitekey, testSitekeyWnd] = getSitekey(testWnd.parent);
190 testWnd = testWnd.parent;
188 } 191 }
189 } 192 }
190 193
191 // Data loaded by plugins should be attached to the document 194 // Data loaded by plugins should be attached to the document
192 if (contentType == Policy.type.OBJECT_SUBREQUEST && node instanceof Ci.nsIDO MElement) 195 if (contentType == Policy.type.OBJECT_SUBREQUEST && node instanceof Ci.nsIDO MElement)
193 node = node.ownerDocument; 196 node = node.ownerDocument;
194 197
195 // Fix type for objects misrepresented as frames or images 198 // Fix type for objects misrepresented as frames or images
196 if (contentType != Policy.type.OBJECT && (node instanceof Ci.nsIDOMHTMLObjec tElement || node instanceof Ci.nsIDOMHTMLEmbedElement)) 199 if (contentType != Policy.type.OBJECT && (node instanceof Ci.nsIDOMHTMLObjec tElement || node instanceof Ci.nsIDOMHTMLEmbedElement))
197 contentType = Policy.type.OBJECT; 200 contentType = Policy.type.OBJECT;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 FilterStorage.increaseHitCount(exception, wnd); 236 FilterStorage.increaseHitCount(exception, wnd);
234 RequestNotifier.addNodeData(node, topWnd, contentType, docDomain, thirdP arty, locationText, exception); 237 RequestNotifier.addNodeData(node, topWnd, contentType, docDomain, thirdP arty, locationText, exception);
235 return true; 238 return true;
236 } 239 }
237 } 240 }
238 241
239 let thirdParty = (contentType == Policy.type.ELEMHIDE ? false : isThirdParty (location, docDomain)); 242 let thirdParty = (contentType == Policy.type.ELEMHIDE ? false : isThirdParty (location, docDomain));
240 243
241 if (!match && Prefs.enabled) 244 if (!match && Prefs.enabled)
242 { 245 {
243 let docLocation = getWindowLocation(wnd); 246 match = defaultMatcher.matchesAny(locationText, Policy.typeDescr[contentTy pe] || "", docDomain, thirdParty, sitekey);
244 let siteKey = getSiteKey(node, wnd);
245 match = defaultMatcher.matchesAny(locationText, Policy.typeDescr[contentTy pe] || "", docDomain, thirdParty, docLocation, siteKey);
246 if (match instanceof BlockingFilter && node.ownerDocument && !(contentType in Policy.nonVisual)) 247 if (match instanceof BlockingFilter && node.ownerDocument && !(contentType in Policy.nonVisual))
247 { 248 {
248 let prefCollapse = (match.collapse != null ? match.collapse : !Prefs.fas tcollapse); 249 let prefCollapse = (match.collapse != null ? match.collapse : !Prefs.fas tcollapse);
249 if (collapse || prefCollapse) 250 if (collapse || prefCollapse)
250 schedulePostProcess(node); 251 schedulePostProcess(node);
251 } 252 }
252 253
253 // Track mouse events for objects 254 // Track mouse events for objects
254 if (!match && contentType == Policy.type.OBJECT && node.nodeType == Ci.nsI DOMNode.ELEMENT_NODE) 255 if (!match && contentType == Policy.type.OBJECT && node.nodeType == Ci.nsI DOMNode.ELEMENT_NODE)
255 { 256 {
(...skipping 16 matching lines...) Expand all
272 * @return {Boolean} 273 * @return {Boolean}
273 */ 274 */
274 isBlockableScheme: function(location) 275 isBlockableScheme: function(location)
275 { 276 {
276 return !(location.scheme in Policy.whitelistSchemes); 277 return !(location.scheme in Policy.whitelistSchemes);
277 }, 278 },
278 279
279 /** 280 /**
280 * Checks whether a page is whitelisted. 281 * Checks whether a page is whitelisted.
281 * @param {String} url 282 * @param {String} url
282 * @param {String} parentUrl location of the parent page 283 * @param {String} [parentUrl] location of the parent page
283 * @param {String} siteKey public key provided on the page 284 * @param {String} [sitekey] public key provided on the page
284 * @return {Filter} filter that matched the URL or null if not whitelisted 285 * @return {Filter} filter that matched the URL or null if not whitelisted
285 */ 286 */
286 isWhitelisted: function(url, parentUrl, siteKey) 287 isWhitelisted: function(url, parentUrl, sitekey)
Wladimir Palant 2014/08/01 10:50:21 If you change the parameters here you probably wan
Thomas Greiner 2014/08/11 17:18:15 Done.
287 { 288 {
288 if (!url) 289 if (!url)
289 return null; 290 return null;
290 291
291 // Do not apply exception rules to schemes on our whitelistschemes list. 292 // Do not apply exception rules to schemes on our whitelistschemes list.
292 let match = /^([\w\-]+):/.exec(url); 293 let match = /^([\w\-]+):/.exec(url);
293 if (match && match[1] in Policy.whitelistSchemes) 294 if (match && match[1] in Policy.whitelistSchemes)
294 return null; 295 return null;
295 296
296 if (!parentUrl) 297 if (!parentUrl)
297 parentUrl = url; 298 parentUrl = url;
Wladimir Palant 2014/08/01 10:50:21 If parentUrl is no longer optional then this code
Thomas Greiner 2014/08/11 17:18:15 Technically, it's still optional since it's only r
298 299
299 // Ignore fragment identifier 300 // Ignore fragment identifier
300 let index = url.indexOf("#"); 301 let index = url.indexOf("#");
301 if (index >= 0) 302 if (index >= 0)
302 url = url.substring(0, index); 303 url = url.substring(0, index);
303 304
304 let result = defaultMatcher.matchesAny(url, "DOCUMENT", getHostname(parentUr l), false, parentUrl, siteKey); 305 let result = defaultMatcher.matchesAny(url, "DOCUMENT", getHostname(parentUr l), false, sitekey);
305 return (result instanceof WhitelistFilter ? result : null); 306 return (result instanceof WhitelistFilter ? result : null);
306 }, 307 },
307 308
308 /** 309 /**
309 * Checks whether the page loaded in a window is whitelisted. 310 * Checks whether the page loaded in a window is whitelisted for indication in the UI.
310 * @param wnd {nsIDOMWindow} 311 * @param wnd {nsIDOMWindow}
311 * @return {Filter} matching exception rule or null if not whitelisted 312 * @return {Filter} matching exception rule or null if not whitelisted
312 */ 313 */
313 isWindowWhitelisted: function(wnd) 314 isWindowWhitelisted: function(wnd)
314 { 315 {
315 return Policy.isWhitelisted(getWindowLocation(wnd)); 316 return Policy.isWhitelisted(getWindowLocation(wnd));
316 }, 317 },
317
318 318
319 /** 319 /**
320 * Asynchronously re-checks filters for given nodes. 320 * Asynchronously re-checks filters for given nodes.
321 */ 321 */
322 refilterNodes: function(/**Node[]*/ nodes, /**RequestEntry*/ entry) 322 refilterNodes: function(/**Node[]*/ nodes, /**RequestEntry*/ entry)
323 { 323 {
324 // Ignore nodes that have been blocked already 324 // Ignore nodes that have been blocked already
325 if (entry.filter && !(entry.filter instanceof WhitelistFilter)) 325 if (entry.filter && !(entry.filter instanceof WhitelistFilter))
326 return; 326 return;
327 327
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
669 } 669 }
670 catch(e) 670 catch(e)
671 { 671 {
672 return null; 672 return null;
673 } 673 }
674 } 674 }
675 675
676 /** 676 /**
677 * Retrieves the sitekey of a window. 677 * Retrieves the sitekey of a window.
678 */ 678 */
679 function getSiteKey(node, wnd) 679 function getSitekey(wnd)
Wladimir Palant 2014/08/01 10:50:21 Why pass in node parameter that isn't used?
Thomas Greiner 2014/08/11 17:18:15 Done.
680 { 680 {
681 if (wnd.document && wnd.document.documentElement) 681 let sitekey = null;
682 return wnd.document.documentElement.getAttribute("data-adblockkey"); 682
683 683 while (true)
684 return null; 684 {
685 if (wnd.document && wnd.document.documentElement)
686 {
687 let keydata = wnd.document.documentElement.getAttribute("data-adblockkey") ;
688 if (keydata && keydata.indexOf("_") >= 0)
689 {
690 let [key, signature] = keydata.split("_", 2);
691 key = key.replace(/=/g, "");
692
693 // Website specifies a key but is the signature valid?
694 let uri = Services.io.newURI(getWindowLocation(wnd), null, null);
695 let host = uri.asciiHost;
696 if (uri.port > 0)
697 host += ":" + uri.port;
698 let params = [
699 uri.path.replace(/#.*/, ""), // REQUEST_URI
700 host, // HTTP_HOST
701 Utils.httpProtocol.userAgent // HTTP_USER_AGENT
702 ];
703 if (Utils.verifySignature(key, signature, params.join("\0")))
704 return [key, wnd];
705 }
706 }
707
708 if (wnd === wnd.parent)
709 break;
710
711 wnd = wnd.parent;
712 }
713
714 return [sitekey, wnd];
685 } 715 }
686 716
687 /** 717 /**
688 * Retrieves the location of a window. 718 * Retrieves the location of a window.
689 * @param wnd {nsIDOMWindow} 719 * @param wnd {nsIDOMWindow}
690 * @return {String} window location or null on failure 720 * @return {String} window location or null on failure
691 */ 721 */
692 function getWindowLocation(wnd) 722 function getWindowLocation(wnd)
693 { 723 {
694 if ("name" in wnd && wnd.name == "messagepane") 724 if ("name" in wnd && wnd.name == "messagepane")
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
759 if (!wnd || wnd.closed) 789 if (!wnd || wnd.closed)
760 return; 790 return;
761 791
762 if (entry.type == Policy.type.OBJECT) 792 if (entry.type == Policy.type.OBJECT)
763 { 793 {
764 node.removeEventListener("mouseover", objectMouseEventHander, true); 794 node.removeEventListener("mouseover", objectMouseEventHander, true);
765 node.removeEventListener("mouseout", objectMouseEventHander, true); 795 node.removeEventListener("mouseout", objectMouseEventHander, true);
766 } 796 }
767 Policy.processNode(wnd, node, entry.type, Utils.makeURI(entry.location), true) ; 797 Policy.processNode(wnd, node, entry.type, Utils.makeURI(entry.location), true) ;
768 } 798 }
LEFTRIGHT

Powered by Google App Engine
This is Rietveld