LEFT | RIGHT |
(no file at all) | |
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-2013 Eyeo GmbH | 3 * Copyright (C) 2006-2013 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 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
140 if (!result.succeed) | 140 if (!result.succeed) |
141 throw result.error; | 141 throw result.error; |
142 }, | 142 }, |
143 deserializeResult: function(result) | 143 deserializeResult: function(result) |
144 { | 144 { |
145 this.checkResult(result); | 145 this.checkResult(result); |
146 return this.deserialize(result.result); | 146 return this.deserialize(result.result); |
147 }, | 147 }, |
148 serialize: function(obj, memo) | 148 serialize: function(obj, memo) |
149 { | 149 { |
150 var objectId = this.objects.indexOf(obj); | 150 if (typeof obj == "object" && obj != null || typeof obj == "function") |
151 if (objectId != -1) | 151 { |
152 return {type: "hosted", objectId: objectId}; | 152 if ("__proxyObjectId" in obj) |
153 | 153 return {type: "hosted", objectId: obj.__proxyObjectId}; |
154 if (typeof obj == "function") | 154 |
155 { | 155 if (typeof obj == "function") |
156 var callbackId = this.callbacks.indexOf(obj); | 156 { |
157 if (callbackId == -1) | 157 var callbackId; |
158 callbackId = this.callbacks.push(obj) - 1; | 158 if ("__proxyCallbackId" in obj) |
159 | 159 callbackId = obj.__proxyCallbackId; |
160 return {type: "callback", callbackId: callbackId, frameId: documentInfo.
frameId}; | 160 else |
161 } | 161 { |
162 | 162 callbackId = this.callbacks.push(obj) - 1; |
163 if (typeof obj == "object" && | 163 Object.defineProperty(obj, "__proxyCallbackId", {value: callbackId})
; |
164 obj != null && | 164 } |
165 obj.constructor != Date && | 165 |
166 obj.constructor != RegExp) | 166 return {type: "callback", callbackId: callbackId, frameId: documentInf
o.frameId}; |
167 { | 167 } |
168 if (!memo) | 168 |
169 memo = {specs: [], objects: []}; | 169 if (obj.constructor != Date && obj.constructor != RegExp) |
170 | 170 { |
171 var idx = memo.objects.indexOf(obj); | 171 if (!memo) |
172 if (idx != -1) | 172 memo = {specs: [], objects: []}; |
173 return memo.specs[idx]; | 173 |
174 | 174 var idx = memo.objects.indexOf(obj); |
175 var spec = {}; | 175 if (idx != -1) |
176 memo.specs.push(spec); | 176 return memo.specs[idx]; |
177 memo.objects.push(obj); | 177 |
178 | 178 var spec = {}; |
179 if (obj.constructor == Array) | 179 memo.specs.push(spec); |
180 { | 180 memo.objects.push(obj); |
181 spec.type = "array"; | 181 |
182 spec.items = []; | 182 if (obj.constructor == Array) |
183 | 183 { |
184 for (var i = 0; i < obj.length; i++) | 184 spec.type = "array"; |
185 spec.items.push(this.serialize(obj[i], memo)); | 185 spec.items = []; |
186 } | 186 |
187 else | 187 for (var i = 0; i < obj.length; i++) |
188 { | 188 spec.items.push(this.serialize(obj[i], memo)); |
189 spec.type = "object"; | 189 } |
190 spec.properties = {}; | 190 else |
191 | 191 { |
192 for (var k in obj) | 192 spec.type = "object"; |
193 spec.properties[k] = this.serialize(obj[k], memo); | 193 spec.properties = {}; |
194 } | 194 |
195 | 195 for (var k in obj) |
196 return spec; | 196 spec.properties[k] = this.serialize(obj[k], memo); |
| 197 } |
| 198 |
| 199 return spec; |
| 200 } |
197 } | 201 } |
198 | 202 |
199 return {type: "value", value: obj}; | 203 return {type: "value", value: obj}; |
200 }, | 204 }, |
201 deserializeSequence: function(specs, array, memo) | 205 deserializeSequence: function(specs, array, memo) |
202 { | 206 { |
203 if (!array) | 207 if (!array) |
204 array = []; | 208 array = []; |
205 | 209 |
206 if (!memo) | 210 if (!memo) |
(...skipping 20 matching lines...) Expand all Loading... |
227 if (idx != -1) | 231 if (idx != -1) |
228 return memo.arrays[idx]; | 232 return memo.arrays[idx]; |
229 | 233 |
230 var array = []; | 234 var array = []; |
231 memo.specs.push(spec); | 235 memo.specs.push(spec); |
232 memo.arrays.push(array); | 236 memo.arrays.push(array); |
233 | 237 |
234 return this.deserializeSequence(spec.items, array, memo); | 238 return this.deserializeSequence(spec.items, array, memo); |
235 } | 239 } |
236 }, | 240 }, |
237 getObjectId: function(obj) | |
238 { | |
239 return this.objects.indexOf(obj); | |
240 }, | |
241 getProperty: function(objectId, property) | 241 getProperty: function(objectId, property) |
242 { | 242 { |
243 return this.deserializeResult( | 243 return this.deserializeResult( |
244 this.send( | 244 this.send( |
245 { | 245 { |
246 type: "getProperty", | 246 type: "getProperty", |
247 objectId: objectId, | 247 objectId: objectId, |
248 property: property | 248 property: property |
249 }) | 249 }) |
250 ); | 250 ); |
251 }, | 251 }, |
252 createProperty: function(property, enumerable) | 252 createProperty: function(property, enumerable) |
253 { | 253 { |
254 var proxy = this; | 254 var proxy = this; |
255 return { | 255 return { |
256 get: function() | 256 get: function() |
257 { | 257 { |
258 return proxy.getProperty(proxy.getObjectId(this), property); | 258 return proxy.getProperty(this.__proxyObjectId, property); |
259 }, | 259 }, |
260 set: function(value) | 260 set: function(value) |
261 { | 261 { |
262 proxy.checkResult( | 262 proxy.checkResult( |
263 proxy.send( | 263 proxy.send( |
264 { | 264 { |
265 type: "setProperty", | 265 type: "setProperty", |
266 objectId: proxy.getObjectId(this), | 266 objectId: this.__proxyObjectId, |
267 property: property, | 267 property: property, |
268 value: proxy.serialize(value) | 268 value: proxy.serialize(value) |
269 }) | 269 }) |
270 ); | 270 ); |
271 }, | 271 }, |
272 enumerable: enumerable, | 272 enumerable: enumerable, |
273 configurable: true | 273 configurable: true |
274 }; | 274 }; |
275 }, | 275 }, |
276 createFunction: function(objectId) | 276 createFunction: function(objectId) |
277 { | 277 { |
278 var proxy = this; | 278 var proxy = this; |
279 return function() | 279 return function() |
280 { | 280 { |
281 return proxy.deserializeResult( | 281 return proxy.deserializeResult( |
282 proxy.send( | 282 proxy.send( |
283 { | 283 { |
284 type: "callFunction", | 284 type: "callFunction", |
285 functionId: objectId, | 285 functionId: objectId, |
286 contextId: proxy.getObjectId(this), | 286 contextId: this.__proxyObjectId, |
287 args: Array.prototype.map.call( | 287 args: Array.prototype.map.call( |
288 arguments, | 288 arguments, |
289 proxy.serialize.bind(proxy) | 289 proxy.serialize.bind(proxy) |
290 ) | 290 ) |
291 }) | 291 }) |
292 ); | 292 ); |
293 }; | 293 }; |
294 }, | 294 }, |
295 handleCallback: function(message) | 295 handleCallback: function(message) |
296 { | 296 { |
(...skipping 13 matching lines...) Expand all Loading... |
310 if (obj) | 310 if (obj) |
311 Object.getOwnPropertyNames(obj).forEach(function(prop) { delete obj[prop
]; }); | 311 Object.getOwnPropertyNames(obj).forEach(function(prop) { delete obj[prop
]; }); |
312 else | 312 else |
313 { | 313 { |
314 if (objectInfo.isFunction) | 314 if (objectInfo.isFunction) |
315 obj = this.createFunction(objectId); | 315 obj = this.createFunction(objectId); |
316 else | 316 else |
317 obj = {}; | 317 obj = {}; |
318 | 318 |
319 this.objects[objectId] = obj; | 319 this.objects[objectId] = obj; |
320 } | 320 Object.defineProperty(obj, "__proxyObjectId", {value: objectId}); |
321 | 321 } |
322 var ignored = []; | 322 |
| 323 var excluded = []; |
| 324 var included = []; |
323 if ("prototypeOf" in objectInfo) | 325 if ("prototypeOf" in objectInfo) |
324 { | 326 { |
325 var prototype = window[objectInfo.prototypeOf].prototype; | 327 var prototype = window[objectInfo.prototypeOf].prototype; |
326 | 328 |
327 ignored = Object.getOwnPropertyNames(prototype); | 329 excluded = Object.getOwnPropertyNames(prototype); |
328 ignored.splice(ignored.indexOf("constructor"), 1); | 330 included = ["constructor"]; |
329 | 331 |
330 obj.__proto__ = prototype; | 332 obj.__proto__ = prototype; |
331 } | 333 } |
332 else | 334 else |
333 { | 335 { |
334 if (objectInfo.isFunction) | 336 if (objectInfo.isFunction) |
335 ignored = Object.getOwnPropertyNames(function() {}); | 337 { |
336 else | 338 excluded = Object.getOwnPropertyNames(function() {}); |
337 ignored = []; | 339 included = ["prototype"]; |
| 340 } |
338 | 341 |
339 if ("prototypeId" in objectInfo) | 342 if ("prototypeId" in objectInfo) |
340 obj.__proto__ = this.getObject(objectInfo.prototypeId); | 343 obj.__proto__ = this.getObject(objectInfo.prototypeId); |
341 else | 344 else |
342 obj.__proto__ = null; | 345 obj.__proto__ = null; |
343 } | 346 } |
344 | 347 |
345 for (var property in objectInfo.properties) | 348 for (var property in objectInfo.properties) |
346 if (ignored.indexOf(property) == -1) | 349 { |
347 Object.defineProperty(obj, property, this.createProperty( | 350 if (excluded.indexOf(property) == -1 || included.indexOf(property) != -1
) |
348 property, objectInfo.properties[property].enumerable | 351 { |
349 )); | 352 var desc = Object.getOwnPropertyDescriptor(obj, property); |
350 | 353 |
351 if (objectInfo.isFunction) | 354 if (!desc || desc.configurable) |
352 obj.prototype = this.getProperty(objectId, "prototype"); | 355 { |
| 356 Object.defineProperty(obj, property, this.createProperty( |
| 357 property, objectInfo.properties[property].enumerable |
| 358 )); |
| 359 } |
| 360 else if (desc.writable) |
| 361 obj[property] = this.getProperty(objectId, property); |
| 362 } |
| 363 } |
353 | 364 |
354 return obj; | 365 return obj; |
355 } | 366 } |
356 }; | 367 }; |
357 | 368 |
358 ext.backgroundPage = { | 369 ext.backgroundPage = { |
359 sendMessage: function(message, responseCallback) | 370 sendMessage: function(message, responseCallback) |
360 { | 371 { |
361 messageProxy.sendMessage(message, responseCallback, documentInfo); | 372 messageProxy.sendMessage(message, responseCallback, documentInfo); |
362 }, | 373 }, |
(...skipping 26 matching lines...) Expand all Loading... |
389 messageProxy.handleResponse(event.message); | 400 messageProxy.handleResponse(event.message); |
390 break; | 401 break; |
391 case "proxyCallback": | 402 case "proxyCallback": |
392 backgroundPageProxy.handleCallback(event.message); | 403 backgroundPageProxy.handleCallback(event.message); |
393 break; | 404 break; |
394 } | 405 } |
395 } | 406 } |
396 } | 407 } |
397 }); | 408 }); |
398 })(); | 409 })(); |
LEFT | RIGHT |