Module: wine Branch: master Commit: e610d2ff12fbb52ecd0fd17a4ade034de9b22d2d URL: http://source.winehq.org/git/wine.git/?a=commit;h=e610d2ff12fbb52ecd0fd17a4a...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Apr 23 16:43:50 2008 +0200
mshtml: Added IHTMLDocument3::getElementById implementation.
---
dlls/mshtml/htmldoc3.c | 33 +++++++++++++++++++++++++++++++-- dlls/mshtml/tests/dom.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmldoc3.c b/dlls/mshtml/htmldoc3.c index 3b109e9..4fbd131 100644 --- a/dlls/mshtml/htmldoc3.c +++ b/dlls/mshtml/htmldoc3.c @@ -407,8 +407,37 @@ static HRESULT WINAPI HTMLDocument3_getElementById(IHTMLDocument3 *iface, BSTR v IHTMLElement **pel) { HTMLDocument *This = HTMLDOC3_THIS(iface); - FIXME("(%p)->(%s %p)\n", This, debugstr_w(v), pel); - return E_NOTIMPL; + nsIDOMDocument *nsdoc = NULL; + nsIDOMElement *nselem = NULL; + HTMLDOMNode *node; + nsAString id_str; + nsresult nsres; + + TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pel); + + *pel = NULL; + + if(!This->nscontainer) + return S_OK; + + nsres = nsIWebNavigation_GetDocument(This->nscontainer->navigation, &nsdoc); + if(NS_FAILED(nsres) || !nsdoc) + return S_OK; + + nsAString_Init(&id_str, v); + nsIDOMDocument_GetElementById(nsdoc, &id_str, &nselem); + nsIDOMDocument_Release(nsdoc); + nsAString_Finish(&id_str); + + if(!nselem) { + *pel = NULL; + return S_OK; + } + + node = get_node(This, (nsIDOMNode*)nselem, TRUE); + nsIDOMElement_Release(nselem); + + return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node), &IID_IHTMLElement, (void**)pel); }
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 59c2a17..ae716d9 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -777,6 +777,26 @@ static IHTMLElement *get_elem_by_id(IHTMLDocument2 *doc, LPCWSTR id, BOOL expect return elem; }
+static IHTMLElement *get_doc_elem_by_id(IHTMLDocument2 *doc, LPCWSTR id) +{ + IHTMLDocument3 *doc3; + IHTMLElement *elem; + BSTR tmp; + HRESULT hres; + + hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument3, (void**)&doc3); + ok(hres == S_OK, "Could not get IHTMLDocument3 iface: %08x\n", hres); + + tmp = SysAllocString(id); + hres = IHTMLDocument3_getElementById(doc3, tmp, &elem); + SysFreeString(tmp); + ok(hres == S_OK, "getElementById(%s) failed: %08x\n", dbgstr_w(id), hres); + + IHTMLDocument3_Release(doc3); + + return elem; +} + static void test_select_elem(IHTMLSelectElement *select) { test_select_length(select, 2); @@ -1357,6 +1377,15 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLElementCollection_Release(col);
get_elem_by_id(doc, xxxW, FALSE); + elem = get_doc_elem_by_id(doc, xxxW); + ok(!elem, "elem != NULL\n"); + + elem = get_doc_elem_by_id(doc, sW); + ok(elem != NULL, "elem == NULL\n"); + test_elem_type((IUnknown*)elem, ET_SELECT); + if(elem) + IHTMLElement_Release(elem); + elem = get_elem_by_id(doc, sW, TRUE); if(elem) { IHTMLSelectElement *select;