From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/htmlwindow.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 5a4707153e5..59a0f6d023d 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -1321,8 +1321,11 @@ static HRESULT WINAPI HTMLWindow2_focus(IHTMLWindow2 *iface) static HRESULT WINAPI HTMLWindow2_get_closed(IHTMLWindow2 *iface, VARIANT_BOOL *p) { HTMLWindow *This = impl_from_IHTMLWindow2(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + + TRACE("(%p)->(%p) semi-stub\n", This, p); + + *p = VARIANT_FALSE; + return S_OK; }
static HRESULT WINAPI HTMLWindow2_blur(IHTMLWindow2 *iface)
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/tests/documentmode.js | 38 +++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+)
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js index 5249e042182..2eed3bb1aff 100644 --- a/dlls/mshtml/tests/documentmode.js +++ b/dlls/mshtml/tests/documentmode.js @@ -950,6 +950,30 @@ sync_test("elem_by_id", function() { ok(v < 9 && e.number === 0xa01b6 - 0x80000000, "Setting document.testid threw = " + e.number); }
+ window.testid2 = 1; + document.testid2 = 2; + document.body.innerHTML = '<form id="testid2" name="testname"></form>'; + ok(window.testid2 == 1, "window.testid2 = " + window.testid2); + id_elem = document.body.firstChild; + todo_wine_if(v < 9). + ok(document.testid2 == (v < 9 ? id_elem : 2), "document.testid2 = " + document.testid2); + document.body.innerHTML = ''; + ok(window.testid2 == 1, "window.testid2 = " + window.testid2); + ok(document.testid2 == 2, "document.testid2 = " + document.testid2 + " expected 2"); + + ok(document.title === "", "document.title = " + document.title); + document.body.innerHTML = '<form id="title" name="testname"></form>'; + id_elem = document.body.firstChild; + todo_wine_if(v < 9). + ok(document.title === (v < 9 ? id_elem : ""), "document.title = " + document.title); + document.body.innerHTML = ''; + ok(document.title === "", "document.title = " + document.title); + + ok(window.closed === false, "window.closed = " + window.closed); + document.body.innerHTML = '<form id="closed" name="testname"></form>'; + id_elem = document.body.firstChild; + ok(window.closed === false, "window.closed = " + window.closed); + // these tags expose name as props, and id only if they have a name var tags = [ "embed", "form", "iframe", "img" ]; for(i in tags) { @@ -3011,3 +3035,17 @@ async_test("postMessage", function() { ok(onmessage_called == (v < 9 ? true : false), "onmessage not called"); if(v < 9) next_test(); }); + +sync_test("form", function() { + document.body.innerHTML = ""; + var form = document.createElement("form"); + document.body.appendChild(form); + + form[0] = "test"; + form.innerHTML = "<input type="text" id = "i1" /><input type="text" id = "i2" />"; + ok(form.length === 2, "form.length = " + form.length); + ok(typeof(form[0]) === "object", "form[0] = " + form[0]); + ok(typeof(form[1]) === "object", "form[1] = " + form[1]); + form.innerHTML = ""; + ok(form[0] === "test", "form[0] = " + form[0]); +});
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/dispex.c | 70 +++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 27 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 07c26e2e762..3c5f00e35b7 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -646,33 +646,16 @@ static inline dispex_dynamic_data_t *get_dynamic_data(DispatchEx *This) return This->dynamic_data; }
-static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags, dynamic_prop_t **ret) +static HRESULT alloc_dynamic_prop(DispatchEx *This, const WCHAR *name, dynamic_prop_t *prop, dynamic_prop_t **ret) { - const BOOL alloc = flags & fdexNameEnsure; - dispex_dynamic_data_t *data; - dynamic_prop_t *prop; - - data = get_dynamic_data(This); - if(!data) - return E_OUTOFMEMORY; + dispex_dynamic_data_t *data = This->dynamic_data;
- for(prop = data->props; prop < data->props+data->prop_cnt; prop++) { - if(flags & fdexNameCaseInsensitive ? !wcsicmp(prop->name, name) : !wcscmp(prop->name, name)) { - if(prop->flags & DYNPROP_DELETED) { - if(!alloc) - return DISP_E_UNKNOWNNAME; - prop->flags &= ~DYNPROP_DELETED; - } - *ret = prop; - return S_OK; - } + if(prop) { + prop->flags &= ~DYNPROP_DELETED; + *ret = prop; + return S_OK; }
- if(!alloc) - return DISP_E_UNKNOWNNAME; - - TRACE("creating dynamic prop %s\n", debugstr_w(name)); - if(!data->buf_size) { data->props = malloc(sizeof(dynamic_prop_t) * 4); if(!data->props) @@ -702,6 +685,35 @@ static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags return S_OK; }
+static HRESULT get_dynamic_prop(DispatchEx *This, const WCHAR *name, DWORD flags, dynamic_prop_t **ret) +{ + const BOOL alloc = flags & fdexNameEnsure; + dispex_dynamic_data_t *data; + dynamic_prop_t *prop; + + data = get_dynamic_data(This); + if(!data) + return E_OUTOFMEMORY; + + for(prop = data->props; prop < data->props+data->prop_cnt; prop++) { + if(flags & fdexNameCaseInsensitive ? !wcsicmp(prop->name, name) : !wcscmp(prop->name, name)) { + *ret = prop; + if(prop->flags & DYNPROP_DELETED) { + if(!alloc) + return DISP_E_UNKNOWNNAME; + prop->flags &= ~DYNPROP_DELETED; + } + return S_OK; + } + } + + if(!alloc) + return DISP_E_UNKNOWNNAME; + + TRACE("creating dynamic prop %s\n", debugstr_w(name)); + return alloc_dynamic_prop(This, name, NULL, ret); +} + HRESULT dispex_get_dprop_ref(DispatchEx *This, const WCHAR *name, BOOL alloc, VARIANT **ret) { dynamic_prop_t *prop; @@ -1662,7 +1674,7 @@ static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { DispatchEx *This = impl_from_IDispatchEx(iface); - dynamic_prop_t *dprop; + dynamic_prop_t *dprop = NULL; HRESULT hres;
TRACE("%s (%p)->(%s %lx %p)\n", This->info->desc->name, This, debugstr_w(bstrName), grfdex, pid); @@ -1677,9 +1689,13 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW if(hres != DISP_E_UNKNOWNNAME) return hres;
- hres = get_dynamic_prop(This, bstrName, grfdex, &dprop); - if(FAILED(hres)) - return hres; + hres = get_dynamic_prop(This, bstrName, grfdex & ~fdexNameEnsure, &dprop); + if(FAILED(hres)) { + if(grfdex & fdexNameEnsure) + hres = alloc_dynamic_prop(This, bstrName, dprop, &dprop); + if(FAILED(hres)) + return hres; + }
*pid = DISPID_DYNPROP_0 + (dprop - This->dynamic_data->props); return S_OK;
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/dispex.c | 5 +++ dlls/mshtml/htmlwindow.c | 66 +++++++++++++++++++----------------- dlls/mshtml/mshtml_private.h | 3 ++ 3 files changed, 43 insertions(+), 31 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 3c5f00e35b7..8517ccac554 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -1691,6 +1691,11 @@ static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DW
hres = get_dynamic_prop(This, bstrName, grfdex & ~fdexNameEnsure, &dprop); if(FAILED(hres)) { + if(This->info->desc->vtbl->find_dispid) { + hres = This->info->desc->vtbl->find_dispid(This, bstrName, grfdex, pid); + if(SUCCEEDED(hres)) + return hres; + } if(grfdex & fdexNameEnsure) hres = alloc_dynamic_prop(This, bstrName, dprop, &dprop); if(FAILED(hres)) diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 59a0f6d023d..be07072600c 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3700,9 +3700,6 @@ static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, { HTMLWindow *This = impl_from_IDispatchEx(iface); HTMLInnerWindow *window = This->inner_window; - HTMLOuterWindow *frame; - global_prop_t *prop; - IHTMLElement *elem; HRESULT hres;
TRACE("(%p)->(%s %lx %p)\n", This, debugstr_w(bstrName), grfdex, pid); @@ -3711,34 +3708,7 @@ static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, if(hres != DISP_E_UNKNOWNNAME) return hres;
- hres = IDispatchEx_GetDispID(&window->base.inner_window->event_target.dispex.IDispatchEx_iface, bstrName, grfdex, pid); - if(hres != DISP_E_UNKNOWNNAME) - return hres; - - hres = get_frame_by_name(This->outer_window, bstrName, FALSE, &frame); - if(SUCCEEDED(hres) && frame) { - prop = alloc_global_prop(window, GLOBAL_FRAMEVAR, bstrName); - if(!prop) - return E_OUTOFMEMORY; - - *pid = prop_to_dispid(window, prop); - return S_OK; - } - - hres = IHTMLDocument3_getElementById(&window->base.inner_window->doc->IHTMLDocument3_iface, - bstrName, &elem); - if(SUCCEEDED(hres) && elem) { - IHTMLElement_Release(elem); - - prop = alloc_global_prop(window, GLOBAL_ELEMENTVAR, bstrName); - if(!prop) - return E_OUTOFMEMORY; - - *pid = prop_to_dispid(window, prop); - return S_OK; - } - - return DISP_E_UNKNOWNNAME; + return IDispatchEx_GetDispID(&window->base.inner_window->event_target.dispex.IDispatchEx_iface, bstrName, grfdex, pid); }
static HRESULT WINAPI WindowDispEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, @@ -4099,6 +4069,39 @@ static HRESULT HTMLWindow_get_name(DispatchEx *dispex, DISPID id, BSTR *name) return (*name = SysAllocString(This->global_props[idx].name)) ? S_OK : E_OUTOFMEMORY; }
+static HRESULT HTMLWindow_find_dispid(DispatchEx *dispex, BSTR name, DWORD grfdex, DISPID *dispid) +{ + HTMLInnerWindow *This = impl_from_DispatchEx(dispex); + HTMLOuterWindow *frame; + global_prop_t *prop; + IHTMLElement *elem; + HRESULT hres; + + hres = get_frame_by_name(This->base.outer_window, name, FALSE, &frame); + if(SUCCEEDED(hres) && frame) { + prop = alloc_global_prop(This, GLOBAL_FRAMEVAR, name); + if(!prop) + return E_OUTOFMEMORY; + + *dispid = prop_to_dispid(This, prop); + return S_OK; + } + + hres = IHTMLDocument3_getElementById(&This->doc->IHTMLDocument3_iface, name, &elem); + if(SUCCEEDED(hres) && elem) { + IHTMLElement_Release(elem); + + prop = alloc_global_prop(This, GLOBAL_ELEMENTVAR, name); + if(!prop) + return E_OUTOFMEMORY; + + *dispid = prop_to_dispid(This, prop); + return S_OK; + } + + return DISP_E_UNKNOWNNAME; +} + static HRESULT HTMLWindow_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller) { @@ -4398,6 +4401,7 @@ static const event_target_vtbl_t HTMLWindow_event_target_vtbl = { .unlink = HTMLWindow_unlink, .last_release = HTMLWindow_last_release, .get_name = HTMLWindow_get_name, + .find_dispid = HTMLWindow_find_dispid, .invoke = HTMLWindow_invoke, .next_dispid = HTMLWindow_next_dispid, .get_compat_mode = HTMLWindow_get_compat_mode, diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 1d4f005ba11..52d53ca9e00 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -371,6 +371,9 @@ typedef struct { /* Used when the object has custom props, and this returns DISPIDs for them */ HRESULT (*get_dispid)(DispatchEx*,BSTR,DWORD,DISPID*);
+ /* Similar to get_dispid, but called only when a dynamic property can't be found */ + HRESULT (*find_dispid)(DispatchEx*,BSTR,DWORD,DISPID*); + /* These are called when the object implements GetMemberName, InvokeEx, DeleteMemberByDispID and GetNextDispID for custom props */ HRESULT (*get_name)(DispatchEx*,DISPID,BSTR*); HRESULT (*invoke)(DispatchEx*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/dispex.c | 12 ++++++++++-- dlls/mshtml/htmlwindow.c | 18 +++++++++--------- dlls/mshtml/mshtml_private.h | 3 +++ 3 files changed, 22 insertions(+), 11 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index 8517ccac554..152d2d4cb66 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -994,6 +994,13 @@ static HRESULT get_builtin_func(dispex_data_t *data, DISPID id, func_info_t **re static HRESULT get_builtin_id(DispatchEx *This, BSTR name, DWORD grfdex, DISPID *ret) { int min, max, n, c; + HRESULT hres; + + if(This->info->desc->vtbl->lookup_dispid) { + hres = This->info->desc->vtbl->lookup_dispid(This, name, grfdex, ret); + if(hres != DISP_E_UNKNOWNNAME) + return hres; + }
min = 0; max = This->info->func_cnt-1; @@ -1017,8 +1024,6 @@ static HRESULT get_builtin_id(DispatchEx *This, BSTR name, DWORD grfdex, DISPID }
if(This->info->desc->vtbl->get_dispid) { - HRESULT hres; - hres = This->info->desc->vtbl->get_dispid(This, name, grfdex, ret); if(hres != DISP_E_UNKNOWNNAME) return hres; @@ -1800,6 +1805,9 @@ static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR nam
TRACE("%s (%p)->(%s %lx)\n", This->info->desc->name, This, debugstr_w(name), grfdex);
+ if(dispex_compat_mode(This) < COMPAT_MODE_IE8 && !This->info->desc->vtbl->delete) + return E_NOTIMPL; + hres = IDispatchEx_GetDispID(&This->IDispatchEx_iface, name, grfdex & ~fdexNameEnsure, &id); if(FAILED(hres)) { compat_mode_t compat_mode = dispex_compat_mode(This); diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index be07072600c..0230cca86e5 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -3699,16 +3699,8 @@ HRESULT search_window_props(HTMLInnerWindow *This, BSTR bstrName, DWORD grfdex, static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { HTMLWindow *This = impl_from_IDispatchEx(iface); - HTMLInnerWindow *window = This->inner_window; - HRESULT hres; - - TRACE("(%p)->(%s %lx %p)\n", This, debugstr_w(bstrName), grfdex, pid); - - hres = search_window_props(window, bstrName, grfdex, pid); - if(hres != DISP_E_UNKNOWNNAME) - return hres;
- return IDispatchEx_GetDispID(&window->base.inner_window->event_target.dispex.IDispatchEx_iface, bstrName, grfdex, pid); + return IDispatchEx_GetDispID(&This->inner_window->event_target.dispex.IDispatchEx_iface, bstrName, grfdex, pid); }
static HRESULT WINAPI WindowDispEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, @@ -4069,6 +4061,13 @@ static HRESULT HTMLWindow_get_name(DispatchEx *dispex, DISPID id, BSTR *name) return (*name = SysAllocString(This->global_props[idx].name)) ? S_OK : E_OUTOFMEMORY; }
+static HRESULT HTMLWindow_lookup_dispid(DispatchEx *dispex, BSTR name, DWORD grfdex, DISPID *dispid) +{ + HTMLInnerWindow *This = impl_from_DispatchEx(dispex); + + return search_window_props(This, name, grfdex, dispid); +} + static HRESULT HTMLWindow_find_dispid(DispatchEx *dispex, BSTR name, DWORD grfdex, DISPID *dispid) { HTMLInnerWindow *This = impl_from_DispatchEx(dispex); @@ -4401,6 +4400,7 @@ static const event_target_vtbl_t HTMLWindow_event_target_vtbl = { .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, diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 52d53ca9e00..ae7b08ec034 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -374,6 +374,9 @@ typedef struct { /* Similar to get_dispid, but called only when a dynamic property can't be found */ HRESULT (*find_dispid)(DispatchEx*,BSTR,DWORD,DISPID*);
+ /* Similar to get_dispid, but called called before any other lookup */ + HRESULT (*lookup_dispid)(DispatchEx*,BSTR,DWORD,DISPID*); + /* These are called when the object implements GetMemberName, InvokeEx, DeleteMemberByDispID and GetNextDispID for custom props */ HRESULT (*get_name)(DispatchEx*,DISPID,BSTR*); HRESULT (*invoke)(DispatchEx*,DISPID,LCID,WORD,DISPPARAMS*,VARIANT*,EXCEPINFO*,IServiceProvider*);
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/htmlwindow.c | 392 ++--------------------------------- dlls/mshtml/mshtml_private.h | 29 +-- 2 files changed, 36 insertions(+), 385 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 0230cca86e5..f2c3afe85d6 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -148,11 +148,6 @@ static inline HTMLWindow *impl_from_IHTMLWindow2(IHTMLWindow2 *iface) return CONTAINING_RECORD(iface, HTMLWindow, IHTMLWindow2_iface); }
-static inline HTMLInnerWindow *HTMLInnerWindow_from_IHTMLWindow2(IHTMLWindow2 *iface) -{ - return CONTAINING_RECORD(iface, HTMLInnerWindow, base.IHTMLWindow2_iface); -} - static inline HTMLOuterWindow *HTMLOuterWindow_from_IHTMLWindow2(IHTMLWindow2 *iface) { return CONTAINING_RECORD(iface, HTMLOuterWindow, base.IHTMLWindow2_iface); @@ -206,24 +201,6 @@ static void *base_query_interface(HTMLWindow *This, REFIID riid) return NULL; }
-static HRESULT WINAPI HTMLWindow2_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv) -{ - HTMLInnerWindow *This = HTMLInnerWindow_from_IHTMLWindow2(iface); - return IDispatchEx_QueryInterface(&This->event_target.dispex.IDispatchEx_iface, riid, ppv); -} - -static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface) -{ - HTMLInnerWindow *This = HTMLInnerWindow_from_IHTMLWindow2(iface); - return IDispatchEx_AddRef(&This->event_target.dispex.IDispatchEx_iface); -} - -static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface) -{ - HTMLInnerWindow *This = HTMLInnerWindow_from_IHTMLWindow2(iface); - return IDispatchEx_Release(&This->event_target.dispex.IDispatchEx_iface); -} - static HRESULT WINAPI outer_window_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv) { HTMLOuterWindow *This = HTMLOuterWindow_from_IHTMLWindow2(iface); @@ -282,40 +259,8 @@ static ULONG WINAPI outer_window_Release(IHTMLWindow2 *iface) return ref; }
-static HRESULT WINAPI HTMLWindow2_GetTypeInfoCount(IHTMLWindow2 *iface, UINT *pctinfo) -{ - HTMLWindow *This = impl_from_IHTMLWindow2(iface); - - return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo); -} - -static HRESULT WINAPI HTMLWindow2_GetTypeInfo(IHTMLWindow2 *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - HTMLWindow *This = impl_from_IHTMLWindow2(iface); - - return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo); -} - -static HRESULT WINAPI HTMLWindow2_GetIDsOfNames(IHTMLWindow2 *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, - LCID lcid, DISPID *rgDispId) -{ - HTMLWindow *This = impl_from_IHTMLWindow2(iface); - - return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid, - rgDispId); -} - -static HRESULT WINAPI HTMLWindow2_Invoke(IHTMLWindow2 *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - HTMLWindow *This = impl_from_IHTMLWindow2(iface); - - return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, - pDispParams, pVarResult, pExcepInfo, puArgErr); -} +DISPEX_IDISPATCH_IMPL(HTMLWindow2, IHTMLWindow2, + impl_from_IHTMLWindow2(iface)->inner_window->event_target.dispex)
static HRESULT get_frame_by_index(HTMLOuterWindow *This, UINT32 index, HTMLOuterWindow **ret) { @@ -1678,40 +1623,8 @@ static ULONG WINAPI HTMLWindow3_Release(IHTMLWindow3 *iface) return IHTMLWindow2_Release(&This->IHTMLWindow2_iface); }
-static HRESULT WINAPI HTMLWindow3_GetTypeInfoCount(IHTMLWindow3 *iface, UINT *pctinfo) -{ - HTMLWindow *This = impl_from_IHTMLWindow3(iface); - - return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo); -} - -static HRESULT WINAPI HTMLWindow3_GetTypeInfo(IHTMLWindow3 *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - HTMLWindow *This = impl_from_IHTMLWindow3(iface); - - return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo); -} - -static HRESULT WINAPI HTMLWindow3_GetIDsOfNames(IHTMLWindow3 *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, - LCID lcid, DISPID *rgDispId) -{ - HTMLWindow *This = impl_from_IHTMLWindow3(iface); - - return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid, - rgDispId); -} - -static HRESULT WINAPI HTMLWindow3_Invoke(IHTMLWindow3 *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - HTMLWindow *This = impl_from_IHTMLWindow3(iface); - - return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, - pDispParams, pVarResult, pExcepInfo, puArgErr); -} +DISPEX_IDISPATCH_NOUNK_IMPL(HTMLWindow3, IHTMLWindow3, + impl_from_IHTMLWindow3(iface)->inner_window->event_target.dispex)
static HRESULT WINAPI HTMLWindow3_get_screenLeft(IHTMLWindow3 *iface, LONG *p) { @@ -1924,40 +1837,8 @@ static ULONG WINAPI HTMLWindow4_Release(IHTMLWindow4 *iface) return IHTMLWindow2_Release(&This->IHTMLWindow2_iface); }
-static HRESULT WINAPI HTMLWindow4_GetTypeInfoCount(IHTMLWindow4 *iface, UINT *pctinfo) -{ - HTMLWindow *This = impl_from_IHTMLWindow4(iface); - - return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo); -} - -static HRESULT WINAPI HTMLWindow4_GetTypeInfo(IHTMLWindow4 *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - HTMLWindow *This = impl_from_IHTMLWindow4(iface); - - return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo); -} - -static HRESULT WINAPI HTMLWindow4_GetIDsOfNames(IHTMLWindow4 *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, - LCID lcid, DISPID *rgDispId) -{ - HTMLWindow *This = impl_from_IHTMLWindow4(iface); - - return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid, - rgDispId); -} - -static HRESULT WINAPI HTMLWindow4_Invoke(IHTMLWindow4 *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - HTMLWindow *This = impl_from_IHTMLWindow4(iface); - - return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, - pDispParams, pVarResult, pExcepInfo, puArgErr); -} +DISPEX_IDISPATCH_NOUNK_IMPL(HTMLWindow4, IHTMLWindow4, + impl_from_IHTMLWindow4(iface)->inner_window->event_target.dispex)
static HRESULT WINAPI HTMLWindow4_createPopup(IHTMLWindow4 *iface, VARIANT *varArgIn, IDispatch **ppPopup) @@ -2019,39 +1900,8 @@ static ULONG WINAPI HTMLWindow5_Release(IHTMLWindow5 *iface) return IHTMLWindow2_Release(&This->IHTMLWindow2_iface); }
-static HRESULT WINAPI HTMLWindow5_GetTypeInfoCount(IHTMLWindow5 *iface, UINT *pctinfo) -{ - HTMLWindow *This = impl_from_IHTMLWindow5(iface); - - return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo); -} - -static HRESULT WINAPI HTMLWindow5_GetTypeInfo(IHTMLWindow5 *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - HTMLWindow *This = impl_from_IHTMLWindow5(iface); - - return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo); -} - -static HRESULT WINAPI HTMLWindow5_GetIDsOfNames(IHTMLWindow5 *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId) -{ - HTMLWindow *This = impl_from_IHTMLWindow5(iface); - - return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid, - rgDispId); -} - -static HRESULT WINAPI HTMLWindow5_Invoke(IHTMLWindow5 *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - HTMLWindow *This = impl_from_IHTMLWindow5(iface); - - return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, - pDispParams, pVarResult, pExcepInfo, puArgErr); -} +DISPEX_IDISPATCH_NOUNK_IMPL(HTMLWindow5, IHTMLWindow5, + impl_from_IHTMLWindow5(iface)->inner_window->event_target.dispex)
static HRESULT WINAPI HTMLWindow5_put_XMLHttpRequest(IHTMLWindow5 *iface, VARIANT v) { @@ -2126,40 +1976,8 @@ static ULONG WINAPI HTMLWindow6_Release(IHTMLWindow6 *iface) return IHTMLWindow2_Release(&This->IHTMLWindow2_iface); }
-static HRESULT WINAPI HTMLWindow6_GetTypeInfoCount(IHTMLWindow6 *iface, UINT *pctinfo) -{ - HTMLWindow *This = impl_from_IHTMLWindow6(iface); - - return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo); -} - -static HRESULT WINAPI HTMLWindow6_GetTypeInfo(IHTMLWindow6 *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - HTMLWindow *This = impl_from_IHTMLWindow6(iface); - - return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo); -} - -static HRESULT WINAPI HTMLWindow6_GetIDsOfNames(IHTMLWindow6 *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, - LCID lcid, DISPID *rgDispId) -{ - HTMLWindow *This = impl_from_IHTMLWindow6(iface); - - return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid, - rgDispId); -} - -static HRESULT WINAPI HTMLWindow6_Invoke(IHTMLWindow6 *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - HTMLWindow *This = impl_from_IHTMLWindow6(iface); - - return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, - pDispParams, pVarResult, pExcepInfo, puArgErr); -} +DISPEX_IDISPATCH_NOUNK_IMPL(HTMLWindow6, IHTMLWindow6, + impl_from_IHTMLWindow6(iface)->inner_window->event_target.dispex)
static HRESULT WINAPI HTMLWindow6_put_XDomainRequest(IHTMLWindow6 *iface, VARIANT v) { @@ -2564,36 +2382,8 @@ static ULONG WINAPI HTMLWindow7_Release(IHTMLWindow7 *iface) return IHTMLWindow2_Release(&This->IHTMLWindow2_iface); }
-static HRESULT WINAPI HTMLWindow7_GetTypeInfoCount(IHTMLWindow7 *iface, UINT *pctinfo) -{ - HTMLWindow *This = impl_from_IHTMLWindow7(iface); - return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo); -} - -static HRESULT WINAPI HTMLWindow7_GetTypeInfo(IHTMLWindow7 *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - HTMLWindow *This = impl_from_IHTMLWindow7(iface); - return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo); -} - -static HRESULT WINAPI HTMLWindow7_GetIDsOfNames(IHTMLWindow7 *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, - LCID lcid, DISPID *rgDispId) -{ - HTMLWindow *This = impl_from_IHTMLWindow7(iface); - return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid, - rgDispId); -} - -static HRESULT WINAPI HTMLWindow7_Invoke(IHTMLWindow7 *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - HTMLWindow *This = impl_from_IHTMLWindow7(iface); - return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, - pDispParams, pVarResult, pExcepInfo, puArgErr); -} +DISPEX_IDISPATCH_NOUNK_IMPL(HTMLWindow7, IHTMLWindow7, + impl_from_IHTMLWindow7(iface)->inner_window->event_target.dispex)
static HRESULT WINAPI HTMLWindow7_getSelection(IHTMLWindow7 *iface, IHTMLSelection **p) { @@ -3340,40 +3130,8 @@ static ULONG WINAPI window_private_Release(IWineHTMLWindowPrivate *iface) return IHTMLWindow2_Release(&This->IHTMLWindow2_iface); }
-static HRESULT WINAPI window_private_GetTypeInfoCount(IWineHTMLWindowPrivate *iface, UINT *pctinfo) -{ - HTMLWindow *This = impl_from_IWineHTMLWindowPrivateVtbl(iface); - - return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo); -} - -static HRESULT WINAPI window_private_GetTypeInfo(IWineHTMLWindowPrivate *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - HTMLWindow *This = impl_from_IWineHTMLWindowPrivateVtbl(iface); - - return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo); -} - -static HRESULT WINAPI window_private_GetIDsOfNames(IWineHTMLWindowPrivate *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, - LCID lcid, DISPID *rgDispId) -{ - HTMLWindow *This = impl_from_IWineHTMLWindowPrivateVtbl(iface); - - return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid, - rgDispId); -} - -static HRESULT WINAPI window_private_Invoke(IWineHTMLWindowPrivate *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - HTMLWindow *This = impl_from_IWineHTMLWindowPrivateVtbl(iface); - - return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, - pDispParams, pVarResult, pExcepInfo, puArgErr); -} +DISPEX_IDISPATCH_NOUNK_IMPL(window_private, IWineHTMLWindowPrivate, + impl_from_IWineHTMLWindowPrivateVtbl(iface)->inner_window->event_target.dispex)
static HRESULT WINAPI window_private_requestAnimationFrame(IWineHTMLWindowPrivate *iface, VARIANT *expr, VARIANT *timer_id) @@ -3494,40 +3252,8 @@ static ULONG WINAPI window_compat_private_Release(IWineHTMLWindowCompatPrivate * return IHTMLWindow2_Release(&This->IHTMLWindow2_iface); }
-static HRESULT WINAPI window_compat_private_GetTypeInfoCount(IWineHTMLWindowCompatPrivate *iface, UINT *pctinfo) -{ - HTMLWindow *This = impl_from_IWineHTMLWindowCompatPrivateVtbl(iface); - - return IDispatchEx_GetTypeInfoCount(&This->IDispatchEx_iface, pctinfo); -} - -static HRESULT WINAPI window_compat_private_GetTypeInfo(IWineHTMLWindowCompatPrivate *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - HTMLWindow *This = impl_from_IWineHTMLWindowCompatPrivateVtbl(iface); - - return IDispatchEx_GetTypeInfo(&This->IDispatchEx_iface, iTInfo, lcid, ppTInfo); -} - -static HRESULT WINAPI window_compat_private_GetIDsOfNames(IWineHTMLWindowCompatPrivate *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, - LCID lcid, DISPID *rgDispId) -{ - HTMLWindow *This = impl_from_IWineHTMLWindowCompatPrivateVtbl(iface); - - return IDispatchEx_GetIDsOfNames(&This->IDispatchEx_iface, riid, rgszNames, cNames, lcid, - rgDispId); -} - -static HRESULT WINAPI window_compat_private_Invoke(IWineHTMLWindowCompatPrivate *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - HTMLWindow *This = impl_from_IWineHTMLWindowCompatPrivateVtbl(iface); - - return IDispatchEx_Invoke(&This->IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, - pDispParams, pVarResult, pExcepInfo, puArgErr); -} +DISPEX_IDISPATCH_NOUNK_IMPL(window_compat_private, IWineHTMLWindowCompatPrivate, + impl_from_IWineHTMLWindowCompatPrivateVtbl(iface)->inner_window->event_target.dispex)
static HRESULT WINAPI window_compat_private_put_performance(IWineHTMLWindowCompatPrivate *iface, VARIANT v) { @@ -3581,57 +3307,8 @@ static ULONG WINAPI WindowDispEx_Release(IDispatchEx *iface) return IHTMLWindow2_Release(&This->IHTMLWindow2_iface); }
-static HRESULT WINAPI WindowDispEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo) -{ - HTMLWindow *This = impl_from_IDispatchEx(iface); - - TRACE("(%p)->(%p)\n", This, pctinfo); - - return IDispatchEx_GetTypeInfoCount(&This->inner_window->event_target.dispex.IDispatchEx_iface, pctinfo); -} - -static HRESULT WINAPI WindowDispEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - HTMLWindow *This = impl_from_IDispatchEx(iface); - - TRACE("(%p)->(%u %lu %p)\n", This, iTInfo, lcid, ppTInfo); - - return IDispatchEx_GetTypeInfo(&This->inner_window->event_target.dispex.IDispatchEx_iface, iTInfo, lcid, ppTInfo); -} - -static HRESULT WINAPI WindowDispEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid, - LPOLESTR *rgszNames, UINT cNames, - LCID lcid, DISPID *rgDispId) -{ - HTMLWindow *This = impl_from_IDispatchEx(iface); - HRESULT hres = S_OK; - - WARN("(%p)->(%s %p %u %lu %p)\n", This, debugstr_guid(riid), rgszNames, cNames, lcid, rgDispId); - - /* Native ignores all cNames > 1, and doesn't even fill them */ - if(cNames) { - /* We shouldn't use script's IDispatchEx here, so we shouldn't use GetDispID */ - hres = IDispatchEx_GetDispID(&This->IDispatchEx_iface, rgszNames[0], 0, rgDispId); - } - - return hres; -} - -static HRESULT WINAPI WindowDispEx_Invoke(IDispatchEx *iface, DISPID dispIdMember, - REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, - VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - HTMLWindow *This = impl_from_IDispatchEx(iface); - - TRACE("(%p)->(%ld %s %ld %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid), - lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr); - - /* FIXME: Use script dispatch */ - - return IDispatchEx_Invoke(&This->inner_window->event_target.dispex.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, - pDispParams, pVarResult, pExcepInfo, puArgErr); -} +DISPEX_IDISPATCH_NOUNK_IMPL(WindowDispEx, IDispatchEx, + impl_from_IDispatchEx(iface)->inner_window->event_target.dispex)
static global_prop_t *alloc_global_prop(HTMLInnerWindow *This, global_prop_type_t type, BSTR name) { @@ -3810,37 +3487,8 @@ static ULONG WINAPI WindowEventTarget_Release(IEventTarget *iface) return IHTMLWindow2_Release(&This->base.IHTMLWindow2_iface); }
-static HRESULT WINAPI WindowEventTarget_GetTypeInfoCount(IEventTarget *iface, UINT *pctinfo) -{ - HTMLOuterWindow *This = impl_from_IEventTarget(iface); - - return IDispatchEx_GetTypeInfoCount(&This->base.IDispatchEx_iface, pctinfo); -} - -static HRESULT WINAPI WindowEventTarget_GetTypeInfo(IEventTarget *iface, UINT iTInfo, - LCID lcid, ITypeInfo **ppTInfo) -{ - HTMLOuterWindow *This = impl_from_IEventTarget(iface); - - return IDispatchEx_GetTypeInfo(&This->base.IDispatchEx_iface, iTInfo, lcid, ppTInfo); -} - -static HRESULT WINAPI WindowEventTarget_GetIDsOfNames(IEventTarget *iface, REFIID riid, LPOLESTR *rgszNames, - UINT cNames, LCID lcid, DISPID *rgDispId) -{ - HTMLOuterWindow *This = impl_from_IEventTarget(iface); - - return IDispatchEx_GetIDsOfNames(&This->base.IDispatchEx_iface, riid, rgszNames, cNames, lcid, rgDispId); -} - -static HRESULT WINAPI WindowEventTarget_Invoke(IEventTarget *iface, DISPID dispIdMember, REFIID riid, LCID lcid, - WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr) -{ - HTMLOuterWindow *This = impl_from_IEventTarget(iface); - - return IDispatchEx_Invoke(&This->base.IDispatchEx_iface, dispIdMember, riid, lcid, wFlags, pDispParams, - pVarResult, pExcepInfo, puArgErr); -} +DISPEX_IDISPATCH_NOUNK_IMPL(WindowEventTarget, IEventTarget, + impl_from_IEventTarget(iface)->base.inner_window->event_target.dispex)
static HRESULT WINAPI WindowEventTarget_addEventListener(IEventTarget *iface, BSTR type, IDispatch *listener, VARIANT_BOOL capture) diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index ae7b08ec034..35972d9eefb 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -418,19 +418,7 @@ struct DispatchEx { dispex_dynamic_data_t *dynamic_data; };
-#define DISPEX_IDISPATCH_IMPL(prefix, iface_name, dispex) \ - static HRESULT WINAPI prefix##_QueryInterface(iface_name *iface, REFIID riid, void **ppv) \ - { \ - return IDispatchEx_QueryInterface(&(dispex).IDispatchEx_iface, riid, ppv); \ - } \ - static ULONG WINAPI prefix##_AddRef(iface_name *iface) \ - { \ - return IDispatchEx_AddRef(&(dispex).IDispatchEx_iface); \ - } \ - static ULONG WINAPI prefix##_Release(iface_name *iface) \ - { \ - return IDispatchEx_Release(&(dispex).IDispatchEx_iface); \ - } \ +#define DISPEX_IDISPATCH_NOUNK_IMPL(prefix, iface_name, dispex) \ static HRESULT WINAPI prefix##_GetTypeInfoCount(iface_name *iface, UINT *count) \ { \ return IDispatchEx_GetTypeInfoCount(&(dispex).IDispatchEx_iface, count); \ @@ -453,6 +441,21 @@ struct DispatchEx { riid, lcid, flags, params, res, ei, err); \ }
+#define DISPEX_IDISPATCH_IMPL(prefix, iface_name, dispex) \ + static HRESULT WINAPI prefix##_QueryInterface(iface_name *iface, REFIID riid, void **ppv) \ + { \ + return IDispatchEx_QueryInterface(&(dispex).IDispatchEx_iface, riid, ppv); \ + } \ + static ULONG WINAPI prefix##_AddRef(iface_name *iface) \ + { \ + return IDispatchEx_AddRef(&(dispex).IDispatchEx_iface); \ + } \ + static ULONG WINAPI prefix##_Release(iface_name *iface) \ + { \ + return IDispatchEx_Release(&(dispex).IDispatchEx_iface); \ + } \ + DISPEX_IDISPATCH_NOUNK_IMPL(prefix, iface_name, dispex) + typedef struct { void *vtbl; int ref_flags;
From: Jacek Caban jacek@codeweavers.com
--- dlls/mshtml/htmldoc.c | 2 +- dlls/mshtml/htmlframe.c | 4 +- dlls/mshtml/htmlwindow.c | 80 +++++++++++++++++------------------- dlls/mshtml/mshtml_private.h | 2 +- 4 files changed, 42 insertions(+), 46 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 118f4706f37..c24bf6b6b6d 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -6050,7 +6050,7 @@ static HRESULT HTMLDocumentNode_location_hook(DispatchEx *dispex, WORD flags, DI if(!This->window->base.outer_window) return E_FAIL;
- return IDispatchEx_InvokeEx(&This->window->base.outer_window->base.IDispatchEx_iface, DISPID_IHTMLWINDOW2_LOCATION, + return IDispatchEx_InvokeEx(&This->window->event_target.dispex.IDispatchEx_iface, DISPID_IHTMLWINDOW2_LOCATION, 0, flags, dp, res, ei, caller); }
diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c index d3dfae97b45..d842f82672d 100644 --- a/dlls/mshtml/htmlframe.c +++ b/dlls/mshtml/htmlframe.c @@ -893,7 +893,7 @@ static HRESULT HTMLFrameElement_invoke(DispatchEx *dispex, DISPID id, LCID lcid, return E_FAIL; }
- return IDispatchEx_InvokeEx(&This->framebase.content_window->base.IDispatchEx_iface, id, lcid, + return IDispatchEx_InvokeEx(&This->framebase.content_window->IDispatchEx_iface, id, lcid, flags, params, res, ei, caller); }
@@ -1330,7 +1330,7 @@ static HRESULT HTMLIFrame_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD return E_FAIL; }
- return IDispatchEx_InvokeEx(&This->framebase.content_window->base.IDispatchEx_iface, id, lcid, + return IDispatchEx_InvokeEx(&This->framebase.content_window->IDispatchEx_iface, id, lcid, flags, params, res, ei, caller); }
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index f2c3afe85d6..82c1b1db029 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -159,8 +159,6 @@ static void *base_query_interface(HTMLWindow *This, REFIID riid) return &This->IHTMLWindow2_iface; if(IsEqualGUID(&IID_IDispatch, riid)) return &This->IHTMLWindow2_iface; - if(IsEqualGUID(&IID_IDispatchEx, riid)) - return &This->IDispatchEx_iface; if(IsEqualGUID(&IID_IHTMLFramesCollection2, riid)) return &This->IHTMLWindow2_iface; if(IsEqualGUID(&IID_IHTMLWindow2, riid)) @@ -204,35 +202,33 @@ static void *base_query_interface(HTMLWindow *This, REFIID riid) static HRESULT WINAPI outer_window_QueryInterface(IHTMLWindow2 *iface, REFIID riid, void **ppv) { HTMLOuterWindow *This = HTMLOuterWindow_from_IHTMLWindow2(iface); - IUnknown *base_iface;
TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv);
- if((base_iface = base_query_interface(&This->base, riid))) { - *ppv = base_iface; - IUnknown_AddRef(base_iface); - return S_OK; - } - if(IsEqualGUID(&IID_nsXPCOMCycleCollectionParticipant, riid)) { *ppv = &outer_window_ccp; return S_OK; }else if(IsEqualGUID(&IID_nsCycleCollectionISupports, riid)) { *ppv = &This->base.IHTMLWindow2_iface; return S_OK; + }else if(IsEqualGUID(&IID_IDispatchEx, riid)) { + *ppv = &This->IDispatchEx_iface; }else if(IsEqualGUID(&IID_IEventTarget, riid)) { - if(!This->base.inner_window->doc || This->base.inner_window->doc->document_mode < COMPAT_MODE_IE9) { - *ppv = NULL; + if(!This->base.inner_window->doc || This->base.inner_window->doc->document_mode < COMPAT_MODE_IE9) return E_NOINTERFACE; - } *ppv = &This->IEventTarget_iface; - IHTMLWindow2_AddRef(&This->base.IHTMLWindow2_iface); - return S_OK; + }else { + *ppv = base_query_interface(&This->base, riid); + } + + if(!*ppv) { + WARN("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); + *ppv = NULL; + return E_NOINTERFACE; }
- WARN("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - *ppv = NULL; - return E_NOINTERFACE; + IUnknown_AddRef((IUnknown *)*ppv); + return S_OK; }
static ULONG WINAPI outer_window_AddRef(IHTMLWindow2 *iface) @@ -3281,34 +3277,34 @@ static const IWineHTMLWindowCompatPrivateVtbl WineHTMLWindowCompatPrivateVtbl = window_compat_private_get_performance, };
-static inline HTMLWindow *impl_from_IDispatchEx(IDispatchEx *iface) +static inline HTMLOuterWindow *impl_from_IDispatchEx(IDispatchEx *iface) { - return CONTAINING_RECORD(iface, HTMLWindow, IDispatchEx_iface); + return CONTAINING_RECORD(iface, HTMLOuterWindow, IDispatchEx_iface); }
static HRESULT WINAPI WindowDispEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv) { - HTMLWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IDispatchEx(iface);
- return IHTMLWindow2_QueryInterface(&This->IHTMLWindow2_iface, riid, ppv); + return IHTMLWindow2_QueryInterface(&This->base.IHTMLWindow2_iface, riid, ppv); }
static ULONG WINAPI WindowDispEx_AddRef(IDispatchEx *iface) { - HTMLWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IDispatchEx(iface);
- return IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface); + return IHTMLWindow2_AddRef(&This->base.IHTMLWindow2_iface); }
static ULONG WINAPI WindowDispEx_Release(IDispatchEx *iface) { - HTMLWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IDispatchEx(iface);
- return IHTMLWindow2_Release(&This->IHTMLWindow2_iface); + return IHTMLWindow2_Release(&This->base.IHTMLWindow2_iface); }
DISPEX_IDISPATCH_NOUNK_IMPL(WindowDispEx, IDispatchEx, - impl_from_IDispatchEx(iface)->inner_window->event_target.dispex) + impl_from_IDispatchEx(iface)->base.inner_window->event_target.dispex)
static global_prop_t *alloc_global_prop(HTMLInnerWindow *This, global_prop_type_t type, BSTR name) { @@ -3375,67 +3371,67 @@ HRESULT search_window_props(HTMLInnerWindow *This, BSTR bstrName, DWORD grfdex,
static HRESULT WINAPI WindowDispEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid) { - HTMLWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IDispatchEx(iface);
- return IDispatchEx_GetDispID(&This->inner_window->event_target.dispex.IDispatchEx_iface, bstrName, grfdex, pid); + return IDispatchEx_GetDispID(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, bstrName, grfdex, pid); }
static HRESULT WINAPI WindowDispEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp, VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { - HTMLWindow *This = impl_from_IDispatchEx(iface); - return IDispatchEx_InvokeEx(&This->inner_window->event_target.dispex.IDispatchEx_iface, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); + HTMLOuterWindow *This = impl_from_IDispatchEx(iface); + return IDispatchEx_InvokeEx(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, id, lcid, wFlags, pdp, pvarRes, pei, pspCaller); }
static HRESULT WINAPI WindowDispEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) { - HTMLWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IDispatchEx(iface);
TRACE("(%p)->(%s %lx)\n", This, debugstr_w(bstrName), grfdex);
- return IDispatchEx_DeleteMemberByName(&This->inner_window->event_target.dispex.IDispatchEx_iface, bstrName, grfdex); + return IDispatchEx_DeleteMemberByName(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, bstrName, grfdex); }
static HRESULT WINAPI WindowDispEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id) { - HTMLWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IDispatchEx(iface);
TRACE("(%p)->(%lx)\n", This, id);
- return IDispatchEx_DeleteMemberByDispID(&This->inner_window->event_target.dispex.IDispatchEx_iface, id); + return IDispatchEx_DeleteMemberByDispID(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, id); }
static HRESULT WINAPI WindowDispEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex) { - HTMLWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IDispatchEx(iface);
TRACE("(%p)->(%lx %lx %p)\n", This, id, grfdexFetch, pgrfdex);
- return IDispatchEx_GetMemberProperties(&This->inner_window->event_target.dispex.IDispatchEx_iface, id, grfdexFetch, + return IDispatchEx_GetMemberProperties(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, id, grfdexFetch, pgrfdex); }
static HRESULT WINAPI WindowDispEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName) { - HTMLWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IDispatchEx(iface);
TRACE("(%p)->(%lx %p)\n", This, id, pbstrName);
- return IDispatchEx_GetMemberName(&This->inner_window->event_target.dispex.IDispatchEx_iface, id, pbstrName); + return IDispatchEx_GetMemberName(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, id, pbstrName); }
static HRESULT WINAPI WindowDispEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid) { - HTMLWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IDispatchEx(iface);
TRACE("(%p)->(%lx %lx %p)\n", This, grfdex, id, pid);
- return IDispatchEx_GetNextDispID(&This->inner_window->event_target.dispex.IDispatchEx_iface, grfdex, id, pid); + return IDispatchEx_GetNextDispID(&This->base.inner_window->event_target.dispex.IDispatchEx_iface, grfdex, id, pid); }
static HRESULT WINAPI WindowDispEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk) { - HTMLWindow *This = impl_from_IDispatchEx(iface); + HTMLOuterWindow *This = impl_from_IDispatchEx(iface);
TRACE("(%p)->(%p)\n", This, ppunk);
@@ -4157,7 +4153,6 @@ static void *alloc_window(size_t size) window->IHTMLWindow6_iface.lpVtbl = &HTMLWindow6Vtbl; window->IHTMLWindow7_iface.lpVtbl = &HTMLWindow7Vtbl; window->IHTMLPrivateWindow_iface.lpVtbl = &HTMLPrivateWindowVtbl; - window->IDispatchEx_iface.lpVtbl = &WindowDispExVtbl; window->IServiceProvider_iface.lpVtbl = &ServiceProviderVtbl; window->ITravelLogClient_iface.lpVtbl = &TravelLogClientVtbl; window->IObjectIdentity_iface.lpVtbl = &ObjectIdentityVtbl; @@ -4209,6 +4204,7 @@ HRESULT create_outer_window(GeckoBrowser *browser, mozIDOMWindowProxy *mozwindow if(!window) return E_OUTOFMEMORY; window->base.IHTMLWindow2_iface.lpVtbl = &outer_window_HTMLWindow2Vtbl; + window->IDispatchEx_iface.lpVtbl = &WindowDispExVtbl; window->IEventTarget_iface.lpVtbl = &EventTargetVtbl;
window->base.outer_window = window; diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 35972d9eefb..78fabfcd71b 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -577,7 +577,6 @@ struct HTMLWindow { IHTMLWindow6 IHTMLWindow6_iface; IHTMLWindow7 IHTMLWindow7_iface; IHTMLPrivateWindow IHTMLPrivateWindow_iface; - IDispatchEx IDispatchEx_iface; IServiceProvider IServiceProvider_iface; ITravelLogClient ITravelLogClient_iface; IObjectIdentity IObjectIdentity_iface; @@ -592,6 +591,7 @@ struct HTMLWindow { struct HTMLOuterWindow { HTMLWindow base; IEventTarget IEventTarget_iface; + IDispatchEx IDispatchEx_iface;
nsCycleCollectingAutoRefCnt ccref; LONG task_magic;
Gabriel Ivăncescu (@insn) commented about dlls/mshtml/mshtml_private.h:
/* Similar to get_dispid, but called only when a dynamic property can't be found */ HRESULT (*find_dispid)(DispatchEx*,BSTR,DWORD,DISPID*);
- /* Similar to get_dispid, but called called before any other lookup */
Minor typo: extra "called" in comment.
I've been trying to gauge what it would take to use this in my proxy patches, and it seems doable at a glance. Though I might have to add a method for retrieving "jscript flags" of custom props.
This merge request was approved by Gabriel Ivăncescu.