Jacek Caban : mshtml: Added IHTMLDocument2::elementFromPoint implementation .

Alexandre Julliard julliard at winehq.org
Tue Oct 18 12:56:29 CDT 2011


Module: wine
Branch: master
Commit: 3c4b2a0b43a13166711bfe26674550d79849b7db
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=3c4b2a0b43a13166711bfe26674550d79849b7db

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Oct 18 15:07:50 2011 +0200

mshtml: Added IHTMLDocument2::elementFromPoint implementation.

---

 dlls/mshtml/htmldoc.c       |   34 ++++++++++++++++++++++++++++++++--
 dlls/mshtml/tests/htmldoc.c |   22 ++++++++++++++++++++--
 2 files changed, 52 insertions(+), 4 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 9af5c8f..9ab287d 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -1297,8 +1297,38 @@ static HRESULT WINAPI HTMLDocument_elementFromPoint(IHTMLDocument2 *iface, LONG
                                                         IHTMLElement **elementHit)
 {
     HTMLDocument *This = impl_from_IHTMLDocument2(iface);
-    FIXME("(%p)->(%d %d %p)\n", This, x, y, elementHit);
-    return E_NOTIMPL;
+    nsIDOMNSDocument *nsdoc;
+    nsIDOMElement *nselem;
+    HTMLDOMNode *node;
+    nsresult nsres;
+    HRESULT hres;
+
+    TRACE("(%p)->(%d %d %p)\n", This, x, y, elementHit);
+
+    nsres = nsIDOMHTMLDocument_QueryInterface(This->doc_node->nsdoc, &IID_nsIDOMNSDocument, (void**)&nsdoc);
+    if(NS_FAILED(nsres)) {
+        ERR("Could not get nsIDOMNSDocument iface: %08x\n", nsres);
+        return E_FAIL;
+    }
+
+    nsres = nsIDOMNSDocument_ElementFromPoint(nsdoc, x, y, &nselem);
+    nsIDOMNSDocument_Release(nsdoc);
+    if(NS_FAILED(nsres)) {
+        ERR("ElementFromPoint failed: %08x\n", nsres);
+        return E_FAIL;
+    }
+
+    if(!nselem) {
+        *elementHit = NULL;
+        return S_OK;
+    }
+
+    hres = get_node(This->doc_node, (nsIDOMNode*)nselem, TRUE, &node);
+    nsIDOMElement_Release(nselem);
+    if(FAILED(hres))
+        return hres;
+
+    return IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_IHTMLElement, (void**)elementHit);
 }
 
 static HRESULT WINAPI HTMLDocument_get_parentWindow(IHTMLDocument2 *iface, IHTMLWindow2 **p)
diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
index f7aef38..02c9eab 100644
--- a/dlls/mshtml/tests/htmldoc.c
+++ b/dlls/mshtml/tests/htmldoc.c
@@ -213,10 +213,10 @@ static const char *nav_url;
 static const char html_page[] =
 "<html>"
 "<head><link rel=\"stylesheet\" type=\"text/css\" href=\"test.css\"></head>"
-"<body>test</body>"
+"<body><div>test</div></body>"
 "</html>";
 
-static const char css_data[] = "body {color: red}";
+static const char css_data[] = "body {color: red; margin: 0}";
 
 static const WCHAR http_urlW[] =
     {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g',0};
@@ -4429,6 +4429,23 @@ static void test_open_window(IHTMLDocument2 *doc)
     IHTMLWindow2_Release(window);
 }
 
+static void test_elem_from_point(IHTMLDocument2 *doc)
+{
+    IHTMLElement *elem;
+    BSTR tag;
+    HRESULT hres;
+
+    elem = NULL;
+    hres = IHTMLDocument2_elementFromPoint(doc, 3, 3, &elem);
+    ok(hres == S_OK, "elementFromPoint failed: %08x\n", hres);
+    ok(elem != NULL, "elem == NULL\n");
+
+    hres = IHTMLElement_get_tagName(elem, &tag);
+    IHTMLElement_Release(elem);
+    ok(hres == S_OK, "get_tagName failed: %08x\n", hres);
+    ok(!strcmp_wa(tag, "DIV"), "tag = %s\n", wine_dbgstr_w(tag));
+}
+
 static void test_clear(IHTMLDocument2 *doc)
 {
     HRESULT hres;
@@ -5526,6 +5543,7 @@ static void test_HTMLDocument(BOOL do_load)
         set_custom_uihandler(doc, &CustomDocHostUIHandler);
         test_download(DWL_CSS|DWL_TRYCSS);
         test_GetCurMoniker((IUnknown*)doc, &Moniker, NULL);
+        test_elem_from_point(doc);
     }
 
     test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);




More information about the wine-cvs mailing list