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

Delta Between Two Patch Sets: include.postload.js

Issue 6463903206735872: Issue 1606 - Don't create overlays for hidden elements (Closed)
Left Patch Set: Created Nov. 25, 2014, 4:30 p.m.
Right Patch Set: Use offsetParent Created Nov. 25, 2014, 5:15 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 | no next file » | 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 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 function getAbsolutePosition(elt) { 183 function getAbsolutePosition(elt) {
184 var l = 0; 184 var l = 0;
185 var t = 0; 185 var t = 0;
186 for(; elt; elt = elt.offsetParent) { 186 for(; elt; elt = elt.offsetParent) {
187 l += elt.offsetLeft; 187 l += elt.offsetLeft;
188 t += elt.offsetTop; 188 t += elt.offsetTop;
189 } 189 }
190 return [l, t]; 190 return [l, t];
191 } 191 }
192 192
193 function isDisplayed(element)
194 {
195 while (element)
196 {
197 if (getComputedStyle(element).display == "none")
198 return false;
199
200 element = element.parentElement;
201 }
202
203 return true;
204 }
205
206 // Adds an overlay to an element, which is probably a Flash object 193 // Adds an overlay to an element, which is probably a Flash object
207 function addElementOverlay(elt) { 194 function addElementOverlay(elt) {
208 // If this element is enclosed in an object tag, we prefer to block that inste ad 195 // If this element is enclosed in an object tag, we prefer to block that inste ad
209 if(!elt) 196 if(!elt)
210 return null; 197 return null;
211 198
212 // If element doesn't have at least one of class name, ID or URL, give up 199 // If element doesn't have at least one of class name, ID or URL, give up
213 // because we don't know how to construct a filter rule for it 200 // because we don't know how to construct a filter rule for it
214 if(!hasFilters(elt)) 201 if(!hasFilters(elt))
215 return; 202 return;
216 203
217 // If the element isn't rendered (since its or one of its ancestor's 204 // If the element isn't rendered (since its or one of its ancestor's
218 // "diplay" property is "none"), the overlay wouldn't match the element. 205 // "diplay" property is "none"), the overlay wouldn't match the element.
Wladimir Palant 2014/11/26 13:10:18 Nit: "display"
219 if (!isDisplayed(elt)) 206 if (!elt.offsetParent)
Wladimir Palant 2014/11/26 13:10:18 What about elements that use visibility:hidden or
Sebastian Noack 2014/11/26 13:15:07 We don't have to bother about those. In that case
220 return; 207 return;
221 208
222 var thisStyle = getComputedStyle(elt, null); 209 var thisStyle = getComputedStyle(elt, null);
223 var overlay = document.createElement('div'); 210 var overlay = document.createElement('div');
224 overlay.prisoner = elt; 211 overlay.prisoner = elt;
225 overlay.className = "__adblockplus__overlay"; 212 overlay.className = "__adblockplus__overlay";
226 overlay.setAttribute('style', 'opacity:0.4; background-color:#ffffff; display: inline-box; ' + 'width:' + thisStyle.width + '; height:' + thisStyle.height + '; position:absolute; overflow:hidden; -webkit-box-sizing:border-box; z-index: 999 99'); 213 overlay.setAttribute('style', 'opacity:0.4; background-color:#ffffff; display: inline-box; ' + 'width:' + thisStyle.width + '; height:' + thisStyle.height + '; position:absolute; overflow:hidden; -webkit-box-sizing:border-box; z-index: 999 99');
227 var pos = getAbsolutePosition(elt); 214 var pos = getAbsolutePosition(elt);
228 overlay.style.left = pos[0] + "px"; 215 overlay.style.left = pos[0] + "px";
229 overlay.style.top = pos[1] + "px"; 216 overlay.style.top = pos[1] + "px";
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
280 // If we are already selecting, abort now 267 // If we are already selecting, abort now
281 if (clickHide_activated || clickHideFiltersDialog) 268 if (clickHide_activated || clickHideFiltersDialog)
282 clickHide_deactivate(); 269 clickHide_deactivate();
283 270
284 // Add overlays for elements with URLs so user can easily click them 271 // Add overlays for elements with URLs so user can easily click them
285 var elts = document.querySelectorAll('object,embed,img,iframe,video,audio,pict ure'); 272 var elts = document.querySelectorAll('object,embed,img,iframe,video,audio,pict ure');
286 for(var i=0; i<elts.length; i++) 273 for(var i=0; i<elts.length; i++)
287 addElementOverlay(elts[i]); 274 addElementOverlay(elts[i]);
288 275
289 clickHide_activated = true; 276 clickHide_activated = true;
290 document.addEventListener("mouseover", clickHide_mouseOver, false); 277 document.addEventListener("mouseover", clickHide_mouseOver, true);
291 document.addEventListener("mouseout", clickHide_mouseOut, false); 278 document.addEventListener("mouseout", clickHide_mouseOut, true);
292 document.addEventListener("click", clickHide_mouseClick, false); 279 document.addEventListener("click", clickHide_mouseClick, true);
293 document.addEventListener("keydown", clickHide_keyDown, false); 280 document.addEventListener("keydown", clickHide_keyDown, true);
294 } 281 }
295 282
296 // Called when user has clicked on something and we are waiting for confirmation 283 // Called when user has clicked on something and we are waiting for confirmation
297 // on whether the user actually wants these filters 284 // on whether the user actually wants these filters
298 function clickHide_rulesPending() { 285 function clickHide_rulesPending() {
299 clickHide_activated = false; 286 clickHide_activated = false;
300 document.removeEventListener("mouseover", clickHide_mouseOver, false); 287 document.removeEventListener("mouseover", clickHide_mouseOver, true);
301 document.removeEventListener("mouseout", clickHide_mouseOut, false); 288 document.removeEventListener("mouseout", clickHide_mouseOut, true);
302 document.removeEventListener("click", clickHide_mouseClick, false); 289 document.removeEventListener("click", clickHide_mouseClick, true);
303 document.removeEventListener("keydown", clickHide_keyDown, false); 290 document.removeEventListener("keydown", clickHide_keyDown, true);
304 } 291 }
305 292
306 // Turn off click-to-hide 293 // Turn off click-to-hide
307 function clickHide_deactivate() 294 function clickHide_deactivate()
308 { 295 {
309 if (clickHideFiltersDialog) 296 if (clickHideFiltersDialog)
310 { 297 {
311 document.body.removeChild(clickHideFiltersDialog); 298 document.body.removeChild(clickHideFiltersDialog);
312 clickHideFiltersDialog = null; 299 clickHideFiltersDialog = null;
313 } 300 }
314 301
315 if(currentElement) { 302 if(currentElement) {
316 currentElement.removeEventListener("contextmenu", clickHide_elementClickHand ler, false); 303 currentElement.removeEventListener("contextmenu", clickHide_elementClickHand ler, false);
317 unhighlightElements(); 304 unhighlightElements();
318 unhighlightElement(currentElement); 305 unhighlightElement(currentElement);
319 currentElement = null; 306 currentElement = null;
320 clickHideFilters = null; 307 clickHideFilters = null;
321 } 308 }
322 unhighlightElements(); 309 unhighlightElements();
323 310
324 clickHide_activated = false; 311 clickHide_activated = false;
325 clickHide_filters = null; 312 clickHide_filters = null;
326 if(!document) 313 if(!document)
327 return; // This can happen inside a nuked iframe...I think 314 return; // This can happen inside a nuked iframe...I think
328 document.removeEventListener("mouseover", clickHide_mouseOver, false); 315 document.removeEventListener("mouseover", clickHide_mouseOver, true);
329 document.removeEventListener("mouseout", clickHide_mouseOut, false); 316 document.removeEventListener("mouseout", clickHide_mouseOut, true);
330 document.removeEventListener("click", clickHide_mouseClick, false); 317 document.removeEventListener("click", clickHide_mouseClick, true);
331 document.removeEventListener("keydown", clickHide_keyDown, false); 318 document.removeEventListener("keydown", clickHide_keyDown, true);
332 319
333 // Remove overlays 320 // Remove overlays
334 // For some reason iterating over the array returend by getElementsByClassName () doesn't work 321 // For some reason iterating over the array returend by getElementsByClassName () doesn't work
335 var elt; 322 var elt;
336 while(elt = document.querySelector('.__adblockplus__overlay')) 323 while(elt = document.querySelector('.__adblockplus__overlay'))
337 elt.parentNode.removeChild(elt); 324 elt.parentNode.removeChild(elt);
338 } 325 }
339 326
340 function clickHide_elementClickHandler(ev) { 327 function clickHide_elementClickHandler(ev) {
341 ev.preventDefault(); 328 ev.preventDefault();
(...skipping 11 matching lines...) Expand all
353 while (target.parentNode && !hasFilters(target)) 340 while (target.parentNode && !hasFilters(target))
354 target = target.parentNode; 341 target = target.parentNode;
355 if (target == document.documentElement || target == document.body) 342 if (target == document.documentElement || target == document.body)
356 target = null; 343 target = null;
357 344
358 if (target && target instanceof HTMLElement) 345 if (target && target instanceof HTMLElement)
359 { 346 {
360 currentElement = target; 347 currentElement = target;
361 348
362 highlightElement(target, "#d6d84b", "#f8fa47"); 349 highlightElement(target, "#d6d84b", "#f8fa47");
363 target.addEventListener("contextmenu", clickHide_elementClickHandler, false) ; 350 target.addEventListener("contextmenu", clickHide_elementClickHandler, true);
364 } 351 }
365 } 352 }
366 353
367 // No longer hovering over this element so unhighlight it 354 // No longer hovering over this element so unhighlight it
368 function clickHide_mouseOut(e) 355 function clickHide_mouseOut(e)
369 { 356 {
370 if (!clickHide_activated || !currentElement) 357 if (!clickHide_activated || !currentElement)
371 return; 358 return;
372 359
373 unhighlightElement(currentElement); 360 unhighlightElement(currentElement);
374 currentElement.removeEventListener("contextmenu", clickHide_elementClickHandle r, false); 361 currentElement.removeEventListener("contextmenu", clickHide_elementClickHandle r, true);
375 } 362 }
376 363
377 // Selects the currently hovered-over filter or cancels selection 364 // Selects the currently hovered-over filter or cancels selection
378 function clickHide_keyDown(e) 365 function clickHide_keyDown(e)
379 { 366 {
380 if (!e.ctrlKey && !e.altKey && !e.shiftKey && e.keyCode == 13 /*DOM_VK_RETURN* /) 367 if (!e.ctrlKey && !e.altKey && !e.shiftKey && e.keyCode == 13 /*DOM_VK_RETURN* /)
381 clickHide_mouseClick(e); 368 clickHide_mouseClick(e);
382 else if (!e.ctrlKey && !e.altKey && !e.shiftKey && e.keyCode == 27 /*DOM_VK_ES CAPE*/) 369 else if (!e.ctrlKey && !e.altKey && !e.shiftKey && e.keyCode == 27 /*DOM_VK_ES CAPE*/)
383 { 370 {
384 ext.backgroundPage.sendMessage( 371 ext.backgroundPage.sendMessage(
(...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 // exists before continuing to avoid "Uncaught ReferenceError: ext is not define d". 595 // exists before continuing to avoid "Uncaught ReferenceError: ext is not define d".
609 // See https://crbug.com/416907 596 // See https://crbug.com/416907
610 if ("ext" in window && document instanceof HTMLDocument) 597 if ("ext" in window && document instanceof HTMLDocument)
611 { 598 {
612 // Use a contextmenu handler to save the last element the user right-clicked o n. 599 // Use a contextmenu handler to save the last element the user right-clicked o n.
613 // To make things easier, we actually save the DOM event. 600 // To make things easier, we actually save the DOM event.
614 // We have to do this because the contextMenu API only provides a URL, not the actual 601 // We have to do this because the contextMenu API only provides a URL, not the actual
615 // DOM element. 602 // DOM element.
616 document.addEventListener('contextmenu', function(e) { 603 document.addEventListener('contextmenu', function(e) {
617 lastRightClickEvent = e; 604 lastRightClickEvent = e;
618 }, false); 605 }, true);
619 606
620 document.addEventListener("click", function(event) 607 document.addEventListener("click", function(event)
621 { 608 {
622 // Ignore right-clicks 609 // Ignore right-clicks
623 if (event.button == 2) 610 if (event.button == 2)
624 return; 611 return;
625 612
626 // Search the link associated with the click 613 // Search the link associated with the click
627 var link = event.target; 614 var link = event.target;
628 while (link && !(link instanceof HTMLAnchorElement)) 615 while (link && !(link instanceof HTMLAnchorElement))
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
765 break; 752 break;
766 default: 753 default:
767 sendResponse({}); 754 sendResponse({});
768 break; 755 break;
769 } 756 }
770 }); 757 });
771 758
772 if (window == window.top) 759 if (window == window.top)
773 ext.backgroundPage.sendMessage({type: "report-html-page"}); 760 ext.backgroundPage.sendMessage({type: "report-html-page"});
774 } 761 }
LEFTRIGHT
« no previous file | no next file » | Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Toggle Comments ('s')

Powered by Google App Engine
This is Rietveld