jscript: Add String.prototype.toLocaleUpperCase and toLocaleLowerCase implementation.

They are supposed to be locale-specific, but my testing shows that it's
not the case in native.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2021-03-15 18:19:26 +01:00 committed by Alexandre Julliard
parent 6c9c77fdf1
commit 07cebfc928
2 changed files with 57 additions and 39 deletions

View file

@ -1363,45 +1363,11 @@ static HRESULT String_sup(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsign
return do_attributeless_tag_format(ctx, jsthis, r, L"SUP");
}
static HRESULT String_toLowerCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
jsstr_t *str;
HRESULT hres;
TRACE("\n");
hres = get_string_val(ctx, jsthis, &str);
if(FAILED(hres))
return hres;
if(r) {
unsigned len = jsstr_length(str);
jsstr_t *ret;
WCHAR *buf;
ret = jsstr_alloc_buf(len, &buf);
if(!ret) {
jsstr_release(str);
return E_OUTOFMEMORY;
}
jsstr_flush(str, buf);
for (; len--; buf++) *buf = towlower(*buf);
*r = jsval_string(ret);
}
jsstr_release(str);
return S_OK;
}
static HRESULT String_toUpperCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
static HRESULT to_upper_case(script_ctx_t *ctx, vdisp_t *jsthis, jsval_t *r)
{
jsstr_t *str;
HRESULT hres;
TRACE("\n");
hres = get_string_val(ctx, jsthis, &str);
if(FAILED(hres))
@ -1427,18 +1393,62 @@ static HRESULT String_toUpperCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags
return S_OK;
}
static HRESULT to_lower_case(script_ctx_t *ctx, vdisp_t *jsthis, jsval_t *r)
{
jsstr_t *str;
HRESULT hres;
hres = get_string_val(ctx, jsthis, &str);
if(FAILED(hres))
return hres;
if(r) {
unsigned len = jsstr_length(str);
jsstr_t *ret;
WCHAR *buf;
ret = jsstr_alloc_buf(len, &buf);
if(!ret) {
jsstr_release(str);
return E_OUTOFMEMORY;
}
jsstr_flush(str, buf);
for (; len--; buf++) *buf = towlower(*buf);
*r = jsval_string(ret);
}
jsstr_release(str);
return S_OK;
}
static HRESULT String_toLowerCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
TRACE("\n");
return to_lower_case(ctx, jsthis, r);
}
static HRESULT String_toUpperCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
TRACE("\n");
return to_upper_case(ctx, jsthis, r);
}
static HRESULT String_toLocaleLowerCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
FIXME("\n");
return E_NOTIMPL;
TRACE("\n");
return to_lower_case(ctx, jsthis, r);
}
static HRESULT String_toLocaleUpperCase(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
FIXME("\n");
return E_NOTIMPL;
TRACE("\n");
return to_upper_case(ctx, jsthis, r);
}
static HRESULT String_trim(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc,

View file

@ -753,10 +753,14 @@ tmp = "test".toLowerCase(3);
ok(tmp === "test", "''.toLowerCase(3) = " + tmp);
tmp = "tEsT".toLowerCase();
ok(tmp === "test", "''.toLowerCase() = " + tmp);
tmp = "tEsT".toLocaleLowerCase();
ok(tmp === "test", "''.toLocaleLowerCase() = " + tmp);
tmp = "tEsT".toLowerCase(3);
ok(tmp === "test", "''.toLowerCase(3) = " + tmp);
tmp = ("tE" + String.fromCharCode(0) + "sT").toLowerCase();
ok(tmp === "te" + String.fromCharCode(0) + "st", "''.toLowerCase() = " + tmp);
ok(String.prototype.toLocaleLowerCase != String.prototype.toLowerCase,
"String.prototype.toLocaleLowerCase == String.prototype.toLowerCase");
tmp = "".toUpperCase();
ok(tmp === "", "''.toUpperCase() = " + tmp);
@ -768,8 +772,12 @@ tmp = "tEsT".toUpperCase();
ok(tmp === "TEST", "''.toUpperCase() = " + tmp);
tmp = "tEsT".toUpperCase(3);
ok(tmp === "TEST", "''.toUpperCase(3) = " + tmp);
tmp = "tEsT".toLocaleUpperCase(3);
ok(tmp === "TEST", "''.toLocaleUpperCase(3) = " + tmp);
tmp = ("tE" + String.fromCharCode(0) + "sT").toUpperCase();
ok(tmp === "TE" + String.fromCharCode(0) + "ST", "''.toUpperCase() = " + tmp);
ok(String.prototype.toLocaleUpperCase != String.prototype.toUpperCase,
"String.prototype.toLocaleUpperCase == String.prototype.toUpperCase");
tmp = "".anchor();
ok(tmp === "<A NAME=\"undefined\"></A>", "''.anchor() = " + tmp);