Jacek Caban : jscript: Add Object.seal implementation.
Alexandre Julliard
julliard at winehq.org
Thu Apr 1 16:09:30 CDT 2021
Module: wine
Branch: master
Commit: 51742d80cd6d4ca9d07aab4f76abd8da0898b4d4
URL: https://source.winehq.org/git/wine.git/?a=commit;h=51742d80cd6d4ca9d07aab4f76abd8da0898b4d4
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Apr 1 18:19:16 2021 +0200
jscript: Add Object.seal implementation.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/jscript/dispex.c | 4 ++--
dlls/jscript/jscript.h | 2 +-
dlls/jscript/object.c | 26 +++++++++++++++++++++++++-
dlls/mshtml/tests/es5.js | 41 +++++++++++++++++++++++++++++++++++++++++
4 files changed, 69 insertions(+), 4 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index 57f5d09daee..ca404f92fe5 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -2628,12 +2628,12 @@ HRESULT jsdisp_define_data_property(jsdisp_t *obj, const WCHAR *name, unsigned f
return jsdisp_define_property(obj, name, &prop_desc);
}
-void jsdisp_freeze(jsdisp_t *obj)
+void jsdisp_freeze(jsdisp_t *obj, BOOL seal)
{
unsigned int i;
for(i = 0; i < obj->prop_cnt; i++) {
- if(obj->props[i].type == PROP_JSVAL)
+ if(!seal && obj->props[i].type == PROP_JSVAL)
obj->props[i].flags &= ~PROPF_WRITABLE;
obj->props[i].flags &= ~PROPF_CONFIGURABLE;
}
diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h
index d4ebb3246dd..3999f04a970 100644
--- a/dlls/jscript/jscript.h
+++ b/dlls/jscript/jscript.h
@@ -317,7 +317,7 @@ HRESULT jsdisp_define_property(jsdisp_t*,const WCHAR*,property_desc_t*) DECLSPEC
HRESULT jsdisp_define_data_property(jsdisp_t*,const WCHAR*,unsigned,jsval_t) DECLSPEC_HIDDEN;
HRESULT jsdisp_next_prop(jsdisp_t*,DISPID,BOOL,DISPID*) DECLSPEC_HIDDEN;
HRESULT jsdisp_get_prop_name(jsdisp_t*,DISPID,jsstr_t**);
-void jsdisp_freeze(jsdisp_t*) DECLSPEC_HIDDEN;
+void jsdisp_freeze(jsdisp_t*,BOOL) DECLSPEC_HIDDEN;
HRESULT create_builtin_function(script_ctx_t*,builtin_invoke_t,const WCHAR*,const builtin_info_t*,DWORD,
jsdisp_t*,jsdisp_t**) DECLSPEC_HIDDEN;
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c
index 3dcfd297a9b..86c656a719a 100644
--- a/dlls/jscript/object.c
+++ b/dlls/jscript/object.c
@@ -711,7 +711,30 @@ static HRESULT Object_freeze(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, uns
return E_NOTIMPL;
}
- jsdisp_freeze(obj);
+ jsdisp_freeze(obj, FALSE);
+ if(r) *r = jsval_obj(jsdisp_addref(obj));
+ return S_OK;
+}
+
+static HRESULT Object_seal(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc,
+ jsval_t *argv, jsval_t *r)
+{
+ jsdisp_t *obj;
+
+ if(!argc || !is_object_instance(argv[0]) || !get_object(argv[0])) {
+ WARN("argument is not an object\n");
+ return JS_E_OBJECT_EXPECTED;
+ }
+
+ TRACE("(%s)\n", debugstr_jsval(argv[0]));
+
+ obj = to_jsdisp(get_object(argv[0]));
+ if(!obj) {
+ FIXME("Non-JS object\n");
+ return E_NOTIMPL;
+ }
+
+ jsdisp_freeze(obj, TRUE);
if(r) *r = jsval_obj(jsdisp_addref(obj));
return S_OK;
}
@@ -747,6 +770,7 @@ static const builtin_prop_t ObjectConstr_props[] = {
{L"isExtensible", Object_isExtensible, PROPF_ES5|PROPF_METHOD|1},
{L"keys", Object_keys, PROPF_ES5|PROPF_METHOD|1},
{L"preventExtensions", Object_preventExtensions, PROPF_ES5|PROPF_METHOD|1},
+ {L"seal", Object_seal, PROPF_ES5|PROPF_METHOD|1},
};
static const builtin_info_t ObjectConstr_info = {
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
index ae73d435456..6099c4090f3 100644
--- a/dlls/mshtml/tests/es5.js
+++ b/dlls/mshtml/tests/es5.js
@@ -1024,6 +1024,47 @@ sync_test("freeze", function() {
ok(o.accprop === 3, "o.accprop = " + o.accprop);
});
+sync_test("seal", function() {
+ ok(Object.seal.length === 1, "Object.seal.length = " + Object.seal.length);
+ try {
+ Object.seal(1);
+ ok(false, "exception expected");
+ }catch(e) {
+ ok(e.name === "TypeError", "got " + e.name + " exception");
+ }
+
+ function f() {}
+
+ var o = {}, r;
+ o.prop = 1;
+ o.func = f;
+ Object.defineProperty(o, "accprop", {
+ get: function() {
+ return r;
+ },
+ set: function(v) {
+ r = v;
+ }
+ });
+
+ test_own_data_prop_desc(o, "prop", true, true, true);
+ r = Object.seal(o);
+ ok(r === o, "r != o");
+ test_own_data_prop_desc(o, "prop", true, true, false);
+ test_own_data_prop_desc(o, "func", true, true, false);
+ ok(!Object.isExtensible(o), "o is still extensible");
+ o.prop = false;
+ o.func = false;
+ ok(o.prop === false, "o.prop = " + o.prop);
+ ok(o.func === false, "o.func = " + o.func);
+
+ r = 1;
+ o.accprop = 2;
+ ok(r === 2, "r = " + r);
+ r = 3;
+ ok(o.accprop === 3, "o.accprop = " + o.accprop);
+});
+
sync_test("head_setter", function() {
document.head = "";
ok(typeof(document.head) === "object", "typeof(document.head) = " + typeof(document.head));
More information about the wine-cvs
mailing list