| 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 |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
| 13 * | 13 * |
| 14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
| 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
| 16 */ | 16 */ |
| 17 | 17 |
| 18 "use strict"; | 18 "use strict"; |
| 19 | 19 |
| 20 let onShutdown = { | 20 let onShutdown = { |
| 21 done: false, | 21 done: false, |
| 22 add() {}, | 22 add() {}, |
| 23 remove() {} | 23 remove() {} |
| 24 }; | 24 }; |
| 25 | 25 |
| 26 // | 26 // |
| 27 // XPCOM emulation | 27 // XPCOM emulation |
| 28 // | 28 // |
| 29 | 29 |
| 30 function nsIFileURL() {} | |
| 31 function nsIHttpChannel() {} | 30 function nsIHttpChannel() {} |
| 32 | 31 |
| 33 let ComponentsObject = { | 32 let ComponentsObject = { |
| 34 interfaces: | 33 interfaces: |
| 35 { | 34 { |
| 36 nsIFile: {DIRECTORY_TYPE: 0}, | |
| 37 nsIFileURL, | |
| 38 nsIHttpChannel, | 35 nsIHttpChannel, |
| 39 nsITimer: {TYPE_REPEATING_SLACK: 0}, | 36 nsITimer: {TYPE_REPEATING_SLACK: 0}, |
| 40 nsIInterfaceRequestor: null, | 37 nsIInterfaceRequestor: null |
| 41 nsIChannelEventSink: null | |
| 42 }, | 38 }, |
| 43 classes: | 39 classes: |
| 44 { | 40 { |
| 45 "@mozilla.org/timer;1": | 41 "@mozilla.org/timer;1": |
| 46 { | 42 { |
| 47 createInstance() { return new FakeTimer(); } | 43 createInstance() { return new FakeTimer(); } |
| 48 }, | |
| 49 "@mozilla.org/xmlextras/xmlhttprequest;1": | |
| 50 { | |
| 51 createInstance() { return new XMLHttpRequest(); } | |
| 52 } | 44 } |
| 53 }, | 45 }, |
| 54 results: {}, | |
| 55 utils: { | 46 utils: { |
| 56 import(resource) | 47 import(resource) |
| 57 { | 48 { |
| 58 let match = /^resource:\/\/gre\/modules\/(.+)\.jsm$/.exec(resource); | 49 let match = /^resource:\/\/gre\/modules\/(.+)\.jsm$/.exec(resource); |
| 59 let resourceName = match && match[1]; | 50 let resourceName = match && match[1]; |
| 60 if (resourceName && Cu.import.resources.has(resourceName)) | 51 if (resourceName && Cu.import.resources.has(resourceName)) |
| 61 return {[resourceName]: Cu.import.resources.get(resourceName)}; | 52 return {[resourceName]: Cu.import.resources.get(resourceName)}; |
| 62 | 53 |
| 63 throw new Error( | 54 throw new Error( |
| 64 "Attempt to import unknown JavaScript module " + resource | 55 "Attempt to import unknown JavaScript module " + resource |
| 65 ); | 56 ); |
| 66 }, | 57 }, |
| 67 reportError(e) | 58 reportError(e) |
| 68 { | 59 { |
| 69 console.error(e); | 60 console.error(e); |
| 70 console.trace(); | 61 console.trace(); |
| 71 } | 62 } |
| 72 }, | 63 }, |
| 73 manager: null, | 64 manager: null, |
| 74 ID() { return null; } | 65 ID() { return null; } |
| 75 }; | 66 }; |
| 76 const Cc = ComponentsObject.classes; | 67 const Cc = ComponentsObject.classes; |
| 77 const Ci = ComponentsObject.interfaces; | 68 const Ci = ComponentsObject.interfaces; |
| 78 const Cr = ComponentsObject.results; | |
| 79 const Cu = ComponentsObject.utils; | 69 const Cu = ComponentsObject.utils; |
| 80 | 70 |
| 81 Cu.import.resources = new Map(); | 71 Cu.import.resources = new Map([ |
| 82 | 72 [ |
| 83 Cu.import.resources.set("XPCOMUtils", { | 73 "XPCOMUtils", |
| 84 generateQI() {} | |
| 85 }); | |
| 86 | |
| 87 // | |
| 88 // Services.jsm module emulation | |
| 89 // | |
| 90 | |
| 91 Cu.import.resources.set("Services", { | |
| 92 obs: { | |
| 93 addObserver() {}, | |
| 94 removeObserver() {} | |
| 95 }, | |
| 96 vc: { | |
| 97 compare(v1, v2) | |
| 98 { | 74 { |
| 99 function parsePart(s) | 75 generateQI() {} |
| 100 { | 76 } |
| 101 if (!s) | 77 ], |
| 102 return parsePart("0"); | 78 [ |
| 103 | 79 "Services", |
| 104 let part = { | 80 { |
| 105 numA: 0, | 81 obs: { |
| 106 strB: "", | 82 addObserver() {}, |
| 107 numC: 0, | 83 removeObserver() {} |
| 108 extraD: "" | |
| 109 }; | |
| 110 | |
| 111 if (s === "*") | |
| 112 { | |
| 113 part.numA = Number.MAX_VALUE; | |
| 114 return part; | |
| 115 } | |
| 116 | |
| 117 let matches = s.match(/(\d*)(\D*)(\d*)(.*)/); | |
| 118 part.numA = parseInt(matches[1], 10) || part.numA; | |
| 119 part.strB = matches[2] || part.strB; | |
| 120 part.numC = parseInt(matches[3], 10) || part.numC; | |
| 121 part.extraD = matches[4] || part.extraD; | |
| 122 | |
| 123 if (part.strB == "+") | |
| 124 { | |
| 125 part.numA++; | |
| 126 part.strB = "pre"; | |
| 127 } | |
| 128 | |
| 129 return part; | |
| 130 } | 84 } |
| 131 | |
| 132 function comparePartElement(s1, s2) | |
| 133 { | |
| 134 if (s1 === "" && s2 !== "") | |
| 135 return 1; | |
| 136 if (s1 !== "" && s2 === "") | |
| 137 return -1; | |
| 138 return s1 === s2 ? 0 : (s1 > s2 ? 1 : -1); | |
| 139 } | |
| 140 | |
| 141 function compareParts(p1, p2) | |
| 142 { | |
| 143 let result = 0; | |
| 144 let elements = ["numA", "strB", "numC", "extraD"]; | |
| 145 elements.some(element => | |
| 146 { | |
| 147 result = comparePartElement(p1[element], p2[element]); | |
| 148 return result; | |
| 149 }); | |
| 150 return result; | |
| 151 } | |
| 152 | |
| 153 let parts1 = v1.split("."); | |
| 154 let parts2 = v2.split("."); | |
| 155 for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) | |
| 156 { | |
| 157 let result = compareParts(parsePart(parts1[i]), parsePart(parts2[i])); | |
| 158 if (result) | |
| 159 return result; | |
| 160 } | |
| 161 return 0; | |
| 162 } | 85 } |
| 163 } | 86 ] |
| 164 }); | 87 ]); |
| 165 | |
| 166 // | |
| 167 // FileUtils.jsm module emulation | |
| 168 // | |
| 169 | |
| 170 Cu.import.resources.set("FileUtils", { | |
| 171 PERMS_DIRECTORY: 0 | |
| 172 }); | |
| 173 | 88 |
| 174 function FakeTimer() | 89 function FakeTimer() |
| 175 { | 90 { |
| 176 } | 91 } |
| 177 FakeTimer.prototype = | 92 FakeTimer.prototype = |
| 178 { | 93 { |
| 179 delay: 0, | 94 delay: 0, |
| 180 callback: null, | 95 callback: null, |
| 181 initWithCallback(callback, delay) | 96 initWithCallback(callback, delay) |
| 182 { | 97 { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 200 }, this.delay); | 115 }, this.delay); |
| 201 } | 116 } |
| 202 }; | 117 }; |
| 203 | 118 |
| 204 // | 119 // |
| 205 // Add a channel property to XMLHttpRequest, Synchronizer needs it | 120 // Add a channel property to XMLHttpRequest, Synchronizer needs it |
| 206 // | 121 // |
| 207 | 122 |
| 208 XMLHttpRequest.prototype.channel = { | 123 XMLHttpRequest.prototype.channel = { |
| 209 status: -1, | 124 status: -1, |
| 210 notificationCallbacks: {}, | |
| 211 loadFlags: 0, | 125 loadFlags: 0, |
| 212 INHIBIT_CACHING: 0, | 126 INHIBIT_CACHING: 0, |
| 213 VALIDATE_ALWAYS: 0, | 127 VALIDATE_ALWAYS: 0 |
| 214 QueryInterface() | |
| 215 { | |
| 216 return this; | |
| 217 } | |
| 218 }; | 128 }; |
| OLD | NEW |