author | Tom Schuster <evilpies@gmail.com> |
Tue, 27 Nov 2018 11:38:40 +0000 | |
changeset 448242 | 6b2aceb0979a49dbcce80db1b59ef8238bd0d2b8 |
parent 448241 | 5da532fab9bacb44b81ae0de6b7f026d187e54c7 |
child 448243 | b81f4153e1a8c77521d089bf1ede2ab611145be9 |
push id | 35107 |
push user | rmaries@mozilla.com |
push date | Tue, 27 Nov 2018 17:30:25 +0000 |
treeherder | mozilla-central@8be20508c9d5 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | jorendorff |
bugs | 1496475 |
milestone | 65.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
js/src/jsapi-tests/moz.build | file | annotate | diff | comparison | revisions | |
js/src/jsapi-tests/testWindowNonConfigurable.cpp | file | annotate | diff | comparison | revisions |
--- a/js/src/jsapi-tests/moz.build +++ b/js/src/jsapi-tests/moz.build @@ -108,16 +108,17 @@ UNIFIED_SOURCES += [ 'testThreadingThread.cpp', 'testToSignedOrUnsignedInteger.cpp', 'testTypedArrays.cpp', 'testUbiNode.cpp', 'testUncaughtSymbol.cpp', 'testUTF8.cpp', 'testWasmLEB128.cpp', 'testWeakMap.cpp', + 'testWindowNonConfigurable.cpp', 'testXDR.cpp', ] SOURCES += [ # There are clashing definitions of js::jit::AssemblerBuffer. 'testAssemblerBuffer.cpp', ]
new file mode 100644 --- /dev/null +++ b/js/src/jsapi-tests/testWindowNonConfigurable.cpp @@ -0,0 +1,54 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 4 -*- + * vim: set ts=8 sts=4 et sw=4 tw=99: + */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#include "jsapi-tests/tests.h" + +static bool +windowProxy_defineProperty(JSContext* cx, JS::HandleObject obj, JS::HandleId id, + JS::Handle<JS::PropertyDescriptor> desc, + JS::ObjectOpResult& result) +{ + if (desc.hasConfigurable() && !desc.configurable()) { + result.failCantDefineWindowNonConfigurable(); + return true; + } + + return NativeDefineProperty(cx, obj.as<js::NativeObject>(), id, desc, result); +} + +static const js::ObjectOps windowProxy_objectOps = { + nullptr, + windowProxy_defineProperty +}; + +static const js::Class windowProxy_class = { + "WindowProxy", + 0, + nullptr, + nullptr, + nullptr, + &windowProxy_objectOps +}; + +BEGIN_TEST(testWindowNonConfigurable) +{ + JS::RootedObject obj(cx, JS_NewObject(cx, Jsvalify(&windowProxy_class))); + CHECK(obj); + CHECK(JS_DefineProperty(cx, global, "windowProxy", obj, 0)); + JS::RootedValue v(cx); + EVAL("Object.defineProperty(windowProxy, 'bar', {value: 1, configurable: false})", &v); + CHECK(v.isFalse()); // This is the important bit! + EVAL("Object.defineProperty(windowProxy, 'bar', {value: 1, configurable: true})", &v); + CHECK(&v.toObject() == obj); + EVAL("Reflect.defineProperty(windowProxy, 'foo', {value: 1, configurable: false})", &v); + CHECK(v.isFalse()); + EVAL("Reflect.defineProperty(windowProxy, 'foo', {value: 1, configurable: true})", &v); + CHECK(v.isTrue()); + + return true; +} +END_TEST(testWindowNonConfigurable)