import from UXP: Bug 1333045 - Update Location object properties to current spec. (1af9026a)

This commit is contained in:
2022-03-17 14:17:54 +08:00
parent fe0970a6ce
commit c4c841e778
8 changed files with 60 additions and 24 deletions
-8
View File
@@ -1211,14 +1211,6 @@ GetInterfaceImpl(JSContext* aCx, nsIInterfaceRequestor* aRequestor,
}
}
bool
UnforgeableValueOf(JSContext* cx, unsigned argc, JS::Value* vp)
{
JS::CallArgs args = JS::CallArgsFromVp(argc, vp);
args.rval().set(args.thisv());
return true;
}
bool
ThrowingConstructor(JSContext* cx, unsigned argc, JS::Value* vp)
{
-3
View File
@@ -2006,9 +2006,6 @@ GetInterface(JSContext* aCx, T* aThis, nsIJSID* aIID,
GetInterfaceImpl(aCx, aThis, aThis, aIID, aRetval, aError);
}
bool
UnforgeableValueOf(JSContext* cx, unsigned argc, JS::Value* vp);
bool
ThrowingConstructor(JSContext* cx, unsigned argc, JS::Value* vp);
+5 -10
View File
@@ -2499,11 +2499,10 @@ class MethodDefiner(PropertyDefiner):
# Synthesize our valueOf method
self.regular.append({
"name": 'valueOf',
"nativeName": "UnforgeableValueOf",
"selfHostedName": "Object_valueOf",
"methodInfo": False,
"length": 0,
"flags": "JSPROP_ENUMERATE", # readonly/permanent added
# automatically.
"flags": "0", # readonly/permanent added automatically.
"condition": MemberCondition()
})
@@ -3548,19 +3547,15 @@ def InitUnforgeablePropertiesOnHolder(descriptor, properties, failureCode,
"nsContentUtils::ThreadsafeIsSystemCaller(aCx)"))
if descriptor.interface.getExtendedAttribute("Unforgeable"):
# We do our undefined toJSON and toPrimitive here, not as a regular
# property because we don't have a concept of value props anywhere in
# IDL.
# We do our undefined toPrimitive here, not as a regular property
# because we don't have a concept of value props anywhere in IDL.
unforgeables.append(CGGeneric(fill(
"""
JS::RootedId toPrimitive(aCx,
SYMBOL_TO_JSID(JS::GetWellKnownSymbol(aCx, JS::SymbolCode::toPrimitive)));
if (!JS_DefinePropertyById(aCx, ${holderName}, toPrimitive,
JS::UndefinedHandleValue,
JSPROP_READONLY | JSPROP_PERMANENT) ||
!JS_DefineProperty(aCx, ${holderName}, "toJSON",
JS::UndefinedHandleValue,
JSPROP_READONLY | JSPROP_ENUMERATE | JSPROP_PERMANENT)) {
JSPROP_READONLY | JSPROP_PERMANENT)) {
$*{failureCode}
}
""",
@@ -28,9 +28,6 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1041626
ok(Cu.isXrayWrapper(window[0].location), "Location is Xrayed");
let xrayOwnProperties = Object.getOwnPropertyNames(window[0].location);
todo(xrayOwnProperties.indexOf('toJSON') != -1,
"dummy toJSON on Location should show up in Xrayable properties");
xrayOwnProperties.push('toJSON');
let realOwnProperties = Object.getOwnPropertyNames(window[0].wrappedJSObject.location);
ok(realOwnProperties.length > 2);
@@ -8,4 +8,17 @@
<div id=log></div>
<script>
test_stringifier_attribute(location, "href", true);
test(function() {
const prop1 = Object.getOwnPropertyDescriptor(location, "toString"),
prop2 = Object.getOwnPropertyDescriptor(location, "href")
assert_true(prop1.enumerable)
assert_false(prop1.writable)
assert_false(prop1.configurable)
assert_true(prop2.enumerable)
assert_false(prop2.configurable)
assert_equals(typeof prop2.get, "function")
})
</script>
@@ -0,0 +1,14 @@
<!DOCTYPE html>
<title>Location Symbol.toPrimitive</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<div id=log></div>
<script>
test(() => {
assert_equals(location[Symbol.toPrimitive], undefined)
const prop = Object.getOwnPropertyDescriptor(location, Symbol.toPrimitive)
assert_false(prop.enumerable)
assert_false(prop.writable)
assert_false(prop.configurable)
})
</script>
@@ -0,0 +1,13 @@
<!DOCTYPE html>
<title>Location has no toJSON</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<div id=log></div>
<script>
test(() => {
assert_equals(location.toJSON, undefined)
assert_equals(Object.getOwnPropertyDescriptor(location, "toJSON"), undefined)
assert_false(location.hasOwnProperty("toJSON"))
})
</script>
<!-- See https://github.com/whatwg/html/pull/2294 for context. (And the HTML Standard of course.) -->
@@ -0,0 +1,15 @@
<!DOCTYPE html>
<title>Location valueOf</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<div id=log></div>
<script>
test(() => {
assert_equals(location.valueOf, Object.prototype.valueOf)
assert_equals(typeof location.valueOf.call(5), "object")
const prop = Object.getOwnPropertyDescriptor(location, "valueOf")
assert_false(prop.enumerable)
assert_false(prop.writable)
assert_false(prop.configurable)
})
</script>