function check_throws(f) { try {
f();
} catch (exc) { return;
} thrownew TypeError("Expected exception, no exception thrown");
}
/* * Test that XPCWrappedNative objects do not permit expando properties to be created. * * This function is called twice. The first time, realObj is an nsITimer XPCWN * and accessObj === realObj. * * The second time, accessObj is a scripted proxy with realObj as its target. * So the second time we are testing that scripted proxies don't magically * bypass whatever mechanism enforces the expando policy on XPCWNs.
*/ function test_tamperproof(realObj, accessObj, {method, constant, attribute}) { // Assignment can't create an expando property.
check_throws(function () { accessObj.expando = 14; }); Assert.equal(false, "expando" in realObj);
// Assignment to an inherited method name doesn't work either.
check_throws(function () { accessObj.hasOwnProperty = () => "lies"; });
check_throws(function () { "use strict"; accessObj.hasOwnProperty = () => "lies"; }); Assert.ok(!realObj.hasOwnProperty("hasOwnProperty"));
// Assignment to a method name doesn't work either.
let originalMethod; if (method) {
originalMethod = accessObj[method];
accessObj[method] = "nope"; // non-writable data property, no exception in non-strict code
check_throws(function () { "use strict"; accessObj[method] = "nope"; }); Assert.ok(realObj[method] === originalMethod);
}
// A constant is the same thing.
let originalConstantValue; if (constant) {
originalConstantValue = accessObj[constant];
accessObj[constant] = "nope"; Assert.equal(realObj[constant], originalConstantValue);
check_throws(function () { "use strict"; accessObj[constant] = "nope"; }); Assert.equal(realObj[constant], originalConstantValue);
}
// Assignment to a readonly accessor property with no setter doesn't work either.
let originalAttributeDesc; if (attribute) {
originalAttributeDesc = Object.getOwnPropertyDescriptor(realObj, attribute); Assert.ok("set" in originalAttributeDesc); Assert.ok(originalAttributeDesc.set === undefined);
accessObj[attribute] = "nope"; // accessor property with no setter: no exception in non-strict code
check_throws(function () { "use strict"; accessObj[attribute] = "nope"; });
let desc = Object.getOwnPropertyDescriptor(realObj, attribute); Assert.ok("set" in desc); Assert.equal(originalAttributeDesc.get, desc.get); Assert.equal(undefined, desc.set);
}
// Reflect.set doesn't work either. if (method) { Assert.ok(!Reflect.set({}, method, "bad", accessObj)); Assert.equal(realObj[method], originalMethod);
} if (attribute) { Assert.ok(!Reflect.set({}, attribute, "bad", accessObj)); Assert.equal(originalAttributeDesc.get, Object.getOwnPropertyDescriptor(realObj, attribute).get);
}
// Object.defineProperty can't do anything either.
let names = ["expando"]; if (method) names.push(method); if (constant) names.push(constant); if (attribute) names.push(attribute); for (let name of names) {
let originalDesc = Object.getOwnPropertyDescriptor(realObj, name);
check_throws(function () {
Object.defineProperty(accessObj, name, {configurable: true});
});
check_throws(function () {
Object.defineProperty(accessObj, name, {writable: true});
});
check_throws(function () {
Object.defineProperty(accessObj, name, {get: function () { return"lies"; }});
});
check_throws(function () {
Object.defineProperty(accessObj, name, {value: "bad"});
});
let desc = Object.getOwnPropertyDescriptor(realObj, name); if (originalDesc === undefined) { Assert.equal(undefined, desc);
} else { Assert.equal(originalDesc.configurable, desc.configurable); Assert.equal(originalDesc.enumerable, desc.enumerable); Assert.equal(originalDesc.writable, desc.writable); Assert.equal(originalDesc.value, desc.value); Assert.equal(originalDesc.get, desc.get); Assert.equal(originalDesc.set, desc.set);
}
}
// Test a tearoff object.
let b = xpcWrap(new TestInterfaceAll(), Ci.nsIXPCTestInterfaceB);
let tearoff = b.nsIXPCTestInterfaceA;
test_twice(tearoff, {
method: "QueryInterface"
});
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.