Bug 1496475 - JSAPI test. r=jorendorff
authorTom Schuster <evilpies@gmail.com>
Tue, 27 Nov 2018 11:38:40 +0000
changeset 504678 6b2aceb0979a49dbcce80db1b59ef8238bd0d2b8
parent 504677 5da532fab9bacb44b81ae0de6b7f026d187e54c7
child 504679 b81f4153e1a8c77521d089bf1ede2ab611145be9
push id10290
push userffxbld-merge
push dateMon, 03 Dec 2018 16:23:23 +0000
treeherdermozilla-beta@700bed2445e6 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersjorendorff
bugs1496475
milestone65.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
Bug 1496475 - JSAPI test. r=jorendorff Depends on D12948 Differential Revision: https://phabricator.services.mozilla.com/D12949
js/src/jsapi-tests/moz.build
js/src/jsapi-tests/testWindowNonConfigurable.cpp
--- 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)