Provide the option to override keys on an object when creating a wrapper
This commit is contained in:
parent
9074c09cc3
commit
77ea5bf3f9
1 changed files with 14 additions and 12 deletions
|
@ -36,8 +36,7 @@ const BOMs = {
|
||||||
|
|
||||||
Components.utils.import("resource://gre/modules/NetUtil.jsm");
|
Components.utils.import("resource://gre/modules/NetUtil.jsm");
|
||||||
|
|
||||||
Zotero.Translate.DOMWrapper = new function() {
|
Zotero.Translate.DOMWrapper = new function() {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* BEGIN SPECIAL POWERS WRAPPING CODE
|
* BEGIN SPECIAL POWERS WRAPPING CODE
|
||||||
* https://mxr.mozilla.org/mozilla-central/source/testing/mochitest/tests/SimpleTest/specialpowersAPI.js?raw=1
|
* https://mxr.mozilla.org/mozilla-central/source/testing/mochitest/tests/SimpleTest/specialpowersAPI.js?raw=1
|
||||||
|
@ -66,7 +65,7 @@ Zotero.Translate.DOMWrapper = new function() {
|
||||||
return Function.prototype.apply.call(fun, invocant, args);
|
return Function.prototype.apply.call(fun, invocant, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
function wrapPrivileged(obj) {
|
function wrapPrivileged(obj, overrides) {
|
||||||
|
|
||||||
// Primitives pass straight through.
|
// Primitives pass straight through.
|
||||||
if (!isWrappable(obj))
|
if (!isWrappable(obj))
|
||||||
|
@ -77,7 +76,7 @@ Zotero.Translate.DOMWrapper = new function() {
|
||||||
throw "Trying to double-wrap object!";
|
throw "Trying to double-wrap object!";
|
||||||
|
|
||||||
// Make our core wrapper object.
|
// Make our core wrapper object.
|
||||||
var handler = new SpecialPowersHandler(obj);
|
var handler = new SpecialPowersHandler(obj, overrides);
|
||||||
|
|
||||||
// If the object is callable, make a function proxy.
|
// If the object is callable, make a function proxy.
|
||||||
if (typeof obj === "function") {
|
if (typeof obj === "function") {
|
||||||
|
@ -136,8 +135,9 @@ Zotero.Translate.DOMWrapper = new function() {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
function SpecialPowersHandler(obj) {
|
function SpecialPowersHandler(obj, overrides) {
|
||||||
this.wrappedObject = obj;
|
this.wrappedObject = obj;
|
||||||
|
this.overrides = overrides ? overrides : {};
|
||||||
};
|
};
|
||||||
|
|
||||||
// Allow us to transitively maintain the membrane by wrapping descriptors
|
// Allow us to transitively maintain the membrane by wrapping descriptors
|
||||||
|
@ -163,11 +163,14 @@ Zotero.Translate.DOMWrapper = new function() {
|
||||||
// Note that we have several cases here, each of which requires special handling.
|
// Note that we have several cases here, each of which requires special handling.
|
||||||
//
|
//
|
||||||
var desc;
|
var desc;
|
||||||
|
|
||||||
|
// Hack for overriding some properties
|
||||||
|
if (name in this.overrides)
|
||||||
|
return this.overrides[name];
|
||||||
// Case 1: Own Properties.
|
// Case 1: Own Properties.
|
||||||
//
|
//
|
||||||
// This one is easy, thanks to Object.getOwnPropertyDescriptor().
|
// This one is easy, thanks to Object.getOwnPropertyDescriptor().
|
||||||
if (own)
|
else if (own)
|
||||||
desc = Object.getOwnPropertyDescriptor(obj, name);
|
desc = Object.getOwnPropertyDescriptor(obj, name);
|
||||||
|
|
||||||
// Case 2: Not own, not Xray-wrapped.
|
// Case 2: Not own, not Xray-wrapped.
|
||||||
|
@ -251,9 +254,11 @@ Zotero.Translate.DOMWrapper = new function() {
|
||||||
var specialAPI = 'SpecialPowers_wrappedObject';
|
var specialAPI = 'SpecialPowers_wrappedObject';
|
||||||
if (props.indexOf(specialAPI) == -1)
|
if (props.indexOf(specialAPI) == -1)
|
||||||
props.push(specialAPI);
|
props.push(specialAPI);
|
||||||
|
|
||||||
|
|
||||||
// Do the normal thing.
|
// Do the normal thing.
|
||||||
var flt = function(a) { return props.indexOf(a) == -1; };
|
var flt = function(a) { return props.indexOf(a) == -1; };
|
||||||
|
props = props.concat(Object.keys(this.overrides).filter(flt));
|
||||||
props = props.concat(Object.getOwnPropertyNames(obj).filter(flt));
|
props = props.concat(Object.getOwnPropertyNames(obj).filter(flt));
|
||||||
|
|
||||||
// If we've got an Xray wrapper, include the expandos as well.
|
// If we've got an Xray wrapper, include the expandos as well.
|
||||||
|
@ -317,10 +322,7 @@ Zotero.Translate.DOMWrapper = new function() {
|
||||||
* @param {XPCCrossOriginWrapper} obj
|
* @param {XPCCrossOriginWrapper} obj
|
||||||
* @return {Object} An obj that is no longer Xrayed
|
* @return {Object} An obj that is no longer Xrayed
|
||||||
*/
|
*/
|
||||||
this.wrap = function(obj) {
|
this.wrap = wrapPrivileged;
|
||||||
var newObj = wrapPrivileged(obj);
|
|
||||||
return newObj;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unwraps an object
|
* Unwraps an object
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue