diff --git a/dlls/mshtml/htmllocation.c b/dlls/mshtml/htmllocation.c
index 2026a06a755..da3027e0d90 100644
--- a/dlls/mshtml/htmllocation.c
+++ b/dlls/mshtml/htmllocation.c
@@ -303,6 +303,34 @@ static HRESULT WINAPI HTMLLocation_toString(IHTMLLocation *iface, BSTR *String)
return E_NOTIMPL;
}
+static HRESULT HTMLLocation_value(IUnknown *iface, LCID lcid, WORD flags, DISPPARAMS *params,
+ VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+{
+ HTMLLocation *This = HTMLLOCATION_THIS(iface);
+ HRESULT hres;
+
+ TRACE("(%p)\n", This);
+
+ switch(flags) {
+ case DISPATCH_PROPERTYGET: {
+ BSTR str;
+
+ hres = IHTMLLocation_get_href(HTMLLOCATION(This), &str);
+ if(FAILED(hres))
+ return hres;
+
+ V_VT(res) = VT_BSTR;
+ V_BSTR(res) = str;
+ break;
+ }
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
#undef HTMLLOCATION_THIS
static const IHTMLLocationVtbl HTMLLocationVtbl = {
@@ -335,12 +363,18 @@ static const IHTMLLocationVtbl HTMLLocationVtbl = {
HTMLLocation_toString
};
+static const dispex_static_data_vtbl_t HTMLLocation_dispex_vtbl = {
+ HTMLLocation_value,
+ NULL,
+ NULL
+};
+
static const tid_t HTMLLocation_iface_tids[] = {
IHTMLLocation_tid,
0
};
static dispex_static_data_t HTMLLocation_dispex = {
- NULL,
+ &HTMLLocation_dispex_vtbl,
DispHTMLLocation_tid,
NULL,
HTMLLocation_iface_tids
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index f22d6bd083a..e10e41a278b 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -469,23 +469,50 @@ static BOOL _test_get_dispid(unsigned line, IUnknown *unk, IID *iid)
return ret;
}
-#define test_disp(u,id) _test_disp(__LINE__,u,id)
-static void _test_disp(unsigned line, IUnknown *unk, const IID *diid)
+#define test_disp_value(u) _test_disp_value(__LINE__,u,v)
+static void _test_disp_value(unsigned line, IUnknown *unk, const char *val)
+{
+ DISPPARAMS dp = {NULL,NULL,0,0};
+ IDispatchEx *dispex;
+ EXCEPINFO ei;
+ VARIANT var;
+ HRESULT hres;
+
+ hres = IUnknown_QueryInterface(unk, &IID_IDispatchEx, (void**)&dispex);
+ ok_(__FILE__,line)(hres == S_OK, "Could not get IDispatchEx interface: %08x\n", hres);
+ if(FAILED(hres))
+ return;
+
+ hres = IDispatchEx_InvokeEx(dispex, DISPID_VALUE, 0, DISPATCH_PROPERTYGET, &dp, &var, &ei, NULL);
+ IDispatchEx_Release(dispex);
+ ok_(__FILE__,line)(hres == S_OK, "InvokeEx(DISPID_VALUE) returned: %08x\n", hres);
+
+ ok_(__FILE__,line)(V_VT(&var) == VT_BSTR, "V_VT(value) = %d\n", V_VT(&var));
+ ok_(__FILE__,line)(!strcmp_wa(V_BSTR(&var), val), "value = %s, expected %s\n", wine_dbgstr_w(V_BSTR(&var)), val);
+ VariantClear(&var);
+}
+
+#define test_disp(u,id,v) _test_disp(__LINE__,u,id,v)
+static void _test_disp(unsigned line, IUnknown *unk, const IID *diid, const char *val)
{
IID iid;
if(_test_get_dispid(line, unk, &iid))
ok_(__FILE__,line) (IsEqualGUID(&iid, diid), "unexpected guid %s\n", dbgstr_guid(&iid));
+
+ _test_disp_value(line, unk, val);
}
-#define test_disp2(u,id,id2) _test_disp2(__LINE__,u,id,id2)
-static void _test_disp2(unsigned line, IUnknown *unk, const IID *diid, const IID *diid2)
+#define test_disp2(u,id,id2,v) _test_disp2(__LINE__,u,id,id2,v)
+static void _test_disp2(unsigned line, IUnknown *unk, const IID *diid, const IID *diid2, const char *val)
{
IID iid;
if(_test_get_dispid(line, unk, &iid))
ok_(__FILE__,line) (IsEqualGUID(&iid, diid) || broken(IsEqualGUID(&iid, diid2)),
"unexpected guid %s\n", dbgstr_guid(&iid));
+
+ _test_disp_value(line, unk, val);
}
#define get_elem_iface(u) _get_elem_iface(__LINE__,u)
@@ -580,7 +607,7 @@ static void _test_elem_type(unsigned line, IUnknown *unk, elem_type_t type)
_test_ifaces(line, unk, elem_type_infos[type].iids);
if(elem_type_infos[type].dispiid)
- _test_disp(line, unk, elem_type_infos[type].dispiid);
+ _test_disp(line, unk, elem_type_infos[type].dispiid, "[object]");
}
#define get_node_type(n) _get_node_type(__LINE__,n)
@@ -1022,7 +1049,7 @@ static void _test_elem_collection(unsigned line, IUnknown *unk,
hres = IUnknown_QueryInterface(unk, &IID_IHTMLElementCollection, (void**)&col);
ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLElementCollection: %08x\n", hres);
- test_disp((IUnknown*)col, &DIID_DispHTMLElementCollection);
+ test_disp((IUnknown*)col, &DIID_DispHTMLElementCollection, "[object]");
hres = IHTMLElementCollection_get_length(col, &len);
ok_(__FILE__,line) (hres == S_OK, "get_length failed: %08x\n", hres);
@@ -2396,7 +2423,7 @@ static void test_location(IHTMLDocument2 *doc)
IHTMLLocation_Release(location2);
test_ifaces((IUnknown*)location, location_iids);
- test_disp2((IUnknown*)location, &DIID_DispHTMLLocation, &IID_IHTMLLocation);
+ test_disp2((IUnknown*)location, &DIID_DispHTMLLocation, &IID_IHTMLLocation, "about:blank");
hres = IHTMLLocation_get_pathname(location, &str);
ok(hres == S_OK, "get_pathname failed: %08x\n", hres);
@@ -2429,7 +2456,7 @@ static void test_navigator(IHTMLDocument2 *doc)
hres = IHTMLWindow2_get_navigator(window, &navigator);
ok(hres == S_OK, "get_navigator failed: %08x\n", hres);
ok(navigator != NULL, "navigator == NULL\n");
- test_disp2((IUnknown*)navigator, &DIID_DispHTMLNavigator, &IID_IOmNavigator);
+ test_disp2((IUnknown*)navigator, &DIID_DispHTMLNavigator, &IID_IOmNavigator, "[object]");
hres = IHTMLWindow2_get_navigator(window, &navigator2);
ok(hres == S_OK, "get_navigator failed: %08x\n", hres);
@@ -2475,7 +2502,7 @@ static void test_current_style(IHTMLCurrentStyle *current_style)
HRESULT hres;
VARIANT v;
- test_disp((IUnknown*)current_style, &DIID_DispHTMLCurrentStyle);
+ test_disp((IUnknown*)current_style, &DIID_DispHTMLCurrentStyle, "[object]");
test_ifaces((IUnknown*)current_style, cstyle_iids);
hres = IHTMLCurrentStyle_get_display(current_style, &str);
@@ -2744,7 +2771,7 @@ static void test_default_style(IHTMLStyle *style)
BSTR sDefault;
VARIANT vDefault;
- test_disp((IUnknown*)style, &DIID_DispHTMLStyle);
+ test_disp((IUnknown*)style, &DIID_DispHTMLStyle, "[object]");
test_ifaces((IUnknown*)style, style_iids);
test_style_csstext(style, NULL);
@@ -3928,7 +3955,7 @@ static void test_window(IHTMLDocument2 *doc)
hres = IHTMLDocument2_get_parentWindow(doc, &window);
ok(hres == S_OK, "get_parentWindow failed: %08x\n", hres);
test_ifaces((IUnknown*)window, window_iids);
- test_disp((IUnknown*)window, &DIID_DispHTMLWindow2);
+ test_disp((IUnknown*)window, &DIID_DispHTMLWindow2, "[object]");
hres = IHTMLWindow2_get_document(window, &doc2);
ok(hres == S_OK, "get_document failed: %08x\n", hres);
@@ -4591,7 +4618,7 @@ static void test_elems(IHTMLDocument2 *doc)
ok(node != NULL, "node == NULL\n");
if(node) {
test_ifaces((IUnknown*)node, text_iids);
- test_disp((IUnknown*)node, &DIID_DispHTMLDOMTextNode);
+ test_disp((IUnknown*)node, &DIID_DispHTMLDOMTextNode, "[object]");
node2 = get_first_child((IUnknown*)node);
ok(!node2, "node2 != NULL\n");
@@ -4611,7 +4638,7 @@ static void test_elems(IHTMLDocument2 *doc)
if(child_col) {
LONG length = 0;
- test_disp((IUnknown*)child_col, &DIID_DispDOMChildrenCollection);
+ test_disp((IUnknown*)child_col, &DIID_DispDOMChildrenCollection, "[object]");
hres = IHTMLDOMChildrenCollection_get_length(child_col, &length);
ok(hres == S_OK, "get_length failed: %08x\n", hres);
@@ -4734,7 +4761,7 @@ static void test_create_elems(IHTMLDocument2 *doc)
type = get_node_type((IUnknown*)elem);
ok(type == 1, "type=%d\n", type);
test_ifaces((IUnknown*)elem, elem_iids);
- test_disp((IUnknown*)elem, &DIID_DispHTMLGenericElement);
+ test_disp((IUnknown*)elem, &DIID_DispHTMLGenericElement, "[object]");
hres = IHTMLDocument2_get_body(doc, &body);
ok(hres == S_OK, "get_body failed: %08x\n", hres);
@@ -4763,7 +4790,7 @@ static void test_create_elems(IHTMLDocument2 *doc)
node = test_create_text(doc, "test");
test_ifaces((IUnknown*)node, text_iids);
- test_disp((IUnknown*)node, &DIID_DispHTMLDOMTextNode);
+ test_disp((IUnknown*)node, &DIID_DispHTMLDOMTextNode, "[object]");
V_VT(&var) = VT_NULL;
node2 = test_node_insertbefore((IUnknown*)body, node, &var);