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-present eyeo GmbH | 3 * Copyright (C) 2006-present 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 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 } | 60 } |
61 | 61 |
62 exports.log = log; | 62 exports.log = log; |
63 | 63 |
64 function uabinjectDefuser() | 64 function uabinjectDefuser() |
65 { | 65 { |
66 window.trckd = window.uabpdl = window.uabInject = window.uabDetect = true; | 66 window.trckd = window.uabpdl = window.uabInject = window.uabDetect = true; |
67 } | 67 } |
68 | 68 |
69 exports["uabinject-defuser"] = makeInjector(uabinjectDefuser); | 69 exports["uabinject-defuser"] = makeInjector(uabinjectDefuser); |
| 70 |
| 71 function abortCurrentInlineScript(target, needle) |
| 72 { |
| 73 "use strict"; |
| 74 |
| 75 if (!target) |
| 76 return; |
| 77 |
| 78 let reText = ".?"; |
| 79 |
| 80 if (needle) |
| 81 { |
| 82 reText = /^\/.+\/$/.test(needle) ? |
| 83 needle.slice(1, -1) : |
| 84 needle.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); |
| 85 } |
| 86 |
| 87 let re = new RegExp(reText); |
| 88 let chain = target.split("."); |
| 89 |
| 90 let owner = window; |
| 91 let property = null; |
| 92 |
| 93 while (true) |
| 94 { |
| 95 property = chain.shift(); |
| 96 if (chain.length == 0) |
| 97 break; |
| 98 |
| 99 owner = owner[property]; |
| 100 if (!(owner instanceof Object)) |
| 101 return; |
| 102 } |
| 103 |
| 104 let descriptor = Object.getOwnPropertyDescriptor(owner, property); |
| 105 if (descriptor && descriptor.get) |
| 106 return; |
| 107 |
| 108 let magic = String.fromCharCode(Date.now() % 26 + 97) + |
| 109 Math.floor(Math.random() * 982451653 + 982451653).toString(36); |
| 110 let value = owner[property]; |
| 111 |
| 112 let validate = () => |
| 113 { |
| 114 let element = document.currentScript; |
| 115 if (element instanceof HTMLScriptElement && |
| 116 element.src == "" && re.test(element.textContent)) |
| 117 { |
| 118 throw new ReferenceError(magic); |
| 119 } |
| 120 }; |
| 121 |
| 122 Object.defineProperty(owner, property, { |
| 123 get() |
| 124 { |
| 125 validate(); |
| 126 return value; |
| 127 }, |
| 128 set(newValue) |
| 129 { |
| 130 validate(); |
| 131 value = newValue; |
| 132 } |
| 133 }); |
| 134 |
| 135 let {onerror} = window; |
| 136 window.onerror = function(message, ...rest) |
| 137 { |
| 138 if (typeof message == "string" && message.indexOf(magic) != -1) |
| 139 return true; |
| 140 |
| 141 if (onerror instanceof Function) |
| 142 return onerror.call(this, message, ...rest); |
| 143 }; |
| 144 } |
| 145 |
| 146 exports["abort-current-inline-script"] = makeInjector(abortCurrentInlineScript); |
OLD | NEW |