Based on patch by Gabriel Ivăncescu.
The part allowing properties to disappear as part of enumeration (as well as similar changes from previous MR) is not quite optimal. I think we will want to avoid it once host prototypes are supported.
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/dispex.c | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index d9d7b35526f..c34ff889b11 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -2391,31 +2391,16 @@ static HRESULT WINAPI JSDispatchHost_LookupProperty(IWineJSDispatchHost *iface, static HRESULT WINAPI JSDispatchHost_NextProperty(IWineJSDispatchHost *iface, DISPID id, struct property_info *desc) { DispatchEx *This = impl_from_IWineJSDispatchHost(iface); - func_info_t *func; + DISPID next; HRESULT hres;
TRACE("%s (%p)->(%lx)\n", This->info->desc->name, This, id);
- if(id == DISPID_STARTENUM) { - func = This->info->funcs; - }else { - hres = get_builtin_func(This->info, id, &func); - if(FAILED(hres)) - return hres; - func++; - } + hres = dispex_next_id(This, id, &next); + if(hres != S_OK) + return hres;
- while(func < This->info->funcs + This->info->func_cnt) { - if(func->func_disp_idx == -1) { - desc->id = func->id; - desc->name = func->name; - desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE | PROPF_ENUMERABLE; - desc->func_iid = 0; - return S_OK; - } - func++; - } - return S_FALSE; + return get_host_property_descriptor(This, next, desc); }
static HRESULT WINAPI JSDispatchHost_GetProperty(IWineJSDispatchHost *iface, DISPID id, LCID lcid, VARIANT *r,
From: Jacek Caban jacek@codeweavers.com
--- dlls/jscript/dispex.c | 6 ++++++ 1 file changed, 6 insertions(+)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index 3859f4c9a30..1b61ba531e9 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -3033,6 +3033,12 @@ HRESULT jsdisp_next_prop(jsdisp_t *obj, DISPID id, enum jsdisp_enum_type enum_ty }
for(iter = &obj->props[idx]; iter < obj->props + obj->prop_cnt; iter++) { + if(iter->type == PROP_EXTERN) { + dispex_prop_t *prop; + hres = find_external_prop(obj, iter->name, FALSE, iter, &prop); + if(FAILED(hres) || prop != iter) + iter->type = PROP_DELETED; + } if(iter->type == PROP_DELETED) continue; if(enum_type != JSDISP_ENUM_ALL && iter->type == PROP_PROTREF)
From: Jacek Caban jacek@codeweavers.com
Based on patch by Gabriel Ivăncescu. --- dlls/mshtml/htmlstorage.c | 26 +++++++++++++------------- dlls/mshtml/tests/documentmode.js | 4 ++-- 2 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/dlls/mshtml/htmlstorage.c b/dlls/mshtml/htmlstorage.c index 9920a641957..05ef086a814 100644 --- a/dlls/mshtml/htmlstorage.c +++ b/dlls/mshtml/htmlstorage.c @@ -1117,17 +1117,6 @@ static HRESULT HTMLStorage_get_dispid(DispatchEx *dispex, const WCHAR *name, DWO return get_prop(This, name, dispid); }
-static HRESULT HTMLStorage_get_name(DispatchEx *dispex, DISPID id, BSTR *name) -{ - HTMLStorage *This = impl_from_DispatchEx(dispex); - DWORD idx = id - MSHTML_DISPID_CUSTOM_MIN; - - if(idx >= This->num_props) - return DISP_E_MEMBERNOTFOUND; - - return (*name = SysAllocString(This->props[idx])) ? S_OK : E_OUTOFMEMORY; -} - static HRESULT HTMLStorage_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { @@ -1278,16 +1267,27 @@ static HRESULT HTMLStorage_next_dispid(DispatchEx *dispex, DISPID id, DISPID *pi return S_OK; }
+static HRESULT HTMLStorage_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_info *desc) +{ + HTMLStorage *This = impl_from_DispatchEx(dispex); + + desc->name = This->props[id - MSHTML_DISPID_CUSTOM_MIN]; + desc->id = id; + desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE | PROPF_ENUMERABLE; + desc->func_iid = 0; + return S_OK; +} + static const dispex_static_data_vtbl_t HTMLStorage_dispex_vtbl = { .query_interface = HTMLStorage_query_interface, .destructor = HTMLStorage_destructor, .traverse = HTMLStorage_traverse, .unlink = HTMLStorage_unlink, .get_dispid = HTMLStorage_get_dispid, - .get_name = HTMLStorage_get_name, .invoke = HTMLStorage_invoke, .delete = HTMLStorage_delete, .next_dispid = HTMLStorage_next_dispid, + .get_prop_desc = HTMLStorage_get_prop_desc, };
static const tid_t HTMLStorage_iface_tids[] = { @@ -1451,7 +1451,7 @@ HRESULT create_html_storage(HTMLInnerWindow *window, BOOL local, IHTMLStorage ** storage->window = window; IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface);
- init_dispatch(&storage->dispex, &HTMLStorage_dispex, NULL, + init_dispatch(&storage->dispex, &HTMLStorage_dispex, window, dispex_compat_mode(&window->event_target.dispex));
*p = &storage->IHTMLStorage_iface; diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 5fada630a51..3fb0fbab1d9 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -300,7 +300,7 @@ sync_test("builtin_toString", function() { test("elements", document.getElementsByTagName("body"), "HTMLCollection", null, true); test("history", window.history, "History"); test("implementation", document.implementation, "DOMImplementation"); - if(localStorage) test("localStorage", localStorage, "Storage", null, true); + if(localStorage) test("localStorage", localStorage, "Storage"); test("location", window.location, "Object", window.location.href, null, true); if(v >= 11 /* todo_wine */) test("mimeTypes", window.navigator.mimeTypes, v < 11 ? "MSMimeTypesCollection" : "MimeTypeArray"); test("navigator", window.navigator, "Navigator"); @@ -309,7 +309,7 @@ sync_test("builtin_toString", function() { test("performanceTiming", window.performance.timing, "PerformanceTiming"); if(v >= 11 /* todo_wine */) test("plugins", window.navigator.plugins, v < 11 ? "MSPluginsCollection" : "PluginArray"); test("screen", window.screen, "Screen"); - test("sessionStorage", window.sessionStorage, "Storage", null, true); + test("sessionStorage", window.sessionStorage, "Storage"); test("style", document.body.style, "MSStyleCSSProperties", null, true); test("styleSheet", sheet, "CSSStyleSheet", null, true); test("styleSheetRule", sheet.rules[0], "CSSStyleRule", null, true);
From: Jacek Caban jacek@codeweavers.com
Based on patch by Gabriel Ivăncescu. --- dlls/mshtml/htmlframe.c | 16 +++++++--------- dlls/mshtml/htmlwindow.c | 22 ++++++++++++++++++++-- dlls/mshtml/mshtml_private.h | 4 ++++ dlls/mshtml/tests/documentmode.js | 2 +- 4 files changed, 32 insertions(+), 12 deletions(-)
diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c index 78890b43e05..b9f92bb5563 100644 --- a/dlls/mshtml/htmlframe.c +++ b/dlls/mshtml/htmlframe.c @@ -870,17 +870,15 @@ static HRESULT HTMLFrameElement_get_dispid(DispatchEx *dispex, const WCHAR *name return search_window_props(This->framebase.content_window->base.inner_window, name, grfdex, dispid); }
-static HRESULT HTMLFrameElement_get_name(DispatchEx *dispex, DISPID id, BSTR *name) +static HRESULT HTMLFrameElement_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_info *desc) { HTMLFrameElement *This = frame_from_DispatchEx(dispex); - DWORD idx = id - MSHTML_DISPID_CUSTOM_MIN;
- if(!This->framebase.content_window || - idx >= This->framebase.content_window->base.inner_window->global_prop_cnt) + if(!This->framebase.content_window) return DISP_E_MEMBERNOTFOUND;
- *name = SysAllocString(This->framebase.content_window->base.inner_window->global_props[idx].name); - return *name ? S_OK : E_OUTOFMEMORY; + return HTMLWindow_get_prop_desc(&This->framebase.content_window->base.inner_window->event_target.dispex, + id, desc); }
static HRESULT HTMLFrameElement_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, @@ -893,8 +891,8 @@ static HRESULT HTMLFrameElement_invoke(DispatchEx *dispex, DISPID id, LCID lcid, return E_FAIL; }
- return IWineJSDispatchHost_InvokeEx(&This->framebase.content_window->IWineJSDispatchHost_iface, id, lcid, - flags, params, res, ei, caller); + return HTMLWindow_invoke(&This->framebase.content_window->base.inner_window->event_target.dispex, + id, lcid, flags, params, res, ei, caller); }
static const NodeImplVtbl HTMLFrameElementImplVtbl = { @@ -915,7 +913,7 @@ static const event_target_vtbl_t HTMLFrameElement_event_target_vtbl = { .traverse = HTMLFrameElement_traverse, .unlink = HTMLFrameElement_unlink, .get_dispid = HTMLFrameElement_get_dispid, - .get_name = HTMLFrameElement_get_name, + .get_prop_desc = HTMLFrameElement_get_prop_desc, .invoke = HTMLFrameElement_invoke }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index ceac07e4dd3..a7a6b0df383 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3830,8 +3830,8 @@ static HRESULT HTMLWindow_find_dispid(DispatchEx *dispex, const WCHAR *name, DWO return DISP_E_UNKNOWNNAME; }
-static HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, - VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) +HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, + VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); global_prop_t *prop; @@ -3946,6 +3946,24 @@ static HRESULT HTMLWindow_next_dispid(DispatchEx *dispex, DISPID id, DISPID *pid return S_OK; }
+HRESULT HTMLWindow_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_info *desc) +{ + HTMLInnerWindow *This = impl_from_DispatchEx(dispex); + global_prop_t *prop; + + if(id - MSHTML_DISPID_CUSTOM_MIN >= This->global_prop_cnt) + return DISP_E_MEMBERNOTFOUND; + + prop = &This->global_props[id - MSHTML_DISPID_CUSTOM_MIN]; + desc->name = prop->name; + desc->id = id; + desc->flags = PROPF_WRITABLE | PROPF_CONFIGURABLE; + if(prop->type == GLOBAL_DISPEXVAR) + desc->flags |= PROPF_ENUMERABLE; + desc->func_iid = 0; + return S_OK; +} + static compat_mode_t HTMLWindow_get_compat_mode(DispatchEx *dispex, HTMLInnerWindow **script_global) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 04c51fb2503..9d84cbabe55 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1069,6 +1069,10 @@ void HTMLDocumentObj_Service_Init(HTMLDocumentObj*); void HTMLDocumentObj_OleCmd_Init(HTMLDocumentObj*); void TargetContainer_Init(HTMLDocumentObj*);
+HRESULT HTMLWindow_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_info *desc); +HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, + VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller); + void HTMLDocumentNode_Persist_Init(HTMLDocumentNode*); void HTMLDocumentNode_Service_Init(HTMLDocumentNode*); void HTMLDocumentNode_OleCmd_Init(HTMLDocumentNode*); diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 3fb0fbab1d9..f608e573a34 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -150,7 +150,7 @@ sync_test("builtin_toString", function() { [ "font", "Font", -1 ], [ "footer", "" ], [ "form", "Form" ], - [ "frame", "Frame", -1 ], + [ "frame", "Frame" ], [ "frameset", "FrameSet", -1 ], [ "h1", "Heading", -1 ], [ "h2", "Heading", -1 ],
From: Jacek Caban jacek@codeweavers.com
Based on patch by Gabriel Ivăncescu. --- dlls/mshtml/htmlframe.c | 16 +++++++--------- dlls/mshtml/tests/documentmode.js | 2 +- 2 files changed, 8 insertions(+), 10 deletions(-)
diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c index b9f92bb5563..8082af43be5 100644 --- a/dlls/mshtml/htmlframe.c +++ b/dlls/mshtml/htmlframe.c @@ -1305,17 +1305,15 @@ static HRESULT HTMLIFrame_get_dispid(DispatchEx *dispex, const WCHAR *name, DWOR return search_window_props(This->framebase.content_window->base.inner_window, name, grfdex, dispid); }
-static HRESULT HTMLIFrame_get_name(DispatchEx *dispex, DISPID id, BSTR *name) +static HRESULT HTMLIFrame_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_info *desc) { HTMLIFrame *This = iframe_from_DispatchEx(dispex); - DWORD idx = id - MSHTML_DISPID_CUSTOM_MIN;
- if(!This->framebase.content_window || - idx >= This->framebase.content_window->base.inner_window->global_prop_cnt) + if(!This->framebase.content_window) return DISP_E_MEMBERNOTFOUND;
- *name = SysAllocString(This->framebase.content_window->base.inner_window->global_props[idx].name); - return *name ? S_OK : E_OUTOFMEMORY; + return HTMLWindow_get_prop_desc(&This->framebase.content_window->base.inner_window->event_target.dispex, + id, desc); }
static HRESULT HTMLIFrame_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, @@ -1328,8 +1326,8 @@ static HRESULT HTMLIFrame_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD return E_FAIL; }
- return IWineJSDispatchHost_InvokeEx(&This->framebase.content_window->IWineJSDispatchHost_iface, id, lcid, - flags, params, res, ei, caller); + return HTMLWindow_invoke(&This->framebase.content_window->base.inner_window->event_target.dispex, + id, lcid, flags, params, res, ei, caller); }
static const NodeImplVtbl HTMLIFrameImplVtbl = { @@ -1350,7 +1348,7 @@ static const event_target_vtbl_t HTMLIFrame_event_target_vtbl = { .traverse = HTMLIFrame_traverse, .unlink = HTMLIFrame_unlink, .get_dispid = HTMLIFrame_get_dispid, - .get_name = HTMLIFrame_get_name, + .get_prop_desc = HTMLIFrame_get_prop_desc, .invoke = HTMLIFrame_invoke }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index f608e573a34..ff4fbdf306b 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -164,7 +164,7 @@ sync_test("builtin_toString", function() { [ "hr", "HR", -1 ], [ "html", "Html" ], [ "i", "Phrase", -1 ], - [ "iframe", "IFrame", -1 ], + [ "iframe", "IFrame" ], [ "img", "Image" ], [ "input", "Input" ], [ "ins", "Mod", -1 ],
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/dispex.c | 9 +++++++++ dlls/mshtml/htmlevent.c | 19 +++++++------------ dlls/mshtml/htmlevent.h | 1 - dlls/mshtml/htmlwindow.c | 13 ++++++++++--- dlls/mshtml/mshtml_private.h | 4 ++++ 5 files changed, 30 insertions(+), 16 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index c34ff889b11..61c86ec47df 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -745,6 +745,15 @@ HRESULT dispex_get_dynid(DispatchEx *This, const WCHAR *name, BOOL hidden, DISPI return S_OK; }
+IWineJSDispatchHost *dispex_outer_iface(DispatchEx *dispex) +{ + if(dispex->info->desc->vtbl->get_outer_iface) + return dispex->info->desc->vtbl->get_outer_iface(dispex); + + IWineJSDispatchHost_AddRef(&dispex->IWineJSDispatchHost_iface); + return &dispex->IWineJSDispatchHost_iface; +} + static HRESULT dispex_value(DispatchEx *This, LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index 6eed0916117..8125a3eebc8 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -321,12 +321,13 @@ static void remove_event_listener(EventTarget *event_target, const WCHAR *type_n
static IEventTarget *get_event_target_iface(EventTarget *event_target) { - const event_target_vtbl_t *vtbl = dispex_get_vtbl(&event_target->dispex); + const dispex_static_data_vtbl_t *vtbl = dispex_get_vtbl(&event_target->dispex); IEventTarget *ret;
- if(vtbl->get_dispatch_this) { - IDispatch *disp = vtbl->get_dispatch_this(&event_target->dispex); - IDispatch_QueryInterface(disp, &IID_IEventTarget, (void**)&ret); + if(vtbl->get_outer_iface) { + IWineJSDispatchHost *disp = vtbl->get_outer_iface(&event_target->dispex); + IWineJSDispatchHost_QueryInterface(disp, &IID_IEventTarget, (void**)&ret); + IWineJSDispatchHost_Release(disp); }else { ret = &event_target->IEventTarget_iface; IEventTarget_AddRef(ret); @@ -4191,11 +4192,8 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event, disp skip_onevent_listener = TRUE;
V_VT(&arg) = VT_DISPATCH; - V_DISPATCH(&arg) = (IDispatch*)&event_target->dispex.IWineJSDispatchHost_iface; + V_DISPATCH(&arg) = (IDispatch*)dispex_outer_iface(&event_target->dispex); V_VT(&v) = VT_EMPTY; - if(vtbl->get_dispatch_this) - V_DISPATCH(&arg) = vtbl->get_dispatch_this(&event_target->dispex); - IDispatch_AddRef(V_DISPATCH(&arg));
TRACE("%p %s >>>\n", event_target, debugstr_w(event->type)); hres = call_disp_func(listener->function, &dp, &v); @@ -4272,10 +4270,7 @@ static void call_event_handlers(EventTarget *event_target, DOMEvent *event, disp DISPPARAMS dp = {args, &named_arg, 2, 1};
V_VT(args) = VT_DISPATCH; - V_DISPATCH(args) = (IDispatch*)&event_target->dispex.IWineJSDispatchHost_iface; - if(vtbl->get_dispatch_this) - V_DISPATCH(args) = vtbl->get_dispatch_this(&event_target->dispex); - IDispatch_AddRef(V_DISPATCH(args)); + V_DISPATCH(args) = (IDispatch *)dispex_outer_iface(&event_target->dispex);
V_VT(args+1) = VT_DISPATCH; V_DISPATCH(args+1) = dispatch_mode == DISPATCH_LEGACY diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index 324f39ea746..6dec8cf9a9a 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -127,7 +127,6 @@ void detach_nsevent(HTMLDocumentNode*,const WCHAR*); /* We extend dispex vtbl for EventTarget functions to avoid separated vtbl. */ typedef struct { dispex_static_data_vtbl_t dispex_vtbl; - IDispatch *(*get_dispatch_this)(DispatchEx*); nsISupports *(*get_gecko_target)(DispatchEx*); void (*bind_event)(DispatchEx*,eventid_t); EventTarget *(*get_parent_event_target)(DispatchEx*); diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index a7a6b0df383..534a0bae9d2 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3970,10 +3970,17 @@ static compat_mode_t HTMLWindow_get_compat_mode(DispatchEx *dispex, HTMLInnerWin return lock_document_mode(This->doc); }
-static IDispatch *HTMLWindow_get_dispatch_this(DispatchEx *dispex) +static IWineJSDispatchHost *HTMLWindow_get_outer_iface(DispatchEx *dispex) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); - return (IDispatch*)&This->base.outer_window->base.IHTMLWindow2_iface; + IWineJSDispatchHost *ret; + + if(This->base.outer_window) + ret = &This->base.outer_window->IWineJSDispatchHost_iface; + else + ret = &This->event_target.dispex.IWineJSDispatchHost_iface; + IWineJSDispatchHost_AddRef(ret); + return ret; }
static nsISupports *HTMLWindow_get_gecko_target(DispatchEx *dispex) @@ -4152,8 +4159,8 @@ static const event_target_vtbl_t HTMLWindow_event_target_vtbl = { .invoke = HTMLWindow_invoke, .next_dispid = HTMLWindow_next_dispid, .get_compat_mode = HTMLWindow_get_compat_mode, + .get_outer_iface = HTMLWindow_get_outer_iface, }, - .get_dispatch_this = HTMLWindow_get_dispatch_this, .get_gecko_target = HTMLWindow_get_gecko_target, .bind_event = HTMLWindow_bind_event, .set_current_event = HTMLWindow_set_current_event diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 9d84cbabe55..2952149d881 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -375,6 +375,9 @@ typedef struct { /* Called on the last release, when the refcount reaches 0 */ void (*last_release)(DispatchEx*);
+ /* Called to get outer interface when it may be different than DispatchEx */ + IWineJSDispatchHost *(*get_outer_iface)(DispatchEx*); + /* Called when the object wants to handle DISPID_VALUE invocations */ HRESULT (*value)(DispatchEx*,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
@@ -517,6 +520,7 @@ HRESULT dispex_get_id(DispatchEx *dispex, const WCHAR *name, DWORD flags, DISPID HRESULT dispex_next_id(DispatchEx *dispex, DISPID id, DISPID *ret); HRESULT dispex_prop_name(DispatchEx *dispex, DISPID id, BSTR *ret); HRESULT dispex_index_prop_desc(DispatchEx*,DISPID,struct property_info*); +IWineJSDispatchHost *dispex_outer_iface(DispatchEx *dispex);
typedef enum { DISPEXPROP_CUSTOM,
From: Jacek Caban jacek@codeweavers.com
--- dlls/jscript/dispex.c | 5 +++-- dlls/jscript/jsdisp.idl | 1 + dlls/mshtml/dispex.c | 9 +++++++++ dlls/mshtml/htmlwindow.c | 10 ++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index 1b61ba531e9..bd509a2e6f2 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -3515,6 +3515,7 @@ HRESULT init_host_object(script_ctx_t *ctx, IWineJSDispatchHost *host_iface, IWi
IWineJSDispatchHost *get_host_dispatch(IDispatch *disp) { + IWineJSDispatchHost *ret; HostObject *host_obj; jsdisp_t *jsdisp;
@@ -3524,6 +3525,6 @@ IWineJSDispatchHost *get_host_dispatch(IDispatch *disp) return NULL;
host_obj = HostObject_from_jsdisp(jsdisp); - IWineJSDispatchHost_AddRef(host_obj->host_iface); - return host_obj->host_iface; + IWineJSDispatchHost_GetOuterDispatch(host_obj->host_iface, &ret); + return ret; } diff --git a/dlls/jscript/jsdisp.idl b/dlls/jscript/jsdisp.idl index a2b8762b2c0..518edabba9d 100644 --- a/dlls/jscript/jsdisp.idl +++ b/dlls/jscript/jsdisp.idl @@ -64,6 +64,7 @@ interface IWineJSDispatchHost : IDispatchEx HRESULT DeleteProperty(DISPID id); HRESULT ConfigureProperty(DISPID id, UINT32 flags); HRESULT CallFunction(DISPID id, UINT32 iid, DISPPARAMS *dp, VARIANT *ret, EXCEPINFO *ei, IServiceProvider *caller); + HRESULT GetOuterDispatch(IWineJSDispatchHost **ret); HRESULT ToString(BSTR *str); }
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 61c86ec47df..4a0e6a68403 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -2475,6 +2475,14 @@ static HRESULT WINAPI JSDispatchHost_CallFunction(IWineJSDispatchHost *iface, DI return call_builtin_function(This, func, dp, ret, ei, caller); }
+static HRESULT WINAPI JSDispatchHost_GetOuterDispatch(IWineJSDispatchHost *iface, IWineJSDispatchHost **ret) +{ + DispatchEx *This = impl_from_IWineJSDispatchHost(iface); + + *ret = dispex_outer_iface(This); + return S_OK; +} + static HRESULT WINAPI JSDispatchHost_ToString(IWineJSDispatchHost *iface, BSTR *str) { DispatchEx *This = impl_from_IWineJSDispatchHost(iface); @@ -2508,6 +2516,7 @@ static IWineJSDispatchHostVtbl JSDispatchHostVtbl = { JSDispatchHost_DeleteProperty, JSDispatchHost_ConfigureProperty, JSDispatchHost_CallFunction, + JSDispatchHost_GetOuterDispatch, JSDispatchHost_ToString, };
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 534a0bae9d2..588d10a1e56 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3508,6 +3508,15 @@ static HRESULT WINAPI WindowDispEx_CallFunction(IWineJSDispatchHost *iface, DISP id, iid, dp, ret, ei, caller); }
+static HRESULT WINAPI WindowDispEx_GetOuterDispatch(IWineJSDispatchHost *iface, IWineJSDispatchHost **ret) +{ + HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface); + + *ret = &This->IWineJSDispatchHost_iface; + IWineJSDispatchHost_AddRef(*ret); + return S_OK; +} + static HRESULT WINAPI WindowDispEx_ToString(IWineJSDispatchHost *iface, BSTR *str) { HTMLOuterWindow *This = impl_from_IWineJSDispatchHost(iface); @@ -3539,6 +3548,7 @@ static const IWineJSDispatchHostVtbl WindowDispExVtbl = { WindowDispEx_DeleteProperty, WindowDispEx_ConfigureProperty, WindowDispEx_CallFunction, + WindowDispEx_GetOuterDispatch, WindowDispEx_ToString, };
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/dispex.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 4a0e6a68403..57c9cf8bcf5 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -2468,9 +2468,7 @@ static HRESULT WINAPI JSDispatchHost_CallFunction(IWineJSDispatchHost *iface, DI TRACE("%s (%p)->(%lx %x %p %p %p %p)\n", This->info->desc->name, This, id, iid, dp, ret, ei, caller);
hres = get_builtin_func(This->info, id, &func); - if(FAILED(hres)) - return hres; - if(func->tid != iid || func->func_disp_idx < 0) + if(FAILED(hres) || func->tid != iid || func->func_disp_idx < 0) return E_UNEXPECTED; return call_builtin_function(This, func, dp, ret, ei, caller); }
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/htmlwindow.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 588d10a1e56..27d99f19ff6 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3789,17 +3789,6 @@ static void HTMLWindow_last_release(DispatchEx *dispex) remove_target_tasks(This->task_magic); }
-static HRESULT HTMLWindow_get_name(DispatchEx *dispex, DISPID id, BSTR *name) -{ - HTMLInnerWindow *This = impl_from_DispatchEx(dispex); - DWORD idx = id - MSHTML_DISPID_CUSTOM_MIN; - - if(idx >= This->global_prop_cnt) - return DISP_E_MEMBERNOTFOUND; - - return (*name = SysAllocString(This->global_props[idx].name)) ? S_OK : E_OUTOFMEMORY; -} - static HRESULT HTMLWindow_lookup_dispid(DispatchEx *dispex, const WCHAR *name, DWORD grfdex, DISPID *dispid) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); @@ -3905,7 +3894,7 @@ HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags,
prop->type = GLOBAL_DISPEXVAR; prop->id = dispex_id; - return IWineJSDispatchHost_InvokeEx(&This->event_target.dispex.IWineJSDispatchHost_iface, dispex_id, 0, flags, params, res, ei, caller); + return dispex_prop_put(&This->event_target.dispex, dispex_id, 0, params->rgvarg, ei, caller); } default: FIXME("Not supported flags: %x\n", flags); @@ -4163,11 +4152,11 @@ static const event_target_vtbl_t HTMLWindow_event_target_vtbl = { .traverse = HTMLWindow_traverse, .unlink = HTMLWindow_unlink, .last_release = HTMLWindow_last_release, - .get_name = HTMLWindow_get_name, .lookup_dispid = HTMLWindow_lookup_dispid, .find_dispid = HTMLWindow_find_dispid, .invoke = HTMLWindow_invoke, .next_dispid = HTMLWindow_next_dispid, + .get_prop_desc = HTMLWindow_get_prop_desc, .get_compat_mode = HTMLWindow_get_compat_mode, .get_outer_iface = HTMLWindow_get_outer_iface, },
From: Jacek Caban jacek@codeweavers.com
Based on patch by Gabriel Ivăncescu. --- dlls/jscript/dispex.c | 3 ++- dlls/mshtml/dispex.c | 2 +- dlls/mshtml/htmlwindow.c | 22 ++++++++--------- dlls/mshtml/script.c | 41 ++++++++++++++++++++----------- dlls/mshtml/tests/documentmode.js | 2 +- dlls/mshtml/tests/es5.js | 2 -- 6 files changed, 41 insertions(+), 31 deletions(-)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c index bd509a2e6f2..95954866345 100644 --- a/dlls/jscript/dispex.c +++ b/dlls/jscript/dispex.c @@ -2362,7 +2362,8 @@ static HRESULT WINAPI WineJSDispatch_GetScriptGlobal(IWineJSDispatch *iface, IWi if(!(disp = lookup_global_host(This->ctx))) return E_NOINTERFACE;
- return IDispatch_QueryInterface(disp, &IID_IWineJSDispatchHost, (void **)ret); + *ret = get_host_dispatch(disp); + return S_OK; }
static IWineJSDispatchVtbl DispatchExVtbl = { diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 57c9cf8bcf5..f26789f49e7 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1730,7 +1730,7 @@ static dispex_data_t *ensure_dispex_info(DispatchEx *dispex, dispex_static_data_ if(compat_mode >= COMPAT_MODE_IE9 && script_global) { if(!script_global->jscript) initialize_script_global(script_global); - if(script_global->jscript) { + if(script_global->jscript && !dispex->jsdisp) { hres = IWineJScript_InitHostObject(script_global->jscript, &dispex->IWineJSDispatchHost_iface, &dispex->jsdisp); if(FAILED(hres)) diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 27d99f19ff6..a428158f4ac 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -2151,17 +2151,14 @@ static IHTMLWindow2 *get_source_window(IServiceProvider *caller, compat_mode_t c if(hres != S_OK) cmdtarget = NULL;
- if(compat_mode < COMPAT_MODE_IE9) { - /* Legacy modes query caller unconditionally, and use it instead, if it has a command target */ - hres = IServiceProvider_QueryService(caller, &SID_GetCaller, &IID_IServiceProvider, (void**)&parent); - if(hres == S_OK && parent) { - hres = IServiceProvider_QueryService(parent, &IID_IActiveScriptSite, &IID_IOleCommandTarget, (void**)&parent_cmdtarget); - IServiceProvider_Release(parent); - if(hres == S_OK && parent_cmdtarget) { - if(cmdtarget) - IOleCommandTarget_Release(cmdtarget); - cmdtarget = parent_cmdtarget; - } + hres = IServiceProvider_QueryService(caller, &SID_GetCaller, &IID_IServiceProvider, (void**)&parent); + if(hres == S_OK && parent) { + hres = IServiceProvider_QueryService(parent, &IID_IActiveScriptSite, &IID_IOleCommandTarget, (void**)&parent_cmdtarget); + IServiceProvider_Release(parent); + if(hres == S_OK && parent_cmdtarget) { + if(cmdtarget) + IOleCommandTarget_Release(cmdtarget); + cmdtarget = parent_cmdtarget; } }
@@ -3966,6 +3963,7 @@ HRESULT HTMLWindow_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_ static compat_mode_t HTMLWindow_get_compat_mode(DispatchEx *dispex, HTMLInnerWindow **script_global) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); + *script_global = This; return lock_document_mode(This->doc); }
@@ -4310,7 +4308,7 @@ static HRESULT create_inner_window(HTMLOuterWindow *outer_window, IMoniker *mon, window->base.outer_window = outer_window; window->base.inner_window = window;
- EventTarget_Init(&window->event_target, &HTMLWindow_dispex, COMPAT_MODE_NONE); + init_event_target(&window->event_target, &HTMLWindow_dispex, NULL);
window->task_magic = get_task_target_magic();
diff --git a/dlls/mshtml/script.c b/dlls/mshtml/script.c index 295c8a0dc15..e985912c526 100644 --- a/dlls/mshtml/script.c +++ b/dlls/mshtml/script.c @@ -199,6 +199,27 @@ static BOOL init_script_engine(ScriptHost *script_host, IActiveScript *script) return FALSE; }
+ if(compat_mode >= COMPAT_MODE_IE9 && IsEqualGUID(&CLSID_JScript, &script_host->guid)) { + IWineJScript *jscript; + hres = IActiveScript_QueryInterface(script, &IID_IWineJScript, (void **)&jscript); + if(SUCCEEDED(hres)) { + assert(!script_host->window->jscript); + assert(!script_host->window->event_target.dispex.jsdisp); + script_host->window->jscript = jscript; + + hres = IWineJScript_InitHostObject(jscript, + &script_host->window->event_target.dispex.IWineJSDispatchHost_iface, + &script_host->window->event_target.dispex.jsdisp); + if(FAILED(hres)) + ERR("Could not initialize script global: %08lx\n", hres); + + /* make sure that script global is fully initialized */ + dispex_compat_mode(&script_host->window->event_target.dispex); + }else { + ERR("Could not get IWineJScript, don't use native jscript.dll\n"); + } + } + hres = IActiveScript_AddNamedItem(script, L"window", SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS); if(SUCCEEDED(hres)) { @@ -381,8 +402,10 @@ static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPC if(!This->window || !This->window->base.outer_window) return E_FAIL;
- /* FIXME: Return proxy object */ - *ppiunkItem = (IUnknown*)&This->window->base.outer_window->base.IHTMLWindow2_iface; + if(dispex_compat_mode(&This->window->event_target.dispex) >= COMPAT_MODE_IE9) + *ppiunkItem = (IUnknown*)This->window->event_target.dispex.jsdisp; + else + *ppiunkItem = (IUnknown*)&This->window->base.outer_window->base.IHTMLWindow2_iface; IUnknown_AddRef(*ppiunkItem);
return S_OK; @@ -1390,19 +1413,9 @@ static ScriptHost *get_script_host(HTMLInnerWindow *window, const GUID *guid)
void initialize_script_global(HTMLInnerWindow *script_global) { - ScriptHost *script_host; - HRESULT hres; - - if(script_global->jscript) + if(!script_global->base.outer_window) return; - - script_host = get_script_host(script_global, &CLSID_JScript); - if(!script_host) - return; - - hres = IActiveScript_QueryInterface(script_host->script, &IID_IWineJScript, (void **)&script_global->jscript); - if(FAILED(hres)) - ERR("Could not get IWineJScript, don't use native jscript.dll\n"); + get_script_host(script_global, &CLSID_JScript); }
static ScriptHost *get_elem_script_host(HTMLInnerWindow *window, HTMLScriptElement *script_elem) diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index ff4fbdf306b..ec670ec0756 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -317,7 +317,7 @@ sync_test("builtin_toString", function() { test("styleSheets", document.styleSheets, "StyleSheetList", null, true); test("textNode", document.createTextNode("testNode"), "Text", v < 9 ? "testNode" : null); test("textRange", txtRange, "TextRange"); - test("window", window, "Window", "[object Window]", true); + test("window", window, "Window", "[object Window]"); test("xmlHttpRequest", new XMLHttpRequest(), "XMLHttpRequest"); if(v < 10) { test("namespaces", document.namespaces, "MSNamespaceInfoCollection"); diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index ddffea263a6..0b22861fb34 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -1151,7 +1151,6 @@ sync_test("toString", function() { todo_wine. ok(tmp === "[object Arguments]", "toString.call(arguments) = " + tmp); tmp = Object.prototype.toString.call(this); - todo_wine. ok(tmp === "[object Window]", "toString.call(null) = " + tmp); tmp = Object.prototype.toString.call(null); ok(tmp === "[object Null]", "toString.call(null) = " + tmp); @@ -2297,7 +2296,6 @@ sync_test("substituted this", function() { ok(r === "[object Undefined]", "detached scope Object.toString returned " + r);
var r = (function() { this.f = Object.prototype.toString; return this.f(); })(); - todo_wine. ok(r === "[object Window]", "Object.toString returned " + r);
var r = (function() { var f = Object.prototype.toString; return f(); })();
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/dispex.c | 10 +++++----- dlls/mshtml/htmldoc.c | 10 +++++----- dlls/mshtml/htmlwindow.c | 8 ++++---- dlls/mshtml/mshtml_private.h | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index f26789f49e7..24cba0a9be7 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1743,14 +1743,14 @@ static dispex_data_t *ensure_dispex_info(DispatchEx *dispex, dispex_static_data_
static BOOL ensure_real_info(DispatchEx *dispex) { - HTMLInnerWindow *script_global = NULL; - compat_mode_t compat_mode; + HTMLInnerWindow *script_global;
if(dispex->info != dispex->info->desc->delayed_init_info) return TRUE;
- compat_mode = dispex->info->desc->vtbl->get_compat_mode(dispex, &script_global); - dispex->info = ensure_dispex_info(dispex, dispex->info->desc, compat_mode, script_global); + script_global = dispex->info->desc->vtbl->get_script_global(dispex); + dispex->info = ensure_dispex_info(dispex, dispex->info->desc, + script_global->doc->document_mode, script_global); return dispex->info != NULL; }
@@ -2652,7 +2652,7 @@ void init_dispatch(DispatchEx *dispex, dispex_static_data_t *data, HTMLInnerWind dispex->jsdisp = NULL; ccref_init(&dispex->ccref, 1);
- if(data->vtbl->get_compat_mode) { + if(data->vtbl->get_script_global) { /* delayed init */ if(!data->delayed_init_info) { EnterCriticalSection(&cs_dispex_static_data); diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 0eb2bc3bcda..eaf3b352006 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -5535,14 +5535,14 @@ static HRESULT HTMLDocumentNode_get_prop_desc(DispatchEx *dispex, DISPID id, str return S_OK; }
-static compat_mode_t HTMLDocumentNode_get_compat_mode(DispatchEx *dispex, HTMLInnerWindow **script_global) +static HTMLInnerWindow *HTMLDocumentNode_get_script_global(DispatchEx *dispex) { HTMLDocumentNode *This = impl_from_DispatchEx(dispex);
- TRACE("(%p) returning %u\n", This, This->document_mode); + TRACE("(%p) using %u compat mode\n", This, This->document_mode);
- *script_global = This->script_global; - return lock_document_mode(This); + lock_document_mode(This); + return This->script_global; }
static nsISupports *HTMLDocumentNode_get_gecko_target(DispatchEx *dispex) @@ -5639,7 +5639,7 @@ static const event_target_vtbl_t HTMLDocumentNode_event_target_vtbl = { .invoke = HTMLDocumentNode_invoke, .disp_invoke = HTMLDocumentNode_disp_invoke, .next_dispid = HTMLDocumentNode_next_dispid, - .get_compat_mode = HTMLDocumentNode_get_compat_mode, + .get_script_global = HTMLDocumentNode_get_script_global, }, .get_gecko_target = HTMLDocumentNode_get_gecko_target, .bind_event = HTMLDocumentNode_bind_event, diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index a428158f4ac..445be60fba8 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3960,11 +3960,11 @@ HRESULT HTMLWindow_get_prop_desc(DispatchEx *dispex, DISPID id, struct property_ return S_OK; }
-static compat_mode_t HTMLWindow_get_compat_mode(DispatchEx *dispex, HTMLInnerWindow **script_global) +static HTMLInnerWindow *HTMLWindow_get_script_global(DispatchEx *dispex) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); - *script_global = This; - return lock_document_mode(This->doc); + lock_document_mode(This->doc); + return This; }
static IWineJSDispatchHost *HTMLWindow_get_outer_iface(DispatchEx *dispex) @@ -4155,7 +4155,7 @@ static const event_target_vtbl_t HTMLWindow_event_target_vtbl = { .invoke = HTMLWindow_invoke, .next_dispid = HTMLWindow_next_dispid, .get_prop_desc = HTMLWindow_get_prop_desc, - .get_compat_mode = HTMLWindow_get_compat_mode, + .get_script_global = HTMLWindow_get_script_global, .get_outer_iface = HTMLWindow_get_outer_iface, }, .get_gecko_target = HTMLWindow_get_gecko_target, diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 2952149d881..35cb705d0a5 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -401,7 +401,7 @@ typedef struct { HRESULT (*disp_invoke)(DispatchEx*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
/* Used by objects that want to delay their compat mode initialization until actually needed */ - compat_mode_t (*get_compat_mode)(DispatchEx*,HTMLInnerWindow**); + HTMLInnerWindow *(*get_script_global)(DispatchEx*);
/* Used by objects that want to populate some dynamic props on initialization */ HRESULT (*populate_props)(DispatchEx*);
Hi,
It looks like your patch introduced the new failures shown below. Please investigate and fix them before resubmitting your patch. If they are not new, fixing them anyway would help a lot. Otherwise please ask for the known failures list to be updated.
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=147390
Your paranoid android.
=== debian11 (build log) ===
error: patch failed: dlls/mshtml/htmlstorage.c:1117 error: patch failed: dlls/mshtml/tests/documentmode.js:300 error: patch failed: dlls/mshtml/htmlframe.c:870 error: patch failed: dlls/mshtml/htmlwindow.c:3830 error: patch failed: dlls/mshtml/mshtml_private.h:1069 error: patch failed: dlls/mshtml/tests/documentmode.js:150 error: patch failed: dlls/mshtml/htmlframe.c:1305 error: patch failed: dlls/mshtml/tests/documentmode.js:164 error: patch failed: dlls/jscript/dispex.c:2362 error: patch failed: dlls/mshtml/dispex.c:1730 error: patch failed: dlls/mshtml/htmlwindow.c:2151 error: patch failed: dlls/mshtml/script.c:199 error: patch failed: dlls/mshtml/tests/documentmode.js:317 error: patch failed: dlls/mshtml/tests/es5.js:1151 error: patch failed: dlls/mshtml/htmlwindow.c:3960 Task: Patch failed to apply
=== debian11b (build log) ===
error: patch failed: dlls/mshtml/htmlstorage.c:1117 error: patch failed: dlls/mshtml/tests/documentmode.js:300 error: patch failed: dlls/mshtml/htmlframe.c:870 error: patch failed: dlls/mshtml/htmlwindow.c:3830 error: patch failed: dlls/mshtml/mshtml_private.h:1069 error: patch failed: dlls/mshtml/tests/documentmode.js:150 error: patch failed: dlls/mshtml/htmlframe.c:1305 error: patch failed: dlls/mshtml/tests/documentmode.js:164 error: patch failed: dlls/jscript/dispex.c:2362 error: patch failed: dlls/mshtml/dispex.c:1730 error: patch failed: dlls/mshtml/htmlwindow.c:2151 error: patch failed: dlls/mshtml/script.c:199 error: patch failed: dlls/mshtml/tests/documentmode.js:317 error: patch failed: dlls/mshtml/tests/es5.js:1151 error: patch failed: dlls/mshtml/htmlwindow.c:3960 Task: Patch failed to apply