-- v3: mshtml: Set the name of the non-function constructors to the same as
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 9 +++++++++ dlls/mshtml/mshtml_private.h | 3 +++ dlls/mshtml/tests/documentmode.js | 6 ++++++ dlls/mshtml/tests/es5.js | 1 - 4 files changed, 18 insertions(+), 1 deletion(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index f69f1fe242c..f0a69c8734c 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1855,6 +1855,8 @@ HRESULT dispex_to_string(DispatchEx *dispex, BSTR *ret) if(compat_mode < COMPAT_MODE_IE9) p--; else { + if(dispex->info->vtbl->get_name) + name = dispex->info->vtbl->get_name(dispex); while(*name) *p++ = *name++; assert(p + ARRAY_SIZE(suffix) - buf <= ARRAY_SIZE(buf)); @@ -3066,9 +3068,16 @@ static HRESULT constructor_find_dispid(DispatchEx *dispex, const WCHAR *name, DW return hres; }
+static const char *constructor_get_name(DispatchEx *dispex) +{ + struct constructor *constr = constr_from_DispatchEx(dispex); + return object_names[constr->id - 1]; +} + static const dispex_static_data_vtbl_t constructor_dispex_vtbl = { .destructor = constructor_destructor, .find_dispid = constructor_find_dispid, + .get_name = constructor_get_name, };
static dispex_static_data_t constructor_dispex = { diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 11ee0afd3c7..1f4c6ae4b65 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -404,6 +404,9 @@ typedef struct {
/* Used by objects that want to populate some dynamic props on initialization */ HRESULT (*populate_props)(DispatchEx*); + + /* Used by objects that want to return a custom name instead of the one in the dispex static data */ + const char *(*get_name)(DispatchEx*); } dispex_static_data_vtbl_t;
#define ALL_PROTOTYPES \ diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 9f62ca68f1d..fea12ce1f1a 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -353,6 +353,12 @@ sync_test("builtin_toString", function() { test("SVGSVGElement", document.createElementNS(svg_ns, "svg"), "SVGSVGElement"); test("SVGCircleElement", document.createElementNS(svg_ns, "circle"), "SVGCircleElement"); test("SVGCircleElement", document.createElementNS(svg_ns, "tspan"), "SVGTSpanElement"); + + /* Non-function constructors */ + var props = Object.getOwnPropertyNames(window); + for(i = 0; i < props.length; i++) + if(typeof(window[props[i]]) === "object" && window[props[i]].hasOwnProperty("prototype")) + test(props[i] + " constructor", window[props[i]], props[i]); } });
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index 0033a06fa3c..e15e3f379cd 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -2907,7 +2907,6 @@ sync_test("prototypes", function() { test_own_data_prop_desc(window, "DOMImplementation", true, false, true); ok(Object.getPrototypeOf(DOMImplementation) === Object.prototype, "Object.getPrototypeOf(DOMImplementation) = " + Object.getPrototypeOf(DOMImplementation)); - todo_wine. ok(DOMImplementation == "[object DOMImplementation]", "DOMImplementation = " + DOMImplementation);
var proto = constr.prototype;
This merge request was approved by Jacek Caban.