From 394347945c44f18e37f70f1d7825e2adca332048 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Thu, 28 Mar 2019 15:56:06 +0100 Subject: [PATCH] mshtml: Add IElementSelector::querySelector implementation. Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/mshtml/htmlelem.c | 35 +++++++++++++++++++++++++++++++++-- dlls/mshtml/tests/elements.js | 6 ++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index da7b6cfaa61..c628a181486 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -5182,8 +5182,39 @@ static HRESULT WINAPI ElementSelector_Invoke(IElementSelector *iface, DISPID dis static HRESULT WINAPI ElementSelector_querySelector(IElementSelector *iface, BSTR v, IHTMLElement **pel) { HTMLElement *This = impl_from_IElementSelector(iface); - FIXME("(%p)->(%s %p)\n", This, debugstr_w(v), pel); - return E_NOTIMPL; + nsIDOMElement *nselem; + HTMLElement *elem; + nsAString nsstr; + nsresult nsres; + HRESULT hres; + + TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pel); + + if(!This->dom_element) { + FIXME("comment element\n"); + return E_NOTIMPL; + } + + nsAString_InitDepend(&nsstr, v); + nsres = nsIDOMElement_QuerySelector(This->dom_element, &nsstr, &nselem); + nsAString_Finish(&nsstr); + if(NS_FAILED(nsres)) { + ERR("QuerySelector failed: %08x\n", nsres); + return E_FAIL; + } + + if(!nselem) { + *pel = NULL; + return S_OK; + } + + hres = get_element(nselem, &elem); + nsIDOMElement_Release(nselem); + if(FAILED(hres)) + return hres; + + *pel = &elem->IHTMLElement_iface; + return S_OK; } static HRESULT WINAPI ElementSelector_querySelectorAll(IElementSelector *iface, BSTR v, IHTMLDOMChildrenCollection **pel) diff --git a/dlls/mshtml/tests/elements.js b/dlls/mshtml/tests/elements.js index 7bf5c241829..9645c0b3254 100644 --- a/dlls/mshtml/tests/elements.js +++ b/dlls/mshtml/tests/elements.js @@ -200,12 +200,18 @@ function test_query_selector() { var e = document.querySelector("nomatch"); ok(e === null, "e = " + e); + e = document.body.querySelector("nomatch"); + ok(e === null, "e = " + e); e = document.querySelector(".class1"); ok(e.tagName === "DIV", "e.tagName = " + e.tagName); + e = document.body.querySelector(".class1"); + ok(e.tagName === "DIV", "e.tagName = " + e.tagName); e = document.querySelector("a"); ok(e.tagName === "A", "e.tagName = " + e.tagName); + e = document.body.querySelector("a"); + ok(e.tagName === "A", "e.tagName = " + e.tagName); next_test(); }