diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c
index f2178939255..f5c677107e2 100644
--- a/dlls/mshtml/htmlnode.c
+++ b/dlls/mshtml/htmlnode.c
@@ -467,8 +467,25 @@ static HRESULT WINAPI HTMLDOMNode_put_nodeValue(IHTMLDOMNode *iface, VARIANT v)
static HRESULT WINAPI HTMLDOMNode_get_nodeValue(IHTMLDOMNode *iface, VARIANT *p)
{
HTMLDOMNode *This = HTMLDOMNODE_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ const PRUnichar *val;
+ nsAString val_str;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ nsAString_Init(&val_str, NULL);
+ nsIDOMNode_GetNodeValue(This->nsnode, &val_str);
+ nsAString_GetData(&val_str, &val);
+
+ if(*val) {
+ V_VT(p) = VT_BSTR;
+ V_BSTR(p) = SysAllocString(val);
+ }else {
+ V_VT(p) = VT_NULL;
+ }
+
+ nsAString_Finish(&val_str);
+
+ return S_OK;
}
static HRESULT WINAPI HTMLDOMNode_get_firstChild(IHTMLDOMNode *iface, IHTMLDOMNode **p)
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 45a5383f098..de4850871a5 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -376,6 +376,17 @@ static IHTMLElement *_get_elem_iface(unsigned line, IUnknown *unk)
return elem;
}
+#define get_node_iface(u) _get_node_iface(__LINE__,u)
+static IHTMLDOMNode *_get_node_iface(unsigned line, IUnknown *unk)
+{
+ IHTMLDOMNode *node;
+ HRESULT hres;
+
+ hres = IUnknown_QueryInterface(unk, &IID_IHTMLDOMNode, (void**)&node);
+ ok_(__FILE__,line) (hres == S_OK, "Coule not get IHTMLDOMNode: %08x\n", hres);
+ return node;
+}
+
#define test_node_name(u,n) _test_node_name(__LINE__,u,n)
static void _test_node_name(unsigned line, IUnknown *unk, const char *exname)
{
@@ -908,6 +919,27 @@ static void _test_elem_put_id(unsigned line, IUnknown *unk, const char *new_id)
_test_elem_id(line, unk, new_id);
}
+#define test_node_get_value_str(u,e) _test_node_get_value_str(__LINE__,u,e)
+static void _test_node_get_value_str(unsigned line, IUnknown *unk, const char *exval)
+{
+ IHTMLDOMNode *node = _get_node_iface(line, unk);
+ VARIANT var;
+ HRESULT hres;
+
+ hres = IHTMLDOMNode_get_nodeValue(node, &var);
+ IHTMLDOMNode_Release(node);
+ ok_(__FILE__,line) (hres == S_OK, "get_nodeValue failed: %08x, expected VT_BSTR\n", hres);
+
+ if(exval) {
+ ok_(__FILE__,line) (V_VT(&var) == VT_BSTR, "vt=%d\n", V_VT(&var));
+ ok_(__FILE__,line) (!strcmp_wa(V_BSTR(&var), exval), "unexpected value %s\n", dbgstr_w(V_BSTR(&var)));
+ }else {
+ ok_(__FILE__,line) (V_VT(&var) == VT_NULL, "vt=%d, expected VT_NULL\n", V_VT(&var));
+ }
+
+ VariantClear(&var);
+}
+
static void test_elem_col_item(IHTMLElementCollection *col, LPCWSTR n,
const elem_type_t *elem_types, long len)
{
@@ -1673,6 +1705,8 @@ static void test_elems(IHTMLDocument2 *doc)
test_elem_put_id((IUnknown*)elem, "newin");
test_input_get_disabled(input, VARIANT_FALSE);
+ test_node_get_value_str((IUnknown*)elem, NULL);
+
IHTMLInputElement_Release(input);
IHTMLElement_Release(elem);
}
@@ -1692,6 +1726,8 @@ static void test_elems(IHTMLDocument2 *doc)
type = get_node_type((IUnknown*)node);
ok(type == 3, "type=%ld\n", type);
+ test_node_get_value_str((IUnknown*)node, "text test");
+
IHTMLDOMNode_Release(node);
}