Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/object.c | 20 ++++++++++++++++++-- dlls/jscript/tests/lang.js | 14 ++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c index 169b47c..fd5ab52 100644 --- a/dlls/jscript/object.c +++ b/dlls/jscript/object.c @@ -196,8 +196,24 @@ static HRESULT Object_propertyIsEnumerable(script_ctx_t *ctx, vdisp_t *jsthis, W static HRESULT Object_isPrototypeOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r) { - FIXME("\n"); - return E_NOTIMPL; + jsdisp_t *jsdisp; + BOOL ret = FALSE; + + if(!r) + return S_OK; + + if(argc && is_jsdisp(jsthis) && is_object_instance(argv[0]) && (jsdisp = to_jsdisp(get_object(argv[0])))) { + while(jsdisp->prototype) { + if(jsdisp->prototype == jsthis->u.jsdisp) { + ret = TRUE; + break; + } + jsdisp = jsdisp->prototype; + } + } + + *r = jsval_bool(ret); + return S_OK; }
static HRESULT Object_get_value(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r) diff --git a/dlls/jscript/tests/lang.js b/dlls/jscript/tests/lang.js index ad1217d..63aa669 100644 --- a/dlls/jscript/tests/lang.js +++ b/dlls/jscript/tests/lang.js @@ -1679,14 +1679,28 @@ tmp = new instanceOfTest(); ok((tmp instanceof instanceOfTest) === true, "tmp is not instance of instanceOfTest"); ok((tmp instanceof Object) === true, "tmp is not instance of Object"); ok((tmp instanceof String) === false, "tmp is instance of String"); +ok(instanceOfTest.isPrototypeOf(tmp) === false, "instanceOfTest is prototype of tmp"); +ok(instanceOfTest.prototype.isPrototypeOf(tmp) === true, "instanceOfTest.prototype is not prototype of tmp"); +ok(Object.prototype.isPrototypeOf(tmp) === true, "Object.prototype is not prototype of tmp");
instanceOfTest.prototype = new Object(); ok((tmp instanceof instanceOfTest) === false, "tmp is instance of instanceOfTest"); ok((tmp instanceof Object) === true, "tmp is not instance of Object"); +ok(instanceOfTest.prototype.isPrototypeOf(tmp) === false, "instanceOfTest.prototype is prototype of tmp");
ok((1 instanceof Object) === false, "1 is instance of Object"); ok((false instanceof Boolean) === false, "false is instance of Boolean"); ok(("" instanceof Object) === false, "'' is instance of Object"); +ok(Number.prototype.isPrototypeOf(1) === false, "Number.prototype is prototype of 1"); +ok(String.prototype.isPrototypeOf("") === false, "String.prototype is prototype of ''"); + +ok(tmp.isPrototypeOf(null) === false, "tmp is prototype of null"); +ok(tmp.isPrototypeOf(undefined) === false, "tmp is prototype of undefined"); +ok(Object.prototype.isPrototypeOf.call(tmp) === false, "tmp is prototype of no argument"); +ok(Object.prototype.isPrototypeOf.call(test, Object) === false, "test is prototype of Object"); +ok(Object.prototype.isPrototypeOf.call(testObj, Object) === false, "testObj is prototype of Object"); +ok(Object.prototype.isPrototypeOf(test) === false, "Object.prototype is prototype of test"); +ok(Object.prototype.isPrototypeOf(testObj) === false, "Object.prototype is prototype of testObj");
(function () { ok((arguments instanceof Object) === true, "argument is not instance of Object");
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/jscript/dispex.c | 23 ++++++++++++- dlls/jscript/jscript.h | 2 ++ dlls/jscript/object.c | 28 ++++++++++++++++ dlls/mshtml/tests/documentmode.js | 55 +++++++++++++++++++++++++++++++ 4 files changed, 107 insertions(+), 1 deletion(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index 4c57a69..e64a520 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -461,7 +461,8 @@ static HRESULT prop_put(jsdisp_t *This, dispex_prop_t *prop, jsval_t val) prop_iter = prototype_iter->props + prop_iter->u.ref; } while(prop_iter->type == PROP_PROTREF);
- if(prop_iter->type == PROP_ACCESSOR) + if(prop_iter->type == PROP_ACCESSOR || + (prop_iter->type == PROP_BUILTIN && prop_iter->u.p->setter)) prop = prop_iter; }
@@ -2654,6 +2655,26 @@ HRESULT jsdisp_define_data_property(jsdisp_t *obj, const WCHAR *name, unsigned f return jsdisp_define_property(obj, name, &prop_desc); }
+HRESULT jsdisp_change_prototype(jsdisp_t *obj, jsdisp_t *proto) +{ + DWORD i; + + if(obj->prototype == proto) + return S_OK; + + if(obj->prototype) { + for(i = 0; i < obj->prop_cnt; i++) + if(obj->props[i].type == PROP_PROTREF) + obj->props[i].type = PROP_DELETED; + jsdisp_release(obj->prototype); + } + + obj->prototype = proto; + if(proto) + jsdisp_addref(proto); + return S_OK; +} + void jsdisp_freeze(jsdisp_t *obj, BOOL seal) { unsigned int i; diff --git a/dlls/jscript/jscript.h b/dlls/jscript/jscript.h index 90a5e15..69897cd 100644 --- a/dlls/jscript/jscript.h +++ b/dlls/jscript/jscript.h @@ -104,6 +104,7 @@ HRESULT get_dispatch_typeinfo(ITypeInfo**) DECLSPEC_HIDDEN; #define PROPF_VERSION_SHIFT 16 #define PROPF_HTML (SCRIPTLANGUAGEVERSION_HTML << PROPF_VERSION_SHIFT) #define PROPF_ES5 ((SCRIPTLANGUAGEVERSION_HTML|SCRIPTLANGUAGEVERSION_ES5) << PROPF_VERSION_SHIFT) +#define PROPF_ES6 ((SCRIPTLANGUAGEVERSION_HTML|SCRIPTLANGUAGEVERSION_ES6) << PROPF_VERSION_SHIFT)
/* * This is our internal dispatch flag informing calee that it's called directly from interpreter. @@ -326,6 +327,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,enum jsdisp_enum_type,DISPID*) DECLSPEC_HIDDEN; HRESULT jsdisp_get_prop_name(jsdisp_t*,DISPID,jsstr_t**); +HRESULT jsdisp_change_prototype(jsdisp_t*,jsdisp_t*) DECLSPEC_HIDDEN; void jsdisp_freeze(jsdisp_t*,BOOL) DECLSPEC_HIDDEN; BOOL jsdisp_is_frozen(jsdisp_t*,BOOL) DECLSPEC_HIDDEN;
diff --git a/dlls/jscript/object.c b/dlls/jscript/object.c index fd5ab52..89684f5 100644 --- a/dlls/jscript/object.c +++ b/dlls/jscript/object.c @@ -216,6 +216,33 @@ static HRESULT Object_isPrototypeOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD fla return S_OK; }
+static HRESULT Object_get_proto_(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r) +{ + TRACE("%p\n", jsthis); + + if(r) + *r = jsthis->prototype + ? jsval_obj(jsdisp_addref(jsthis->prototype)) + : jsval_null(); + return S_OK; +} + +static HRESULT Object_set_proto_(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t value) +{ + jsdisp_t *proto; + + TRACE("%p\n", jsthis); + + if(is_undefined(value) || is_null(value)) + proto = NULL; + else if(!is_object_instance(value) || !(proto = to_jsdisp(get_object(value)))) { + FIXME("not an object\n"); + return E_FAIL; + } + + return jsdisp_change_prototype(jsthis, proto); +} + static HRESULT Object_get_value(script_ctx_t *ctx, jsdisp_t *jsthis, jsval_t *r) { jsstr_t *ret; @@ -236,6 +263,7 @@ static void Object_destructor(jsdisp_t *dispex) }
static const builtin_prop_t Object_props[] = { + {L"__proto__", NULL, PROPF_ES6, Object_get_proto_, Object_set_proto_}, {L"hasOwnProperty", Object_hasOwnProperty, PROPF_METHOD|1}, {L"isPrototypeOf", Object_isPrototypeOf, PROPF_METHOD|1}, {L"propertyIsEnumerable", Object_propertyIsEnumerable, PROPF_METHOD|1}, diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 3307f2c..02a5f5f 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -1025,3 +1025,58 @@ sync_test("elem_attr", function() { r = elem.getAttribute("className"); ok(r === "cls3", "className attr = " + r); }); + +sync_test("__proto__", function() { + var v = document.documentMode; + var r, x = 42; + + if(v < 11) { + ok(x.__proto__ === undefined, "x.__proto__ = " + x.__proto__); + ok(!("__proto__" in Object), "Object.__proto__ = " + Object.__proto__); + return; + } + + ok(x.__proto__ === Number.prototype, "x.__proto__ = " + x.__proto__); + ok(Object.__proto__ === Function.prototype, "Object.__proto__ = " + Object.__proto__); + ok(Object.prototype.__proto__ === null, "Object.prototype.__proto__ = " + Object.prototype.__proto__); + ok(Object.prototype.hasOwnProperty("__proto__"), "__proto__ is not a property of Object.prototype"); + ok(!Object.prototype.hasOwnProperty.call(x, "__proto__"), "__proto__ is a property of x"); + + x.__proto__ = Object.prototype; + ok(x.__proto__ === Number.prototype, "x.__proto__ set to Object.prototype = " + x.__proto__); + ok(!Object.prototype.hasOwnProperty.call(x, "__proto__"), "__proto__ is a property of x after set to Object.prototype"); + x = {}; + x.__proto__ = null; + r = Object.getPrototypeOf(x); + ok(x.__proto__ === undefined, "x.__proto__ after set to null = " + x.__proto__); + ok(r === null, "getPrototypeOf(x) after set to null = " + r); + + function check(expect, msg) { + var r = Object.getPrototypeOf(x); + ok(x.__proto__ === expect, "x.__proto__ " + msg + " = " + x.__proto__); + ok(r === expect, "getPrototypeOf(x) " + msg + " = " + r); + ok(!Object.prototype.hasOwnProperty.call(x, "__proto__"), "__proto__ is a property of x " + msg); + } + + x = {}; + check(Object.prototype, "after x set to {}"); + x.__proto__ = Number.prototype; + check(Number.prototype, "after set to Number.prototype"); + x.__proto__ = Object.prototype; + check(Object.prototype, "after re-set to Object.prototype"); + + function ctor() { } + var obj = new ctor(); + x.__proto__ = obj; + check(obj, "after set to obj"); + x.__proto__ = ctor.prototype; + check(obj.__proto__, "after set to ctor.prototype"); + ok(obj.__proto__ === ctor.prototype, "obj.__proto__ !== ctor.prototype"); + + r = (delete x.__proto__); + todo_wine. + ok(r, "delete x.__proto__ returned " + r); + ok(Object.prototype.hasOwnProperty("__proto__"), "__proto__ is not a property of Object.prototype after delete"); + r = Object.getPrototypeOf(x); + ok(r === ctor.prototype, "x.__proto__ after delete = " + r); +});
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=101181
Your paranoid android.
=== w8adm (32 bit report) ===
mshtml: htmldoc.c:3084: Test failed: Incorrect error code: -2146697211 htmldoc.c:3089: Test failed: Page address: L"http://test.winehq.org/tests/winehq_snapshot/" htmldoc.c:5861: Test failed: expected OnChanged_1012 htmldoc.c:5862: Test failed: expected Exec_HTTPEQUIV htmldoc.c:5864: Test failed: expected Exec_SETTITLE htmldoc.c:5905: Test failed: expected FireNavigateComplete2
=== w10pro64_ar (64 bit report) ===
mshtml: htmldoc.c:2541: Test failed: unexpected call UpdateUI htmldoc.c:2853: Test failed: unexpected call Exec_UPDATECOMMANDS htmldoc.c:350: Test failed: expected Exec_SETTITLE htmldoc.c:2859: Test failed: unexpected call Exec_SETTITLE
=== w7u_adm (32 bit report) ===
mshtml: script.c:624: Test failed: L"/index.html?es5.js:date_now: unexpected Date.now() result 1635880888082 expected 1635880888144"
Signed-off-by: Jacek Caban jacek@codeweavers.com
We don't hold a refcount to the location, but only a weak ref (as tests show).
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlwindow.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 0b25e71..4e5b036 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -269,10 +269,8 @@ static void release_inner_window(HTMLInnerWindow *This) heap_free(This->global_props[i].name); heap_free(This->global_props);
- if(This->location) { + if(This->location) This->location->window = NULL; - IHTMLLocation_Release(&This->location->IHTMLLocation_iface); - }
if(This->image_factory) { This->image_factory->window = NULL;
On 11/2/21 7:07 PM, Gabriel Ivăncescu wrote:
We don't hold a refcount to the location, but only a weak ref (as tests show).
To be honest, the test is not really interesting and I think that it would be better to hold the reference instead. What we observe in tests may be explained by some uninteresting internal details (like maybe the returned interface is just some sort of a wrapper), but current behaviour is broken for scripts. As an example like:
location.prop = "test";
var v = location.prop;
location may be released between those sentences, causing "prop" to be lost.
I think that we can just remove the reference count test if it causes problems.
Thanks,
Jacek
On 03/11/2021 21:42, Jacek Caban wrote:
On 11/2/21 7:07 PM, Gabriel Ivăncescu wrote:
We don't hold a refcount to the location, but only a weak ref (as tests show).
To be honest, the test is not really interesting and I think that it would be better to hold the reference instead. What we observe in tests may be explained by some uninteresting internal details (like maybe the returned interface is just some sort of a wrapper), but current behaviour is broken for scripts. As an example like:
location.prop = "test";
var v = location.prop;
location may be released between those sentences, causing "prop" to be lost.
I think that we can just remove the reference count test if it causes problems.
Thanks,
Jacek
Sure, I actually considered that, but didn't know whether the test was important or not. I'll re-send it that way.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlelem.c | 98 ++++++++++++++++++++++++++++++- dlls/mshtml/tests/documentmode.js | 63 ++++++++++++++++++++ 2 files changed, 160 insertions(+), 1 deletion(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index de69e2f..503a287 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -355,6 +355,98 @@ static inline HTMLElement *impl_from_IHTMLElement(IHTMLElement *iface) return CONTAINING_RECORD(iface, HTMLElement, IHTMLElement_iface); }
+static HRESULT create_nselem_parse(HTMLDocumentNode *doc, const WCHAR *tag, nsIDOMElement **ret) +{ + WCHAR *p = wcschr(tag + 1, '>'); + nsIDOMHTMLCollection *nscol; + UINT32 i, name_len, length; + nsIDOMHTMLElement *nshtml; + HRESULT hres = E_FAIL; + nsresult nsres; + nsAString str; + + if(!p || p[1] || wcschr(tag + 1, '<')) + return E_FAIL; + if(!doc->nsdoc) { + WARN("NULL nsdoc\n"); + return E_UNEXPECTED; + } + + /* Ignore the > or /> end token */ + length = p - tag - (p[-1] == '/'); + + /* Get the tag name using HTML whitespace rules */ + name_len = length - 1; + for(i = 1; i < length; i++) { + if((tag[i] >= 0x09 && tag[i] <= 0x0d) || tag[i] == ' ') { + name_len = i - 1; + break; + } + } + if(!name_len) + return E_FAIL; + + /* Create a temporary html element and parse it there */ + nsAString_InitDepend(&str, L"HTML"); + nsres = nsIDOMHTMLDocument_CreateElement(doc->nsdoc, &str, (nsIDOMElement**)&nshtml); + nsAString_Finish(&str); + if(NS_FAILED(nsres)) + return map_nsresult(nsres); + + if(name_len == 4 && !wcsnicmp(tag + 1, L"HTML", 4)) { + FIXME("Returning <html> element with no attributes\n"); + *ret = (nsIDOMElement*)nshtml; + return S_OK; + } + + nsAString_InitDepend(&str, tag); + nsres = nsIDOMHTMLElement_SetInnerHTML(nshtml, &str); + nsAString_Finish(&str); + if(NS_FAILED(nsres)) { + hres = map_nsresult(nsres); + goto fail; + } + + /* Get the element and remove it from the temporary */ + if(!(p = heap_alloc((name_len + 1) * sizeof(WCHAR)))) + hres = E_OUTOFMEMORY; + else { + memcpy(p, tag + 1, name_len * sizeof(WCHAR)); + p[name_len] = '\0'; + nsAString_InitDepend(&str, p); + nsres = nsIDOMHTMLElement_GetElementsByTagName(nshtml, &str, &nscol); + nsAString_Finish(&str); + heap_free(p); + if(NS_FAILED(nsres)) + goto fail; + + length = 0; + nsres = nsIDOMHTMLCollection_GetLength(nscol, &length); + if(NS_SUCCEEDED(nsres) && length == 1) { + nsIDOMNode *nsnode, *nsparent, *tmp; + + nsIDOMHTMLCollection_Item(nscol, 0, &nsnode); + nsres = nsIDOMNode_GetParentNode(nsnode, &nsparent); + if(NS_SUCCEEDED(nsres)) { + nsres = nsIDOMNode_RemoveChild(nsparent, nsnode, &tmp); + nsIDOMNode_Release(nsparent); + if(NS_SUCCEEDED(nsres)) { + nsres = nsIDOMNode_QueryInterface(tmp, &IID_nsIDOMElement, (void**)ret); + nsIDOMNode_Release(tmp); + if(NS_SUCCEEDED(nsres)) + hres = S_OK; + } + } + nsIDOMNode_Release(nsnode); + } + nsIDOMHTMLCollection_Release(nscol); + } + +fail: + nsIDOMHTMLElement_Release(nshtml); + return hres; +} + HRESULT create_nselem(HTMLDocumentNode *doc, const WCHAR *tag, nsIDOMElement **ret) { nsAString tag_str; @@ -385,7 +477,11 @@ HRESULT create_element(HTMLDocumentNode *doc, const WCHAR *tag, HTMLElement **re if(!doc->nsdoc) doc = doc->node.doc;
- hres = create_nselem(doc, tag, &nselem); + /* IE8 and below allow creating elements with attributes, such as <div class="a"> */ + if(tag[0] == '<' && dispex_compat_mode(&doc->node.event_target.dispex) <= COMPAT_MODE_IE8) + hres = create_nselem_parse(doc, tag, &nselem); + else + hres = create_nselem(doc, tag, &nselem); if(FAILED(hres)) return hres;
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 02a5f5f..69f4796 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -488,6 +488,69 @@ sync_test("style_props", function() { } });
+sync_test("createElement_inline_attr", function() { + var v = document.documentMode, e, s; + + if(v < 9) { + s = document.createElement("<div>").tagName; + ok(s === "DIV", "<div>.tagName returned " + s); + s = document.createElement("<div >").tagName; + ok(s === "DIV", "<div >.tagName returned " + s); + s = document.createElement("<div/>").tagName; + ok(s === "DIV", "<div/>.tagName returned " + s); + e = 0; + try { + document.createElement("<div"); + }catch(ex) { + e = ex.number; + } + ok(e === 0x4005 - 0x80000000, "<div e = " + e); + e = 0; + try { + document.createElement("<div test=1"); + }catch(ex) { + e = ex.number; + } + ok(e === 0x4005 - 0x80000000, "<div test=1 e = " + e); + + var tags = [ "div", "head", "body", "title" ]; + + for(var i = 0; i < tags.length; i++) { + e = document.createElement("<" + tags[i] + " test='a"' abcd=""b"">"); + ok(e.tagName === tags[i].toUpperCase(), "<" + tags[i] + " test="a" abcd="b">.tagName returned " + e.tagName); + todo_wine_if(v == 8). + ok(e.test === "a"", "<" + tags[i] + " test='a"' abcd=""b"">.test returned " + e.test); + todo_wine_if(v == 8). + ok(e.abcd === ""b"", "<" + tags[i] + " test='a"' abcd=""b"">.abcd returned " + e.abcd); + } + }else { + s = ""; + e = 0; + try { + document.createElement("<div>"); + }catch(ex) { + s = ex.toString(); + e = ex.number; + } + todo_wine. + ok(e === undefined, "<div> e = " + e); + todo_wine. + ok(s === "InvalidCharacterError", "<div> s = " + s); + s = ""; + e = 0; + try { + document.createElement("<div test="a">"); + }catch(ex) { + s = ex.toString(); + e = ex.number; + } + todo_wine. + ok(e === undefined, "<div test="a"> e = " + e); + todo_wine. + ok(s === "InvalidCharacterError", "<div test="a"> s = " + s); + } +}); + sync_test("JS objs", function() { var g = window;
For IE modes 8 and above, IHTMLElement::setAttribute uses the underlying nsIDOMElement::SetAttribute, which does nothing since we're already enumerating the ns attributes, and we're supposed to create the DISPIDs for them.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlelem.c | 5 ++++- dlls/mshtml/tests/documentmode.js | 2 -- 2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 503a287..6624264 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -6480,7 +6480,10 @@ static HRESULT HTMLElement_populate_props(DispatchEx *dispex) } else V_BSTR(&value) = NULL;
- IHTMLElement_setAttribute(&This->IHTMLElement_iface, name, value, 0); + hres = IDispatchEx_GetDispID(&dispex->IDispatchEx_iface, name, fdexNameEnsure | fdexNameCaseInsensitive, &id); + if(SUCCEEDED(hres)) + set_elem_attr_value_by_dispid(This, id, &value); + SysFreeString(name); VariantClear(&value); } diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 69f4796..d7c1350 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -518,9 +518,7 @@ sync_test("createElement_inline_attr", function() { for(var i = 0; i < tags.length; i++) { e = document.createElement("<" + tags[i] + " test='a"' abcd=""b"">"); ok(e.tagName === tags[i].toUpperCase(), "<" + tags[i] + " test="a" abcd="b">.tagName returned " + e.tagName); - todo_wine_if(v == 8). ok(e.test === "a"", "<" + tags[i] + " test='a"' abcd=""b"">.test returned " + e.test); - todo_wine_if(v == 8). ok(e.abcd === ""b"", "<" + tags[i] + " test='a"' abcd=""b"">.abcd returned " + e.abcd); } }else {
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=101184
Your paranoid android.
=== w8adm (32 bit report) ===
mshtml: events.c:1089: Test failed: unexpected call img_onerror events: Timeout
=== w8adm (32 bit report) ===
mshtml: htmldoc.c:3084: Test failed: Incorrect error code: -2146697211 htmldoc.c:3089: Test failed: Page address: L"http://test.winehq.org/tests/winehq_snapshot/" htmldoc.c:5861: Test failed: expected OnChanged_1012 htmldoc.c:5862: Test failed: expected Exec_HTTPEQUIV htmldoc.c:5864: Test failed: expected Exec_SETTITLE htmldoc.c:5905: Test failed: expected FireNavigateComplete2
=== w10pro64 (64 bit report) ===
mshtml: htmldoc.c:2541: Test failed: unexpected call UpdateUI htmldoc.c:2853: Test failed: unexpected call Exec_UPDATECOMMANDS htmldoc.c:350: Test failed: expected Exec_SETTITLE htmldoc.c:2859: Test failed: unexpected call Exec_SETTITLE