| OLD | NEW |
| 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 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 | 186 |
| 187 case "video": | 187 case "video": |
| 188 case "audio": | 188 case "audio": |
| 189 case "picture": | 189 case "picture": |
| 190 return getURLsFromMediaElement(element); | 190 return getURLsFromMediaElement(element); |
| 191 } | 191 } |
| 192 | 192 |
| 193 return getURLsFromAttributes(element); | 193 return getURLsFromAttributes(element); |
| 194 } | 194 } |
| 195 | 195 |
| 196 function isBlockable(element) | |
| 197 { | |
| 198 if (element.id) | |
| 199 return true; | |
| 200 if (element.classList.length > 0) | |
| 201 return true; | |
| 202 if (getURLsFromElement(element).length > 0) | |
| 203 return true; | |
| 204 | |
| 205 // We only generate filters based on the "style" attribute, | |
| 206 // if this is the only way we can generate a filter, and | |
| 207 // only if there are at least two CSS properties defined. | |
| 208 if (/:.+:/.test(element.getAttribute("style"))) | |
| 209 return true; | |
| 210 | |
| 211 return false; | |
| 212 } | |
| 213 | |
| 214 // Gets the absolute position of an element by walking up the DOM tree, | 196 // Gets the absolute position of an element by walking up the DOM tree, |
| 215 // adding up offsets. | 197 // adding up offsets. |
| 216 // I hope there's a better way because it just seems absolutely stupid | 198 // I hope there's a better way because it just seems absolutely stupid |
| 217 // that the DOM wouldn't have a direct way to get this, given that it | 199 // that the DOM wouldn't have a direct way to get this, given that it |
| 218 // has hundreds and hundreds of other methods that do random junk. | 200 // has hundreds and hundreds of other methods that do random junk. |
| 219 function getAbsolutePosition(elt) { | 201 function getAbsolutePosition(elt) { |
| 220 var l = 0; | 202 var l = 0; |
| 221 var t = 0; | 203 var t = 0; |
| 222 for(; elt; elt = elt.offsetParent) { | 204 for(; elt; elt = elt.offsetParent) { |
| 223 l += elt.offsetLeft; | 205 l += elt.offsetLeft; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 // Turn on the choose element to create filter thing | 296 // Turn on the choose element to create filter thing |
| 315 function clickHide_activate() { | 297 function clickHide_activate() { |
| 316 if(document == null) | 298 if(document == null) |
| 317 return; | 299 return; |
| 318 | 300 |
| 319 // If we are already selecting, abort now | 301 // If we are already selecting, abort now |
| 320 if (clickHide_activated || clickHideFiltersDialog) | 302 if (clickHide_activated || clickHideFiltersDialog) |
| 321 clickHide_deactivate(); | 303 clickHide_deactivate(); |
| 322 | 304 |
| 323 // Add overlays for blockable elements that don't emit mouse events that they
can still be selected | 305 // Add overlays for blockable elements that don't emit mouse events that they
can still be selected |
| 324 var elts = document.querySelectorAll('object,embed,iframe'); | 306 [].forEach.call( |
| 325 for(var i=0; i<elts.length; i++) | 307 document.querySelectorAll('object,embed,iframe'), |
| 326 { | 308 function(element) |
| 327 var element = elts[i]; | 309 { |
| 328 if (isBlockable(element)) | 310 getFiltersForElement(element, function(filters) |
| 329 addElementOverlay(element); | 311 { |
| 330 } | 312 if (filters.length > 0) |
| 313 addElementOverlay(element); |
| 314 }); |
| 315 } |
| 316 ); |
| 331 | 317 |
| 332 clickHide_activated = true; | 318 clickHide_activated = true; |
| 333 document.addEventListener("mouseover", clickHide_mouseOver, true); | 319 document.addEventListener("mouseover", clickHide_mouseOver, true); |
| 334 document.addEventListener("mouseout", clickHide_mouseOut, true); | 320 document.addEventListener("mouseout", clickHide_mouseOut, true); |
| 335 document.addEventListener("click", clickHide_mouseClick, true); | 321 document.addEventListener("click", clickHide_mouseClick, true); |
| 336 document.addEventListener("keydown", clickHide_keyDown, true); | 322 document.addEventListener("keydown", clickHide_keyDown, true); |
| 337 } | 323 } |
| 338 | 324 |
| 339 // Called when user has clicked on something and we are waiting for confirmation | 325 // Called when user has clicked on something and we are waiting for confirmation |
| 340 // on whether the user actually wants these filters | 326 // on whether the user actually wants these filters |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 overlays[0].parentNode.removeChild(overlays[0]); | 367 overlays[0].parentNode.removeChild(overlays[0]); |
| 382 } | 368 } |
| 383 } | 369 } |
| 384 | 370 |
| 385 function clickHide_elementClickHandler(ev) { | 371 function clickHide_elementClickHandler(ev) { |
| 386 ev.preventDefault(); | 372 ev.preventDefault(); |
| 387 ev.stopPropagation(); | 373 ev.stopPropagation(); |
| 388 clickHide_mouseClick(ev); | 374 clickHide_mouseClick(ev); |
| 389 } | 375 } |
| 390 | 376 |
| 377 function getBlockableElementOrAncestor(element, callback) |
| 378 { |
| 379 if (element && element != document.documentElement && |
| 380 element != document.body) |
| 381 { |
| 382 if (element instanceof HTMLElement) |
| 383 { |
| 384 getFiltersForElement(element, function(filters) |
| 385 { |
| 386 if (filters.length > 0) |
| 387 callback(element); |
| 388 else |
| 389 getBlockableElementOrAncestor(element.parentElement, callback); |
| 390 }); |
| 391 } |
| 392 else |
| 393 { |
| 394 getBlockableElementOrAncestor(element.parentElement, callback); |
| 395 } |
| 396 } |
| 397 else |
| 398 { |
| 399 callback(null); |
| 400 } |
| 401 } |
| 402 |
| 391 // Hovering over an element so highlight it | 403 // Hovering over an element so highlight it |
| 392 function clickHide_mouseOver(e) | 404 function clickHide_mouseOver(e) |
| 393 { | 405 { |
| 394 if (clickHide_activated == false) | 406 if (clickHide_activated == false) |
| 395 return; | 407 return; |
| 396 | 408 |
| 397 var target = e.target; | 409 getBlockableElementOrAncestor(e.target, function(element) |
| 398 while (target.parentNode && !isBlockable(target)) | 410 { |
| 399 target = target.parentNode; | 411 if (currentElement) |
| 400 if (target == document.documentElement || target == document.body) | 412 unhighlightElement(currentElement); |
| 401 target = null; | |
| 402 | 413 |
| 403 if (target && target instanceof HTMLElement) | 414 if (element) |
| 404 { | 415 { |
| 405 currentElement = target; | 416 highlightElement(element, "#d6d84b", "#f8fa47"); |
| 417 element.addEventListener("contextmenu", clickHide_elementClickHandler, tru
e); |
| 418 } |
| 406 | 419 |
| 407 highlightElement(target, "#d6d84b", "#f8fa47"); | 420 currentElement = element; |
| 408 target.addEventListener("contextmenu", clickHide_elementClickHandler, true); | 421 }); |
| 409 } | |
| 410 } | 422 } |
| 411 | 423 |
| 412 // No longer hovering over this element so unhighlight it | 424 // No longer hovering over this element so unhighlight it |
| 413 function clickHide_mouseOut(e) | 425 function clickHide_mouseOut(e) |
| 414 { | 426 { |
| 415 if (!clickHide_activated || !currentElement) | 427 if (!clickHide_activated || currentElement != e.target) |
| 416 return; | 428 return; |
| 417 | 429 |
| 418 unhighlightElement(currentElement); | 430 unhighlightElement(currentElement); |
| 419 currentElement.removeEventListener("contextmenu", clickHide_elementClickHandle
r, true); | 431 currentElement.removeEventListener("contextmenu", clickHide_elementClickHandle
r, true); |
| 420 } | 432 } |
| 421 | 433 |
| 422 // Selects the currently hovered-over filter or cancels selection | 434 // Selects the currently hovered-over filter or cancels selection |
| 423 function clickHide_keyDown(e) | 435 function clickHide_keyDown(e) |
| 424 { | 436 { |
| 425 if (!e.ctrlKey && !e.altKey && !e.shiftKey && e.keyCode == 13 /*DOM_VK_RETURN*
/) | 437 if (!e.ctrlKey && !e.altKey && !e.shiftKey && e.keyCode == 13 /*DOM_VK_RETURN*
/) |
| (...skipping 17 matching lines...) Expand all Loading... |
| 443 { | 455 { |
| 444 ext.backgroundPage.sendMessage( | 456 ext.backgroundPage.sendMessage( |
| 445 { | 457 { |
| 446 type: "compose-filters", | 458 type: "compose-filters", |
| 447 tagName: element.localName, | 459 tagName: element.localName, |
| 448 id: element.id, | 460 id: element.id, |
| 449 src: element.getAttribute("src"), | 461 src: element.getAttribute("src"), |
| 450 style: element.getAttribute("style"), | 462 style: element.getAttribute("style"), |
| 451 classes: [].slice.call(element.classList), | 463 classes: [].slice.call(element.classList), |
| 452 urls: getURLsFromElement(element), | 464 urls: getURLsFromElement(element), |
| 465 mediatype: typeMap[element.localName], |
| 453 baseURL: document.location.href | 466 baseURL: document.location.href |
| 454 }, | 467 }, |
| 455 function(response) | 468 function(response) |
| 456 { | 469 { |
| 457 callback(response.filters, response.selectors); | 470 callback(response.filters, response.selectors); |
| 458 } | 471 } |
| 459 ); | 472 ); |
| 460 } | 473 } |
| 461 | 474 |
| 462 // When the user clicks, the currentElement is the one we want. | 475 // When the user clicks, the currentElement is the one we want. |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 671 lastRightClickEventValid = false; | 684 lastRightClickEventValid = false; |
| 672 else | 685 else |
| 673 lastRightClickEvent = null; | 686 lastRightClickEvent = null; |
| 674 break; | 687 break; |
| 675 } | 688 } |
| 676 }); | 689 }); |
| 677 | 690 |
| 678 if (window == window.top) | 691 if (window == window.top) |
| 679 ext.backgroundPage.sendMessage({type: "report-html-page"}); | 692 ext.backgroundPage.sendMessage({type: "report-html-page"}); |
| 680 } | 693 } |
| OLD | NEW |