From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/mutation.c | 28 +++++++++++++++++++++++++++- dlls/mshtml/omnavigator.c | 26 ++------------------------ 3 files changed, 30 insertions(+), 25 deletions(-)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index d04d4b2b2c2..270f09b1f30 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1023,6 +1023,7 @@ void ConnectionPointContainer_Destroy(ConnectionPointContainer*) DECLSPEC_HIDDEN HRESULT create_gecko_browser(HTMLDocumentObj*,GeckoBrowser**) DECLSPEC_HIDDEN; void detach_gecko_browser(GeckoBrowser*) DECLSPEC_HIDDEN;
+DWORD get_compat_mode_version(compat_mode_t compat_mode) DECLSPEC_HIDDEN; compat_mode_t lock_document_mode(HTMLDocumentNode*) DECLSPEC_HIDDEN;
void init_mutation(nsIComponentManager*) DECLSPEC_HIDDEN; diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index 7f2d92b4bcc..83ab623aea8 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -388,6 +388,26 @@ static nsresult run_insert_script(HTMLDocumentNode *doc, nsISupports *script_ifa return NS_OK; }
+DWORD get_compat_mode_version(compat_mode_t compat_mode) +{ + switch(compat_mode) { + case COMPAT_MODE_QUIRKS: + case COMPAT_MODE_IE5: + case COMPAT_MODE_IE7: + return 7; + case COMPAT_MODE_IE8: + return 8; + case COMPAT_MODE_IE9: + return 9; + case COMPAT_MODE_IE10: + return 10; + case COMPAT_MODE_IE11: + return 11; + DEFAULT_UNREACHABLE; + } + return 0; +} + /* * We may change document mode only in early stage of document lifetime. * Later attempts will not have an effect. @@ -396,7 +416,13 @@ compat_mode_t lock_document_mode(HTMLDocumentNode *doc) { TRACE("%p: %d\n", doc, doc->document_mode);
- doc->document_mode_locked = TRUE; + if(!doc->document_mode_locked) { + doc->document_mode_locked = TRUE; + + if(doc->html_document) + nsIDOMHTMLDocument_SetIECompatMode(doc->html_document, get_compat_mode_version(doc->document_mode)); + } + return doc->document_mode; }
diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index aa9f33567c2..c2a580ceeb3 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -1170,30 +1170,8 @@ extern HRESULT WINAPI MapBrowserEmulationModeToUserAgent(const void*,WCHAR**); /* Retrieves allocated user agent via CoTaskMemAlloc */ static HRESULT get_user_agent(OmNavigator *navigator, WCHAR **user_agent) { - DWORD version; - - switch(dispex_compat_mode(&navigator->dispex)) { - case COMPAT_MODE_QUIRKS: - case COMPAT_MODE_IE5: - case COMPAT_MODE_IE7: - version = 7; - break; - case COMPAT_MODE_IE8: - version = 8; - break; - case COMPAT_MODE_IE9: - version = 9; - break; - case COMPAT_MODE_IE10: - version = 10; - break; - case COMPAT_MODE_IE11: - version = 11; - break; - default: - assert(0); - return E_FAIL; - } + DWORD version = get_compat_mode_version(dispex_compat_mode(&navigator->dispex)); + return MapBrowserEmulationModeToUserAgent(&version, user_agent); }
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Since we only use in-process plugins anyway.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/nsembed.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c index b6d7b53f815..3e315bc7211 100644 --- a/dlls/mshtml/nsembed.c +++ b/dlls/mshtml/nsembed.c @@ -540,6 +540,7 @@ static void set_preferences(void) set_lang(pref); set_bool_pref(pref, "security.warn_entering_secure", FALSE); set_bool_pref(pref, "security.warn_submit_insecure", FALSE); + set_bool_pref(pref, "dom.ipc.plugins.enabled", FALSE); set_bool_pref(pref, "layout.css.grid.enabled", TRUE); set_int_pref(pref, "layout.spellcheckDefault", 0);
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlinput.c | 13 +++++++++-- dlls/mshtml/tests/dom.c | 5 +++++ dlls/mshtml/tests/events.c | 45 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c index e02ac2249d9..41d482d2cb8 100644 --- a/dlls/mshtml/htmlinput.c +++ b/dlls/mshtml/htmlinput.c @@ -684,8 +684,17 @@ static HRESULT WINAPI HTMLInputElement_get_readyState(IHTMLInputElement *iface, static HRESULT WINAPI HTMLInputElement_get_complete(IHTMLInputElement *iface, VARIANT_BOOL *p) { HTMLInputElement *This = impl_from_IHTMLInputElement(iface); - FIXME("(%p)->(%p)\n", This, p); - return E_NOTIMPL; + cpp_bool complete; + nsresult nsres; + + TRACE("(%p)->(%p)\n", This, p); + + nsres = nsIDOMHTMLInputElement_GetComplete(This->nsinput, &complete); + if(NS_FAILED(nsres)) + return map_nsresult(nsres); + + *p = variant_bool(complete); + return S_OK; }
static HRESULT WINAPI HTMLInputElement_put_loop(IHTMLInputElement *iface, VARIANT v) diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 39af8faa8d5..bb86a7e0a1b 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -3987,6 +3987,7 @@ static void test_contenteditable(IUnknown *unk) #define test_input_type(i,t) _test_input_type(__LINE__,i,t) static void _test_input_type(unsigned line, IHTMLInputElement *input, const WCHAR *extype) { + VARIANT_BOOL b; BSTR type; HRESULT hres;
@@ -3994,6 +3995,10 @@ static void _test_input_type(unsigned line, IHTMLInputElement *input, const WCHA ok_(__FILE__,line) (hres == S_OK, "get_type failed: %08lx\n", hres); ok_(__FILE__,line) (!lstrcmpW(type, extype), "type=%s, expected %s\n", wine_dbgstr_w(type), wine_dbgstr_w(extype)); SysFreeString(type); + + hres = IHTMLInputElement_get_complete(input, &b); + ok_(__FILE__,line) (hres == S_OK, "get_complete failed: %08lx\n", hres); + ok(b == VARIANT_FALSE, "complete = %x\n", b); }
#define test_input_name(u, c) _test_input_name(__LINE__,u, c) diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c index efb7393f04a..0975985f431 100644 --- a/dlls/mshtml/tests/events.c +++ b/dlls/mshtml/tests/events.c @@ -2412,6 +2412,7 @@ static void test_inputload(IHTMLDocument2 *doc) { IHTMLInputElement *input; IHTMLElement *elem; + VARIANT_BOOL b; VARIANT v; BSTR str; HRESULT hres; @@ -2438,15 +2439,27 @@ static void test_inputload(IHTMLDocument2 *doc) ok(V_DISPATCH(&v) == (IDispatch*)&input_onload_obj, "V_DISPATCH(onload) != input_onload_obj\n"); VariantClear(&v);
+ hres = IHTMLInputElement_get_complete(input, &b); + ok(hres == S_OK, "get_complete failed: %08lx\n", hres); + ok(b == VARIANT_FALSE, "complete = %x\n", b); + str = SysAllocString(L"http://test.winehq.org/tests/winehq_snapshot/index_files/winehq_logo_text.pn..."); hres = IHTMLInputElement_put_src(input, str); ok(hres == S_OK, "put_src failed: %08lx\n", hres); SysFreeString(str);
+ hres = IHTMLInputElement_get_complete(input, &b); + ok(hres == S_OK, "get_complete failed: %08lx\n", hres); + ok(b == VARIANT_FALSE, "complete = %x\n", b); + SET_EXPECT(input_onload); pump_msgs(&called_input_onload); CHECK_CALLED(input_onload);
+ hres = IHTMLInputElement_get_complete(input, &b); + ok(hres == S_OK, "get_complete failed: %08lx\n", hres); + ok(b == VARIANT_TRUE, "complete = %x\n", b); + IHTMLInputElement_Release(input); }
@@ -2494,15 +2507,37 @@ static void test_link_load(IHTMLDocument2 *doc)
static void test_focus(IHTMLDocument2 *doc) { + IHTMLInputElement *input; IHTMLElement2 *elem2; IHTMLElement4 *div; IHTMLElement *elem; + VARIANT_BOOL b; VARIANT v; + BSTR str; HRESULT hres;
elem = get_elem_id(doc, L"inputid"); elem2 = get_elem2_iface((IUnknown*)elem); + + hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLInputElement, (void**)&input); IHTMLElement_Release(elem); + ok(hres == S_OK, "Could not get IHTMLInputElement iface: %08lx\n", hres); + + hres = IHTMLInputElement_get_complete(input, &b); + ok(hres == S_OK, "get_complete failed: %08lx\n", hres); + ok(b == VARIANT_FALSE, "complete = %x\n", b); + + str = SysAllocString(L"http://test.winehq.org/tests/winehq_snapshot/index_files/winehq_logo_text.pn..."); + hres = IHTMLInputElement_put_src(input, str); + ok(hres == S_OK, "put_src failed: %08lx\n", hres); + SysFreeString(str); + + pump_msgs(NULL); + + hres = IHTMLInputElement_get_complete(input, &b); + ok(hres == S_OK, "get_complete failed: %08lx\n", hres); + ok(b == VARIANT_FALSE, "complete = %x\n", b); + IHTMLInputElement_Release(input);
elem = get_elem_id(doc, L"divid"); div = get_elem4_iface((IUnknown*)elem); @@ -2779,7 +2814,9 @@ static void test_unload_event(IHTMLDocument2 *doc) static void test_submit(IHTMLDocument2 *doc) { IHTMLElement *elem, *submit; + IHTMLInputElement *input; IHTMLFormElement *form; + VARIANT_BOOL b; VARIANT v; DWORD cp_cookie; HRESULT hres; @@ -2810,6 +2847,14 @@ static void test_submit(IHTMLDocument2 *doc)
submit = get_elem_id(doc, L"submitid");
+ hres = IHTMLElement_QueryInterface(submit, &IID_IHTMLInputElement, (void**)&input); + ok(hres == S_OK, "Could not get IHTMLInputElement iface: %08lx\n", hres); + + hres = IHTMLInputElement_get_complete(input, &b); + ok(hres == S_OK, "get_complete failed: %08lx\n", hres); + ok(b == VARIANT_FALSE, "complete = %x\n", b); + IHTMLInputElement_Release(input); + SET_EXPECT(form_onclick); SET_EXPECT(form_onsubmit); hres = IHTMLElement_click(submit);
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Since wine-gecko now implements synchronous events for image loads in legacy modes, this is no longer needed.
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlanchor.c | 1 - dlls/mshtml/htmlarea.c | 1 - dlls/mshtml/htmlbody.c | 1 - dlls/mshtml/htmlcomment.c | 1 - dlls/mshtml/htmldoc.c | 4 ---- dlls/mshtml/htmlelem.c | 13 ----------- dlls/mshtml/htmlevent.h | 1 - dlls/mshtml/htmlform.c | 1 - dlls/mshtml/htmlframe.c | 2 -- dlls/mshtml/htmlgeneric.c | 1 - dlls/mshtml/htmlhead.c | 4 ---- dlls/mshtml/htmlimg.c | 43 +--------------------------------- dlls/mshtml/htmlinput.c | 3 --- dlls/mshtml/htmllink.c | 1 - dlls/mshtml/htmlobject.c | 2 -- dlls/mshtml/htmlscript.c | 1 - dlls/mshtml/htmlselect.c | 2 -- dlls/mshtml/htmlstyleelem.c | 1 - dlls/mshtml/htmltable.c | 3 --- dlls/mshtml/htmltextarea.c | 1 - dlls/mshtml/htmlwindow.c | 1 - dlls/mshtml/mshtml_private.h | 2 -- dlls/mshtml/nsevents.c | 11 +-------- dlls/mshtml/svg.c | 4 ---- dlls/mshtml/tests/events.c | 45 ++++++++++++++++++++++++++++++++---- 25 files changed, 43 insertions(+), 107 deletions(-)
diff --git a/dlls/mshtml/htmlanchor.c b/dlls/mshtml/htmlanchor.c index f4c0ff88c6d..1e783ce007e 100644 --- a/dlls/mshtml/htmlanchor.c +++ b/dlls/mshtml/htmlanchor.c @@ -879,7 +879,6 @@ static const NodeImplVtbl HTMLAnchorElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLAnchorElement_handle_event, HTMLElement_get_attr_col, NULL, diff --git a/dlls/mshtml/htmlarea.c b/dlls/mshtml/htmlarea.c index 18736b1fd21..eb7ea383db9 100644 --- a/dlls/mshtml/htmlarea.c +++ b/dlls/mshtml/htmlarea.c @@ -467,7 +467,6 @@ static const NodeImplVtbl HTMLAreaElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLAreaElement_handle_event, HTMLElement_get_attr_col }; diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c index 311bbca2257..6338e7e907b 100644 --- a/dlls/mshtml/htmlbody.c +++ b/dlls/mshtml/htmlbody.c @@ -983,7 +983,6 @@ static const NodeImplVtbl HTMLBodyElementImplVtbl = { HTMLElement_destructor, HTMLBodyElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, HTMLBodyElement_get_event_prop_target, diff --git a/dlls/mshtml/htmlcomment.c b/dlls/mshtml/htmlcomment.c index dd4c83cc77c..cc3bec32959 100644 --- a/dlls/mshtml/htmlcomment.c +++ b/dlls/mshtml/htmlcomment.c @@ -189,7 +189,6 @@ static const NodeImplVtbl HTMLCommentElementImplVtbl = { HTMLCommentElement_destructor, HTMLElement_cpc, HTMLCommentElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col }; diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index 1669b4c518b..049b5c3559e 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -371,7 +371,6 @@ static event_target_vtbl_t DocumentType_event_target_vtbl = { }, DocumentType_get_gecko_target, NULL, - NULL, DocumentType_get_parent_event_target, NULL, NULL, @@ -5891,7 +5890,6 @@ static const NodeImplVtbl HTMLDocumentNodeImplVtbl = { NULL, NULL, NULL, - NULL, HTMLDocumentNode_unlink };
@@ -6109,7 +6107,6 @@ static const event_target_vtbl_t HTMLDocumentNode_event_target_vtbl = { }, HTMLDocumentNode_get_gecko_target, HTMLDocumentNode_bind_event, - NULL, HTMLDocumentNode_get_parent_event_target, NULL, HTMLDocumentNode_get_cp_container, @@ -6134,7 +6131,6 @@ static const NodeImplVtbl HTMLDocumentFragmentImplVtbl = { NULL, NULL, NULL, - NULL, HTMLDocumentFragment_unlink };
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index f8b2eb46e6c..5cdb74c2051 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -6873,11 +6873,6 @@ HRESULT HTMLElement_clone(HTMLDOMNode *iface, nsIDOMNode *nsnode, HTMLDOMNode ** return S_OK; }
-HRESULT HTMLElement_dispatch_nsevent_hook(HTMLDOMNode *iface, DOMEvent *event) -{ - return S_FALSE; -} - HRESULT HTMLElement_handle_event(HTMLDOMNode *iface, DWORD eid, nsIDOMEvent *event, BOOL *prevent_default) { HTMLElement *This = impl_from_HTMLDOMNode(iface); @@ -6928,7 +6923,6 @@ static const NodeImplVtbl HTMLElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col }; @@ -7071,12 +7065,6 @@ static void HTMLElement_bind_event(DispatchEx *dispex, eventid_t eid) ensure_doc_nsevent_handler(This->node.doc, This->node.nsnode, eid); }
-static HRESULT HTMLElement_event_target_dispatch_nsevent_hook(DispatchEx *dispex, DOMEvent *event) -{ - HTMLElement *This = impl_from_DispatchEx(dispex); - return This->node.vtbl->dispatch_nsevent_hook(&This->node, event); -} - static HRESULT HTMLElement_handle_event_default(DispatchEx *dispex, eventid_t eid, nsIDOMEvent *nsevent, BOOL *prevent_default) { HTMLElement *This = impl_from_DispatchEx(dispex); @@ -7350,7 +7338,6 @@ static event_target_vtbl_t HTMLElement_event_target_vtbl = { }, HTMLElement_get_gecko_target, HTMLElement_bind_event, - HTMLElement_event_target_dispatch_nsevent_hook, HTMLElement_get_parent_event_target, HTMLElement_handle_event_default, HTMLElement_get_cp_container, diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h index 54cc5b5932a..988b379654e 100644 --- a/dlls/mshtml/htmlevent.h +++ b/dlls/mshtml/htmlevent.h @@ -132,7 +132,6 @@ typedef struct { dispex_static_data_vtbl_t dispex_vtbl; nsISupports *(*get_gecko_target)(DispatchEx*); void (*bind_event)(DispatchEx*,eventid_t); - HRESULT (*dispatch_nsevent_hook)(DispatchEx*,DOMEvent*); EventTarget *(*get_parent_event_target)(DispatchEx*); HRESULT (*handle_event_default)(DispatchEx*,eventid_t,nsIDOMEvent*,BOOL*); ConnectionPointContainer *(*get_cp_container)(DispatchEx*); diff --git a/dlls/mshtml/htmlform.c b/dlls/mshtml/htmlform.c index 8a15bbf307d..3e7ca112311 100644 --- a/dlls/mshtml/htmlform.c +++ b/dlls/mshtml/htmlform.c @@ -984,7 +984,6 @@ static const NodeImplVtbl HTMLFormElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLFormElement_handle_event, HTMLElement_get_attr_col, NULL, diff --git a/dlls/mshtml/htmlframe.c b/dlls/mshtml/htmlframe.c index 38bb53dc551..9be69c29f9a 100644 --- a/dlls/mshtml/htmlframe.c +++ b/dlls/mshtml/htmlframe.c @@ -1018,7 +1018,6 @@ static const NodeImplVtbl HTMLFrameElementImplVtbl = { HTMLFrameElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, @@ -1612,7 +1611,6 @@ static const NodeImplVtbl HTMLIFrameImplVtbl = { HTMLIFrame_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, diff --git a/dlls/mshtml/htmlgeneric.c b/dlls/mshtml/htmlgeneric.c index 27632f74624..9244ba017fb 100644 --- a/dlls/mshtml/htmlgeneric.c +++ b/dlls/mshtml/htmlgeneric.c @@ -157,7 +157,6 @@ static const NodeImplVtbl HTMLGenericElementImplVtbl = { HTMLGenericElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col }; diff --git a/dlls/mshtml/htmlhead.c b/dlls/mshtml/htmlhead.c index 423bc355f1b..072efd967b9 100644 --- a/dlls/mshtml/htmlhead.c +++ b/dlls/mshtml/htmlhead.c @@ -173,7 +173,6 @@ static const NodeImplVtbl HTMLTitleElementImplVtbl = { HTMLTitleElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col }; @@ -346,7 +345,6 @@ static const NodeImplVtbl HTMLHtmlElementImplVtbl = { HTMLHtmlElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, @@ -596,7 +594,6 @@ static const NodeImplVtbl HTMLMetaElementImplVtbl = { HTMLMetaElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col }; @@ -762,7 +759,6 @@ static const NodeImplVtbl HTMLHeadElementImplVtbl = { HTMLHeadElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col }; diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c index 01cc8405f87..50fa3531464 100644 --- a/dlls/mshtml/htmlimg.c +++ b/dlls/mshtml/htmlimg.c @@ -39,7 +39,6 @@ struct HTMLImg { IHTMLImgElement IHTMLImgElement_iface;
nsIDOMHTMLImageElement *nsimg; - eventid_t skip_event; };
static inline HTMLImg *impl_from_IHTMLImgElement(IHTMLImgElement *iface) @@ -282,7 +281,6 @@ static HRESULT WINAPI HTMLImgElement_get_alt(IHTMLImgElement *iface, BSTR *p) static HRESULT WINAPI HTMLImgElement_put_src(IHTMLImgElement *iface, BSTR v) { HTMLImg *This = impl_from_IHTMLImgElement(iface); - HRESULT hres = S_OK; nsAString src_str; nsresult nsres;
@@ -291,32 +289,7 @@ static HRESULT WINAPI HTMLImgElement_put_src(IHTMLImgElement *iface, BSTR v) nsAString_InitDepend(&src_str, v); nsres = nsIDOMHTMLImageElement_SetSrc(This->nsimg, &src_str); nsAString_Finish(&src_str); - if(NS_FAILED(nsres)) - ERR("SetSrc failed: %08lx\n", nsres); - - if(dispex_compat_mode(&This->element.node.event_target.dispex) < COMPAT_MODE_IE9) { - eventid_t eventid; - cpp_bool complete; - UINT32 height = 0; - DOMEvent *event; - - /* Synchronously send load event if the image was completed immediately (such as from cache) */ - This->skip_event = EVENTID_INVALID_ID; - - nsres = nsIDOMHTMLImageElement_GetComplete(This->nsimg, &complete); - if(NS_SUCCEEDED(nsres) && complete) { - nsIDOMHTMLImageElement_GetNaturalHeight(This->nsimg, &height); - eventid = height ? EVENTID_LOAD : EVENTID_ERROR; - - hres = create_document_event(This->element.node.doc, eventid, &event); - if(SUCCEEDED(hres)) { - This->skip_event = eventid; - dispatch_event(&This->element.node.event_target, event); - IDOMEvent_Release(&event->IDOMEvent_iface); - } - } - } - return hres; + return map_nsresult(nsres); }
static HRESULT WINAPI HTMLImgElement_get_src(IHTMLImgElement *iface, BSTR *p) @@ -702,18 +675,6 @@ static HRESULT HTMLImgElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv) return S_OK; }
-static HRESULT HTMLImgElement_dispatch_nsevent_hook(HTMLDOMNode *iface, DOMEvent *event) -{ - HTMLImg *This = impl_from_HTMLDOMNode(iface); - - if(event->event_id == This->skip_event) { - This->skip_event = EVENTID_INVALID_ID; - return S_OK; - } - - return S_FALSE; -} - static HRESULT HTMLImgElement_get_readystate(HTMLDOMNode *iface, BSTR *p) { HTMLImg *This = impl_from_HTMLDOMNode(iface); @@ -747,7 +708,6 @@ static const NodeImplVtbl HTMLImgElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLImgElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, @@ -799,7 +759,6 @@ HRESULT HTMLImgElement_Create(HTMLDocumentNode *doc, nsIDOMElement *nselem, HTML
ret->IHTMLImgElement_iface.lpVtbl = &HTMLImgElementVtbl; ret->element.node.vtbl = &HTMLImgElementImplVtbl; - ret->skip_event = EVENTID_INVALID_ID;
HTMLElement_Init(&ret->element, doc, nselem, &HTMLImgElement_dispex);
diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c index 41d482d2cb8..c220a2495c7 100644 --- a/dlls/mshtml/htmlinput.c +++ b/dlls/mshtml/htmlinput.c @@ -1432,7 +1432,6 @@ static const NodeImplVtbl HTMLInputElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, @@ -1642,7 +1641,6 @@ static const NodeImplVtbl HTMLLabelElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, }; @@ -1979,7 +1977,6 @@ static const NodeImplVtbl HTMLButtonElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, diff --git a/dlls/mshtml/htmllink.c b/dlls/mshtml/htmllink.c index a491cabae02..124507a2fc9 100644 --- a/dlls/mshtml/htmllink.c +++ b/dlls/mshtml/htmllink.c @@ -426,7 +426,6 @@ static const NodeImplVtbl HTMLLinkElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, diff --git a/dlls/mshtml/htmlobject.c b/dlls/mshtml/htmlobject.c index 60746562692..9e30b5426fb 100644 --- a/dlls/mshtml/htmlobject.c +++ b/dlls/mshtml/htmlobject.c @@ -754,7 +754,6 @@ static const NodeImplVtbl HTMLObjectElementImplVtbl = { HTMLObjectElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, @@ -1030,7 +1029,6 @@ static const NodeImplVtbl HTMLEmbedElementImplVtbl = { HTMLEmbedElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col }; diff --git a/dlls/mshtml/htmlscript.c b/dlls/mshtml/htmlscript.c index e2ca3fb9b2a..2ef21fbfb0a 100644 --- a/dlls/mshtml/htmlscript.c +++ b/dlls/mshtml/htmlscript.c @@ -438,7 +438,6 @@ static const NodeImplVtbl HTMLScriptElementImplVtbl = { HTMLScriptElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c index c5610b41a1d..5b904c86d4b 100644 --- a/dlls/mshtml/htmlselect.c +++ b/dlls/mshtml/htmlselect.c @@ -396,7 +396,6 @@ static const NodeImplVtbl HTMLOptionElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, @@ -1473,7 +1472,6 @@ static const NodeImplVtbl HTMLSelectElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, diff --git a/dlls/mshtml/htmlstyleelem.c b/dlls/mshtml/htmlstyleelem.c index d0465d1495a..abd720cc18f 100644 --- a/dlls/mshtml/htmlstyleelem.c +++ b/dlls/mshtml/htmlstyleelem.c @@ -443,7 +443,6 @@ static const NodeImplVtbl HTMLStyleElementImplVtbl = { HTMLStyleElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, diff --git a/dlls/mshtml/htmltable.c b/dlls/mshtml/htmltable.c index df2cb92b8c9..1afb32ea6ec 100644 --- a/dlls/mshtml/htmltable.c +++ b/dlls/mshtml/htmltable.c @@ -499,7 +499,6 @@ static const NodeImplVtbl HTMLTableCellImplVtbl = { HTMLTableCell_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, @@ -946,7 +945,6 @@ static const NodeImplVtbl HTMLTableRowImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, @@ -1979,7 +1977,6 @@ static const NodeImplVtbl HTMLTableImplVtbl = { HTMLElement_destructor, HTMLTable_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, diff --git a/dlls/mshtml/htmltextarea.c b/dlls/mshtml/htmltextarea.c index 8e6f931c635..5820c0c7291 100644 --- a/dlls/mshtml/htmltextarea.c +++ b/dlls/mshtml/htmltextarea.c @@ -457,7 +457,6 @@ static const NodeImplVtbl HTMLTextAreaElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, HTMLElement_handle_event, HTMLElement_get_attr_col, NULL, diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index c19896e419e..6c550172d68 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -4001,7 +4001,6 @@ static const event_target_vtbl_t HTMLWindow_event_target_vtbl = { NULL, NULL, NULL, - NULL, HTMLWindow_set_current_event };
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 270f09b1f30..e2e10f91de1 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -804,7 +804,6 @@ typedef struct { void (*destructor)(HTMLDOMNode*); const cpc_entry_t *cpc_entries; HRESULT (*clone)(HTMLDOMNode*,nsIDOMNode*,HTMLDOMNode**); - HRESULT (*dispatch_nsevent_hook)(HTMLDOMNode*,DOMEvent*); HRESULT (*handle_event)(HTMLDOMNode*,DWORD,nsIDOMEvent*,BOOL*); HRESULT (*get_attr_col)(HTMLDOMNode*,HTMLAttributeCollection**); EventTarget *(*get_event_prop_target)(HTMLDOMNode*,int); @@ -1209,7 +1208,6 @@ HRESULT HTMLElement_QI(HTMLDOMNode*,REFIID,void**) DECLSPEC_HIDDEN; void HTMLElement_destructor(HTMLDOMNode*) DECLSPEC_HIDDEN; HRESULT HTMLElement_clone(HTMLDOMNode*,nsIDOMNode*,HTMLDOMNode**) DECLSPEC_HIDDEN; HRESULT HTMLElement_get_attr_col(HTMLDOMNode*,HTMLAttributeCollection**) DECLSPEC_HIDDEN; -HRESULT HTMLElement_dispatch_nsevent_hook(HTMLDOMNode*,DOMEvent*) DECLSPEC_HIDDEN; HRESULT HTMLElement_handle_event(HTMLDOMNode*,DWORD,nsIDOMEvent*,BOOL*) DECLSPEC_HIDDEN; void HTMLElement_init_dispex_info(dispex_data_t*,compat_mode_t) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index 177981acc25..90d4bc9e9bd 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -438,7 +438,6 @@ static nsresult handle_unload(HTMLDocumentNode *doc, nsIDOMEvent *nsevent)
static nsresult handle_htmlevent(HTMLDocumentNode *doc, nsIDOMEvent *nsevent) { - const event_target_vtbl_t *target_vtbl; nsIDOMEventTarget *event_target; EventTarget *target; nsIDOMNode *nsnode; @@ -487,15 +486,7 @@ static nsresult handle_htmlevent(HTMLDocumentNode *doc, nsIDOMEvent *nsevent) } }
- target_vtbl = dispex_get_vtbl(&target->dispex); - - if(target_vtbl && target_vtbl->dispatch_nsevent_hook && - target_vtbl->dispatch_nsevent_hook(&target->dispex, event) == S_OK) { - /* overridden by hook, so cancel it */ - nsIDOMEvent_StopPropagation(nsevent); - }else { - dispatch_event(target, event); - } + dispatch_event(target, event);
IDOMEvent_Release(&event->IDOMEvent_iface); IEventTarget_Release(&target->IEventTarget_iface); diff --git a/dlls/mshtml/svg.c b/dlls/mshtml/svg.c index 718a39a328c..b03ad073244 100644 --- a/dlls/mshtml/svg.c +++ b/dlls/mshtml/svg.c @@ -198,7 +198,6 @@ static const NodeImplVtbl SVGElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, NULL, HTMLElement_get_attr_col, }; @@ -740,7 +739,6 @@ static const NodeImplVtbl SVGSVGElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, NULL, HTMLElement_get_attr_col, }; @@ -910,7 +908,6 @@ static const NodeImplVtbl SVGCircleElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, NULL, HTMLElement_get_attr_col, }; @@ -1155,7 +1152,6 @@ static const NodeImplVtbl SVGTSpanElementImplVtbl = { HTMLElement_destructor, HTMLElement_cpc, HTMLElement_clone, - HTMLElement_dispatch_nsevent_hook, NULL, HTMLElement_get_attr_col, }; diff --git a/dlls/mshtml/tests/events.c b/dlls/mshtml/tests/events.c index 0975985f431..ee15ada69ef 100644 --- a/dlls/mshtml/tests/events.c +++ b/dlls/mshtml/tests/events.c @@ -155,7 +155,12 @@ static const char img_doc_ie9_str[] = "<body><img id="imgid"></img></body></html>";
static const char input_image_doc_str[] = - "<html><body><input type="image" id="inputid"></input></body></html>"; + "<html><head><meta http-equiv="x-ua-compatible" content="IE=8" /></head>" + "<body><input type="image" id="inputid"></input></body></html>"; + +static const char input_image_doc_ie9_str[] = + "<html><head><meta http-equiv="x-ua-compatible" content="IE=9" /></head>" + "<body><input type="image" id="inputid"></input></body></html>";
static const char link_doc_str[] = "<html><body><link id="linkid" rel="stylesheet" type="text/css"></link></body></html>"; @@ -1101,7 +1106,7 @@ static HRESULT WINAPI input_onload(IDispatchEx *iface, DISPID id, LCID lcid, WOR VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller) { CHECK_EXPECT(input_onload); - test_event_args(&DIID_DispHTMLInputElement, id, wFlags, pdp, pvarRes, pei, pspCaller); + test_event_args(document_mode < 9 ? &DIID_DispHTMLInputElement : NULL, id, wFlags, pdp, pvarRes, pei, pspCaller); test_event_src(L"INPUT"); return S_OK; } @@ -2419,7 +2424,6 @@ static void test_inputload(IHTMLDocument2 *doc)
elem = get_elem_id(doc, L"inputid"); hres = IHTMLElement_QueryInterface(elem, &IID_IHTMLInputElement, (void**)&input); - IHTMLElement_Release(elem); ok(hres == S_OK, "Could not get IHTMLInputElement iface: %08lx\n", hres);
V_VT(&v) = VT_EMPTY; @@ -2446,7 +2450,6 @@ static void test_inputload(IHTMLDocument2 *doc) str = SysAllocString(L"http://test.winehq.org/tests/winehq_snapshot/index_files/winehq_logo_text.pn..."); hres = IHTMLInputElement_put_src(input, str); ok(hres == S_OK, "put_src failed: %08lx\n", hres); - SysFreeString(str);
hres = IHTMLInputElement_get_complete(input, &b); ok(hres == S_OK, "get_complete failed: %08lx\n", hres); @@ -2460,7 +2463,40 @@ static void test_inputload(IHTMLDocument2 *doc) ok(hres == S_OK, "get_complete failed: %08lx\n", hres); ok(b == VARIANT_TRUE, "complete = %x\n", b);
+ /* cached images send synchronous load event in legacy modes */ + if(document_mode < 9) + SET_EXPECT(input_onload); + hres = IHTMLInputElement_put_src(input, str); + ok(hres == S_OK, "put_src failed: %08lx\n", hres); + if(document_mode < 9) { + CHECK_CALLED(input_onload); + pump_msgs(NULL); + }else { + SET_EXPECT(input_onload); + pump_msgs(&called_input_onload); + CHECK_CALLED(input_onload); + } + + if(document_mode < 9) + SET_EXPECT(input_onload); + V_VT(&v) = VT_BSTR; + V_BSTR(&v) = str; + str = SysAllocString(L"src"); + hres = IHTMLElement_setAttribute(elem, str, v, 0); + ok(hres == S_OK, "setAttribute failed: %08lx\n", hres); + SysFreeString(str); + VariantClear(&v); + if(document_mode < 9) { + CHECK_CALLED(input_onload); + pump_msgs(NULL); + }else { + SET_EXPECT(input_onload); + pump_msgs(&called_input_onload); + CHECK_CALLED(input_onload); + } + IHTMLInputElement_Release(input); + IHTMLElement_Release(elem); }
static void test_link_load(IHTMLDocument2 *doc) @@ -6306,6 +6342,7 @@ START_TEST(events) run_test_from_res(L"iframe.html", test_unload_event); run_test(empty_doc_ie9_str, test_create_event); run_test(img_doc_ie9_str, test_imgload); + run_test(input_image_doc_ie9_str, test_inputload); }
test_empty_document();
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 28 +++++++++++++++++++++++++--- dlls/mshtml/tests/es5.js | 13 +++++++++++++ dlls/mshtml/tests/xhr.js | 5 +++++ 3 files changed, 43 insertions(+), 3 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index bccdfb81121..d978b626be6 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -2583,6 +2583,7 @@ typedef struct { DOMEvent event; IDOMProgressEvent IDOMProgressEvent_iface; nsIDOMProgressEvent *nsevent; + BOOL manual_init; } DOMProgressEvent;
static inline DOMProgressEvent *impl_from_IDOMProgressEvent(IDOMProgressEvent *iface) @@ -2670,7 +2671,7 @@ static HRESULT WINAPI DOMProgressEvent_get_total(IDOMProgressEvent *iface, ULONG
TRACE("(%p)->(%p)\n", This, p);
- if(NS_FAILED(nsIDOMProgressEvent_GetLengthComputable(This->nsevent, &b)) || !b) { + if(!This->manual_init && (NS_FAILED(nsIDOMProgressEvent_GetLengthComputable(This->nsevent, &b)) || !b)) { *p = ~0; return S_OK; } @@ -2683,9 +2684,30 @@ static HRESULT WINAPI DOMProgressEvent_initProgressEvent(IDOMProgressEvent *ifac ULONGLONG loaded, ULONGLONG total) { DOMProgressEvent *This = impl_from_IDOMProgressEvent(iface); - FIXME("(%p)->(%s %x %x %x %s %s)\n", This, debugstr_w(type), can_bubble, cancelable, lengthComputable, + nsAString type_str; + nsresult nsres; + HRESULT hres; + + TRACE("(%p)->(%s %x %x %x %s %s)\n", This, debugstr_w(type), can_bubble, cancelable, lengthComputable, wine_dbgstr_longlong(loaded), wine_dbgstr_longlong(total)); - return E_NOTIMPL; + + if(This->event.target) { + TRACE("called on already dispatched event\n"); + return S_OK; + } + + hres = IDOMEvent_initEvent(&This->event.IDOMEvent_iface, type, can_bubble, cancelable); + if(SUCCEEDED(hres)) { + nsAString_InitDepend(&type_str, type); + nsres = nsIDOMProgressEvent_InitProgressEvent(This->nsevent, &type_str, !!can_bubble, !!cancelable, + !!lengthComputable, loaded, total); + nsAString_Finish(&type_str); + if(NS_FAILED(nsres)) + return map_nsresult(nsres); + This->manual_init = TRUE; + } + + return hres; }
static const IDOMProgressEventVtbl DOMProgressEventVtbl = { diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index e13ad055f4f..b2f63c77c83 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -2095,3 +2095,16 @@ sync_test("matchMedia", function() { mql = window.matchMedia("(max-width: 1000px)"); ok(mql.matches === true, "(max-width: 1000px) does not match"); }); + +sync_test("initProgressEvent", function() { + var e = document.createEvent("ProgressEvent"); + e.initProgressEvent("loadend", false, false, true, 13, 42); + ok(e.lengthComputable === true, "lengthComputable = " + e.lengthComputable); + ok(e.loaded === 13, "loaded = " + e.loaded); + ok(e.total === 42, "total = " + e.total); + + e.initProgressEvent("loadstart", false, false, false, 99, 50); + ok(e.lengthComputable === false, "lengthComputable after re-init = " + e.lengthComputable); + ok(e.loaded === 99, "loaded after re-init = " + e.loaded); + ok(e.total === 50, "total after re-init = " + e.total); +}); diff --git a/dlls/mshtml/tests/xhr.js b/dlls/mshtml/tests/xhr.js index 2deb526cfe1..336f03c1b2f 100644 --- a/dlls/mshtml/tests/xhr.js +++ b/dlls/mshtml/tests/xhr.js @@ -319,6 +319,11 @@ function test_timeout() { ok(e.lengthComputable === false, "lengthComputable = " + e.lengthComputable); ok(e.loaded === 0, "loaded = " + e.loaded); ok(e.total === 18446744073709552000, "total = " + e.total); + + e.initProgressEvent("timeout", false, false, true, 13, 42); + ok(e.lengthComputable === false, "lengthComputable after initProgressEvent = " + e.lengthComputable); + ok(e.loaded === 0, "loaded after initProgressEvent = " + e.loaded); + ok(e.total === 18446744073709552000, "total after initProgressEvent = " + e.total); } next_test(); }
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlevent.c | 2 +- dlls/mshtml/mshtml_private.h | 1 + dlls/mshtml/nsiface.idl | 10 +++ dlls/mshtml/omnavigator.c | 133 ++++++++++++++++++++++++++++++++++- dlls/mshtml/tests/es5.js | 43 ++++++++++- dlls/mshtml/tests/script.c | 31 ++++++++ 6 files changed, 216 insertions(+), 4 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c index d978b626be6..92daa60ff11 100644 --- a/dlls/mshtml/htmlevent.c +++ b/dlls/mshtml/htmlevent.c @@ -3337,7 +3337,7 @@ HRESULT create_storage_event(HTMLDocumentNode *doc, BSTR key, BSTR old_value, BS return S_OK; }
-static HRESULT call_disp_func(IDispatch *disp, DISPPARAMS *dp, VARIANT *retv) +HRESULT call_disp_func(IDispatch *disp, DISPPARAMS *dp, VARIANT *retv) { IDispatchEx *dispex; EXCEPINFO ei; diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index e2e10f91de1..8a14d2ee47f 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -1055,6 +1055,7 @@ void init_node_cc(void) DECLSPEC_HIDDEN;
HRESULT nsuri_to_url(LPCWSTR,BOOL,BSTR*) DECLSPEC_HIDDEN;
+HRESULT call_disp_func(IDispatch*,DISPPARAMS*,VARIANT*) DECLSPEC_HIDDEN; void call_property_onchanged(ConnectionPointContainer*,DISPID) DECLSPEC_HIDDEN; HRESULT call_set_active_object(IOleInPlaceUIWindow*,IOleInPlaceActiveObject*) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl index 8ad5e871e21..5991e0de45b 100644 --- a/dlls/mshtml/nsiface.idl +++ b/dlls/mshtml/nsiface.idl @@ -923,6 +923,16 @@ interface nsIDOMMediaQueryList : nsISupports nsresult SetListener(nsIDOMMediaQueryListListener *listener); }
+[ + object, + uuid(279a5cbd-5c15-475d-847b-e0de1624eb77), + local +] +interface nsIDOMMediaQueryListListener : nsISupports +{ + nsresult HandleChange(nsIDOMMediaQueryList *mql); +} + [ object, uuid(450cf0ba-de90-4f86-85bf-e10cc8b8713f), diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index c2a580ceeb3..670dd181bce 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -2651,11 +2651,25 @@ void create_console(compat_mode_t compat_mode, IWineMSHTMLConsole **ret) *ret = &obj->IWineMSHTMLConsole_iface; }
+struct media_query_list_listener { + struct list entry; + IDispatch *function; +}; + +struct media_query_list_callback; struct media_query_list { DispatchEx dispex; IWineMSHTMLMediaQueryList IWineMSHTMLMediaQueryList_iface; LONG ref; nsIDOMMediaQueryList *nsquerylist; + struct media_query_list_callback *callback; + struct list listeners; +}; + +struct media_query_list_callback { + nsIDOMMediaQueryListListener nsIDOMMediaQueryListListener_iface; + struct media_query_list *media_query_list; + LONG ref; };
static inline struct media_query_list *impl_from_IWineMSHTMLMediaQueryList(IWineMSHTMLMediaQueryList *iface) @@ -2696,10 +2710,17 @@ static ULONG WINAPI media_query_list_Release(IWineMSHTMLMediaQueryList *iface) { struct media_query_list *media_query_list = impl_from_IWineMSHTMLMediaQueryList(iface); LONG ref = InterlockedDecrement(&media_query_list->ref); + struct media_query_list_listener *listener, *listener2;
TRACE("(%p) ref=%ld\n", media_query_list, ref);
if(!ref) { + LIST_FOR_EACH_ENTRY_SAFE(listener, listener2, &media_query_list->listeners, struct media_query_list_listener, entry) { + IDispatch_Release(listener->function); + free(listener); + } + media_query_list->callback->media_query_list = NULL; + nsIDOMMediaQueryListListener_Release(&media_query_list->callback->nsIDOMMediaQueryListListener_iface); nsIDOMMediaQueryList_Release(media_query_list->nsquerylist); release_dispex(&media_query_list->dispex); free(media_query_list); @@ -2773,10 +2794,24 @@ static HRESULT WINAPI media_query_list_get_matches(IWineMSHTMLMediaQueryList *if static HRESULT WINAPI media_query_list_addListener(IWineMSHTMLMediaQueryList *iface, VARIANT *listener) { struct media_query_list *media_query_list = impl_from_IWineMSHTMLMediaQueryList(iface); + struct media_query_list_listener *entry;
- FIXME("(%p)->(%s)\n", media_query_list, debugstr_variant(listener)); + TRACE("(%p)->(%s)\n", media_query_list, debugstr_variant(listener));
- return E_NOTIMPL; + if(V_VT(listener) != VT_DISPATCH || !V_DISPATCH(listener)) + return S_OK; + + LIST_FOR_EACH_ENTRY(entry, &media_query_list->listeners, struct media_query_list_listener, entry) + if(entry->function == V_DISPATCH(listener)) + return S_OK; + + if(!(entry = malloc(sizeof(*entry)))) + return E_OUTOFMEMORY; + entry->function = V_DISPATCH(listener); + IDispatch_AddRef(V_DISPATCH(listener)); + + list_add_tail(&media_query_list->listeners, &entry->entry); + return S_OK; }
static HRESULT WINAPI media_query_list_removeListener(IWineMSHTMLMediaQueryList *iface, VARIANT *listener) @@ -2802,6 +2837,87 @@ static const IWineMSHTMLMediaQueryListVtbl media_query_list_vtbl = { media_query_list_removeListener };
+static inline struct media_query_list_callback *impl_from_nsIDOMMediaQueryListListener(nsIDOMMediaQueryListListener *iface) +{ + return CONTAINING_RECORD(iface, struct media_query_list_callback, nsIDOMMediaQueryListListener_iface); +} + +static nsresult NSAPI media_query_list_callback_QueryInterface(nsIDOMMediaQueryListListener *iface, + nsIIDRef riid, void **result) +{ + struct media_query_list_callback *callback = impl_from_nsIDOMMediaQueryListListener(iface); + + if(IsEqualGUID(&IID_nsISupports, riid) || IsEqualGUID(&IID_nsIDOMMediaQueryListListener, riid)) { + *result = &callback->nsIDOMMediaQueryListListener_iface; + }else { + *result = NULL; + return NS_NOINTERFACE; + } + + nsIDOMMediaQueryListListener_AddRef(&callback->nsIDOMMediaQueryListListener_iface); + return NS_OK; +} + +static nsrefcnt NSAPI media_query_list_callback_AddRef(nsIDOMMediaQueryListListener *iface) +{ + struct media_query_list_callback *callback = impl_from_nsIDOMMediaQueryListListener(iface); + LONG ref = InterlockedIncrement(&callback->ref); + + TRACE("(%p) ref=%ld\n", callback, ref); + + return ref; +} + +static nsrefcnt NSAPI media_query_list_callback_Release(nsIDOMMediaQueryListListener *iface) +{ + struct media_query_list_callback *callback = impl_from_nsIDOMMediaQueryListListener(iface); + LONG ref = InterlockedDecrement(&callback->ref); + + TRACE("(%p) ref=%ld\n", callback, ref); + + if(!ref) + free(callback); + return ref; +} + +static nsresult NSAPI media_query_list_callback_HandleChange(nsIDOMMediaQueryListListener *iface, nsIDOMMediaQueryList *mql) +{ + struct media_query_list_callback *callback = impl_from_nsIDOMMediaQueryListListener(iface); + struct media_query_list *media_query_list = callback->media_query_list; + struct media_query_list_listener *listener; + VARIANT args[1], v; + HRESULT hres; + + if(!media_query_list) + return NS_OK; + + LIST_FOR_EACH_ENTRY(listener, &media_query_list->listeners, struct media_query_list_listener, entry) { + DISPPARAMS dp = { args, NULL, 1, 0 }; + + V_VT(args) = VT_DISPATCH; + V_DISPATCH(args) = (IDispatch*)&media_query_list->dispex.IDispatchEx_iface; + V_VT(&v) = VT_EMPTY; + + TRACE("%p >>>\n", media_query_list); + hres = call_disp_func(listener->function, &dp, &v); + if(hres == S_OK) { + TRACE("%p <<< %s\n", media_query_list, debugstr_variant(&v)); + VariantClear(&v); + }else { + WARN("%p <<< %08lx\n", media_query_list, hres); + } + } + + return NS_OK; +} + +static const nsIDOMMediaQueryListListenerVtbl media_query_list_callback_vtbl = { + media_query_list_callback_QueryInterface, + media_query_list_callback_AddRef, + media_query_list_callback_Release, + media_query_list_callback_HandleChange +}; + static const tid_t media_query_list_iface_tids[] = { IWineMSHTMLMediaQueryList_tid, 0 @@ -2826,10 +2942,19 @@ HRESULT create_media_query_list(HTMLWindow *window, BSTR media_query, IDispatch if(!(media_query_list = malloc(sizeof(*media_query_list)))) return E_OUTOFMEMORY;
+ if(!(media_query_list->callback = malloc(sizeof(*media_query_list->callback)))) { + free(media_query_list); + return E_OUTOFMEMORY; + } + media_query_list->callback->nsIDOMMediaQueryListListener_iface.lpVtbl = &media_query_list_callback_vtbl; + media_query_list->callback->media_query_list = media_query_list; + media_query_list->callback->ref = 1; + nsAString_InitDepend(&nsstr, media_query); nsres = nsIDOMWindow_MatchMedia(window->outer_window->nswindow, &nsstr, &nsunk); nsAString_Finish(&nsstr); if(NS_FAILED(nsres)) { + free(media_query_list->callback); free(media_query_list); return map_nsresult(nsres); } @@ -2837,8 +2962,12 @@ HRESULT create_media_query_list(HTMLWindow *window, BSTR media_query, IDispatch assert(NS_SUCCEEDED(nsres)); nsISupports_Release(nsunk);
+ nsres = nsIDOMMediaQueryList_SetListener(media_query_list->nsquerylist, &media_query_list->callback->nsIDOMMediaQueryListListener_iface); + assert(NS_SUCCEEDED(nsres)); + media_query_list->IWineMSHTMLMediaQueryList_iface.lpVtbl = &media_query_list_vtbl; media_query_list->ref = 1; + list_init(&media_query_list->listeners); init_dispatch(&media_query_list->dispex, (IUnknown*)&media_query_list->IWineMSHTMLMediaQueryList_iface, &media_query_list_dispex, dispex_compat_mode(&window->inner_window->event_target.dispex));
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index b2f63c77c83..6d045e54781 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -2072,7 +2072,7 @@ sync_test("console", function() { });
sync_test("matchMedia", function() { - var i, r, mql; + var i, r, mql, event_fired, event2_fired;
try { mql = window.matchMedia(""); @@ -2094,6 +2094,47 @@ sync_test("matchMedia", function() { } mql = window.matchMedia("(max-width: 1000px)"); ok(mql.matches === true, "(max-width: 1000px) does not match"); + mql = window.matchMedia("(max-width: 50px)"); + ok(mql.matches === false, "(max-width: 50px) matches"); + + ok(!("addEventListener" in mql), "addEventListener in MediaQueryList"); + ok(!("removeEventListener" in mql), "removeEventListener in MediaQueryList"); + r = mql.addListener(null); + ok(r === undefined, "addListener with null returned " + r); + r = mql.addListener("function() { ok(false, 'string handler called'); }"); + ok(r === undefined, "addListener with string returned " + r); + + external.setViewSize(20, 20); + ok(mql.matches === true, "(max-width: 50px) does not match on a 20x20 view"); + + var handler = function(e) { + ok(this === window, "handler this = " + this); + ok(e === mql, "handler argument = " + e); + event_fired = true; + ok(event2_fired !== true, "second handler fired before first"); + } + var handler2 = function(e) { + ok(this === window, "handler2 this = " + this); + ok(e === mql, "handler2 argument = " + e); + event2_fired = true; + } + r = mql.addListener(handler); + ok(r === undefined, "addListener with function returned " + r); + external.setViewSize(120, 120); + ok(mql.matches === false, "(max-width: 50px) matches on a 120x120 view"); + ok(event_fired === true, "event not fired after changing from 20x20 to 120x120 view"); + + event_fired = false; + mql.addListener(null); + mql.addListener("function() { ok(false, 'second string handler called'); }"); + mql.addListener(handler2); + external.setViewSize(30, 30); + ok(mql.matches === true, "(max-width: 50px) does not match on a 30x30 view"); + ok(event_fired === true, "event not fired after changing from 120x120 to 30x30 view"); + ok(event2_fired === true, "event not fired from second handler after changing from 120x120 to 30x30 view"); + + event2_fired = false; + external.setViewSize(300, 300); });
sync_test("initProgressEvent", function() { diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c index cd27a05e397..cb4fe5d9213 100644 --- a/dlls/mshtml/tests/script.c +++ b/dlls/mshtml/tests/script.c @@ -170,6 +170,7 @@ DEFINE_EXPECT(GetTypeInfo); #define DISPID_EXTERNAL_TEST_VARS 0x30000B #define DISPID_EXTERNAL_TESTHOSTCTX 0x30000C #define DISPID_EXTERNAL_GETMIMETYPE 0x30000D +#define DISPID_EXTERNAL_SETVIEWSIZE 0x30000E
static const GUID CLSID_TestScript[] = { {0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x07,0x46}}, @@ -897,6 +898,10 @@ static HRESULT WINAPI externalDisp_GetDispID(IDispatchEx *iface, BSTR bstrName, *pid = DISPID_EXTERNAL_GETMIMETYPE; return S_OK; } + if(!lstrcmpW(bstrName, L"setViewSize")) { + *pid = DISPID_EXTERNAL_SETVIEWSIZE; + return S_OK; + }
ok(0, "unexpected name %s\n", wine_dbgstr_w(bstrName)); return DISP_E_UNKNOWNNAME; @@ -1158,6 +1163,32 @@ static HRESULT WINAPI externalDisp_InvokeEx(IDispatchEx *iface, DISPID id, LCID V_VT(pvarRes) = V_BSTR(pvarRes) ? VT_BSTR : VT_NULL; return S_OK;
+ case DISPID_EXTERNAL_SETVIEWSIZE: { + RECT rect = { 0 }; + HRESULT hres; + + ok(pdp != NULL, "pdp == NULL\n"); + ok(pdp->rgvarg != NULL, "rgvarg == NULL\n"); + ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n"); + ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs); + ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs); + ok(pei != NULL, "pei == NULL\n"); + ok(V_VT(&pdp->rgvarg[1]) == VT_I4, "width VT = %d\n", V_VT(&pdp->rgvarg[1])); + ok(V_VT(&pdp->rgvarg[0]) == VT_I4, "height VT = %d\n", V_VT(&pdp->rgvarg[0])); + + rect.right = V_I4(&pdp->rgvarg[1]); + rect.bottom = V_I4(&pdp->rgvarg[0]); + hres = IOleDocumentView_SetRect(view, &rect); + if(SUCCEEDED(hres) && broken(1) /* FIXME: native processes it on WM_TIMER */) { + MSG msg; + do { + if(GetMessageA(&msg, NULL, 0, 0) <= 0) break; + TranslateMessage(&msg); DispatchMessageA(&msg); + } while(msg.message != WM_TIMER); + } + return hres; + } + default: ok(0, "unexpected call\n"); return E_NOTIMPL;
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/omnavigator.c | 17 +++++++++++++++-- dlls/mshtml/tests/es5.js | 11 +++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c index 670dd181bce..1c6d3dc4a74 100644 --- a/dlls/mshtml/omnavigator.c +++ b/dlls/mshtml/omnavigator.c @@ -2817,10 +2817,23 @@ static HRESULT WINAPI media_query_list_addListener(IWineMSHTMLMediaQueryList *if static HRESULT WINAPI media_query_list_removeListener(IWineMSHTMLMediaQueryList *iface, VARIANT *listener) { struct media_query_list *media_query_list = impl_from_IWineMSHTMLMediaQueryList(iface); + struct media_query_list_listener *entry;
- FIXME("(%p)->(%s)\n", media_query_list, debugstr_variant(listener)); + TRACE("(%p)->(%s)\n", media_query_list, debugstr_variant(listener));
- return E_NOTIMPL; + if(V_VT(listener) != VT_DISPATCH || !V_DISPATCH(listener)) + return S_OK; + + LIST_FOR_EACH_ENTRY(entry, &media_query_list->listeners, struct media_query_list_listener, entry) { + if(entry->function == V_DISPATCH(listener)) { + list_remove(&entry->entry); + IDispatch_Release(entry->function); + free(entry); + break; + } + } + + return S_OK; }
static const IWineMSHTMLMediaQueryListVtbl media_query_list_vtbl = { diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js index 6d045e54781..6b727b9eeb7 100644 --- a/dlls/mshtml/tests/es5.js +++ b/dlls/mshtml/tests/es5.js @@ -2101,12 +2101,17 @@ sync_test("matchMedia", function() { ok(!("removeEventListener" in mql), "removeEventListener in MediaQueryList"); r = mql.addListener(null); ok(r === undefined, "addListener with null returned " + r); + r = mql.removeListener(null); + ok(r === undefined, "removeListener with null returned " + r); r = mql.addListener("function() { ok(false, 'string handler called'); }"); ok(r === undefined, "addListener with string returned " + r);
external.setViewSize(20, 20); ok(mql.matches === true, "(max-width: 50px) does not match on a 20x20 view");
+ r = mql.removeListener("function() { ok(false, 'string handler called'); }"); + ok(r === undefined, "removeListener with string returned " + r); + var handler = function(e) { ok(this === window, "handler this = " + this); ok(e === mql, "handler argument = " + e); @@ -2133,8 +2138,14 @@ sync_test("matchMedia", function() { ok(event_fired === true, "event not fired after changing from 120x120 to 30x30 view"); ok(event2_fired === true, "event not fired from second handler after changing from 120x120 to 30x30 view");
+ r = mql.removeListener(handler); + ok(r === undefined, "removeListener with function returned " + r); + event_fired = false; event2_fired = false; external.setViewSize(300, 300); + ok(mql.matches === false, "(max-width: 50px) matches on a 300x300 view"); + ok(event_fired === false, "removed event handler fired after changing from 30x30 to 300x300 view"); + ok(event2_fired === true, "event not fired from second handler after changing from 30x30 to 300x300 view"); });
sync_test("initProgressEvent", function() {
From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com ---
These are todo_wine because gecko doesn't return them exactly as native. First, it adds some stuff around the url, like: `transparent url(...) repeat scroll 0% 0%`.
It also doesn't escape the opening parentheses like native does (to `%28`), and escapes `\t` and `\n` to `\9 ` and `\a ` respectively when retrieved. Also backslashes seem to be kept when retrieved *exactly* as when they were input on native, but not with Gecko. This is seemingly done in AppendEscapedCSSIdent, but seems hard to fix for this case. I'm not sure if that's worth replicating in practice...
The thing is that even if we consumed backslashes normally (without escaping), Gecko would return *escaped* backslashes, so it would still not match native! For example the raw string `a\b` (3 characters) is returned as `a\b` by native IE, but `ab` with the current patch (because escaping `b` does nothing), and would be `a\b` if we didn't treat backslashes specially.
Also, I tried to test url() for `cursor` or `border` but url() in them doesn't seem to be supported on native IE in old modes (the latter even gives E_INVALIDARG). Not sure if that's worth replicating either. --- dlls/mshtml/tests/style.c | 49 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+)
diff --git a/dlls/mshtml/tests/style.c b/dlls/mshtml/tests/style.c index 4b72d144354..5d6f9842f81 100644 --- a/dlls/mshtml/tests/style.c +++ b/dlls/mshtml/tests/style.c @@ -323,6 +323,17 @@ static void test_set_csstext(IHTMLStyle *style) ok(!lstrcmpW(V_BSTR(&v), L"black"), "str=%s\n", wine_dbgstr_w(V_BSTR(&v))); VariantClear(&v);
+ test_style_set_csstext(style, L"background: url(http://test.winehq.org/i m\ta\g\\e\n((\(.png);"); + + hres = IHTMLStyle_get_background(style, &str); + ok(hres == S_OK, "get_background failed: %08lx\n", hres); + if(compat_mode < COMPAT_IE9) + todo_wine + ok(!lstrcmpW(str, L"url(http://test.winehq.org/i m\ta\g\\e\n%28%28\%28.png)"), "background = %s\n", wine_dbgstr_w(str)); + else + ok(!str, "background = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + hres = IHTMLStyle_QueryInterface(style, &IID_IHTMLCSSStyleDeclaration, (void**)&css_style); ok(hres == S_OK || broken(!is_ie9plus && hres == E_NOINTERFACE), "Could not get IHTMLCSSStyleDeclaration interface: %08lx\n", hres); @@ -2862,6 +2873,44 @@ static void test_body_style(IHTMLStyle *style) SysFreeString(str); }
+ /* background */ + hres = IHTMLStyle_get_background(style, &sDefault); + ok(hres == S_OK, "get_background failed: %08lx\n", hres); + + str = SysAllocString(L"url("http://test.winehq.org/tests/winehq_snapshot/%5C")"); + hres = IHTMLStyle_put_background(style, str); + ok(hres == S_OK, "put_background failed: %08lx\n", hres); + SysFreeString(str); + + hres = IHTMLStyle_get_background(style, &str); + ok(hres == S_OK, "get_background failed: %08lx\n", hres); + if(compat_mode < COMPAT_IE9) + todo_wine + ok(!lstrcmpW(str, L"url(http://test.winehq.org/tests/winehq_snapshot/)"), "background = %s\n", wine_dbgstr_w(str)); + else + todo_wine + ok(!lstrcmpW(str, L"url("http://test.winehq.org/tests/winehq_snapshot/%5C")"), "background = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + str = SysAllocString(L"url(http://test.winehq.org/i m\ta\g\\e\n((\(.png)"); + hres = IHTMLStyle_put_background(style, str); + ok(hres == S_OK, "put_background failed: %08lx\n", hres); + SysFreeString(str); + + hres = IHTMLStyle_get_background(style, &str); + ok(hres == S_OK, "get_background failed: %08lx\n", hres); + if(compat_mode < COMPAT_IE9) + todo_wine + ok(!lstrcmpW(str, L"url(http://test.winehq.org/i m\ta\g\\e\n%28%28\%28.png)"), "background = %s\n", wine_dbgstr_w(str)); + else + todo_wine + ok(!lstrcmpW(str, L"url("http://test.winehq.org/tests/winehq_snapshot/%5C")"), "background = %s\n", wine_dbgstr_w(str)); + SysFreeString(str); + + hres = IHTMLStyle_put_background(style, sDefault); + ok(hres == S_OK, "put_background failed: %08lx\n", hres); + SysFreeString(sDefault); + /* borderTopWidth */ hres = IHTMLStyle_get_borderTopWidth(style, &vDefault); ok(hres == S_OK, "get_borderTopWidth: %08lx\n", hres);
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 tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details:
The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=131788
Your paranoid android.
=== w1064v1507 (32 bit report) ===
mshtml: script.c:937: Test failed: L"/index.html?es5.js:matchMedia: (max-width: 50px) matches on a 120x120 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired after changing from 20x20 to 120x120 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired after changing from 120x120 to 30x30 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired from second handler after changing from 120x120 to 30x30 view"
=== w1064v1809 (64 bit report) ===
mshtml: script.c:937: Test failed: L"/index.html?es5.js:matchMedia: (max-width: 50px) does not match on a 20x20 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired after changing from 20x20 to 120x120 view"
=== w1064_tsign (64 bit report) ===
mshtml: script.c:937: Test failed: L"/index.html?es5.js:matchMedia: (max-width: 50px) does not match on a 30x30 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired after changing from 120x120 to 30x30 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired from second handler after changing from 120x120 to 30x30 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired from second handler after changing from 30x30 to 300x300 view"
=== w10pro64 (64 bit report) ===
mshtml: script.c:937: Test failed: L"/index.html?es5.js:matchMedia: (max-width: 50px) matches on a 300x300 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired from second handler after changing from 30x30 to 300x300 view"
On Tue Apr 11 16:51:28 2023 +0000, **** wrote:
Marvin replied on the mailing list:
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 tests also ran into some preexisting test failures. If you know how to fix them that would be helpful. See the TestBot job for the details: The full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=131788 Your paranoid android. === w1064v1507 (32 bit report) === mshtml: script.c:937: Test failed: L"/index.html?es5.js:matchMedia: (max-width: 50px) matches on a 120x120 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired after changing from 20x20 to 120x120 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired after changing from 120x120 to 30x30 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired from second handler after changing from 120x120 to 30x30 view" === w1064v1809 (64 bit report) === mshtml: script.c:937: Test failed: L"/index.html?es5.js:matchMedia: (max-width: 50px) does not match on a 20x20 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired after changing from 20x20 to 120x120 view" === w1064_tsign (64 bit report) === mshtml: script.c:937: Test failed: L"/index.html?es5.js:matchMedia: (max-width: 50px) does not match on a 30x30 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired after changing from 120x120 to 30x30 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired from second handler after changing from 120x120 to 30x30 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired from second handler after changing from 30x30 to 300x300 view" === w10pro64 (64 bit report) === mshtml: script.c:937: Test failed: L"/index.html?es5.js:matchMedia: (max-width: 50px) matches on a 300x300 view" script.c:937: Test failed: L"/index.html?es5.js:matchMedia: event not fired from second handler after changing from 30x30 to 300x300 view"
Well clearly the WM_TIMER thing isn't super reliable, any suggestions?
On Tue Apr 11 17:35:38 2023 +0000, Gabriel Ivăncescu wrote:
Well clearly the WM_TIMER thing isn't super reliable, any suggestions?
One way would be to pump messages until you get the desired event, but getting rid of message loop in DISPID_EXTERNAL_SETVIEWSIZE seems even better. You could just treat them like we treat all other async events in JS.
Also, moving it to a separate MR would be nice, this one already does a number of unrelated things.
These are todo_wine because gecko doesn't return them exactly as
native. First, it adds some stuff around the url, like: `transparent url(...) repeat scroll 0% 0%`.
It would still be nice to have a test that passes now, showing the difference. You could just use wcsstr, for example.