diff --git a/dlls/mshtml/omnavigator.c b/dlls/mshtml/omnavigator.c
index dc0fb4a8ca4..d127eef57f7 100644
--- a/dlls/mshtml/omnavigator.c
+++ b/dlls/mshtml/omnavigator.c
@@ -160,19 +160,28 @@ static HRESULT WINAPI OmNavigator_get_appVersion(IOmNavigator *iface, BSTR *p)
{
OmNavigator *This = OMNAVIGATOR_THIS(iface);
- /* FIXME: Should we return something smarter? */
- static const WCHAR app_verW[] =
- {'4','.','0',' ','(','c','o','m','p','a','t','i','b','l','e',';',
- ' ','M','S','I','E',' ','7','.','0',';',
- ' ','W','i','n','d','o','w','s',' ','N','T',' ','5','.','1',';',
- ' ','M','o','z','i','l','l','a','/','4','.','0',')',0};
+ char user_agent[512];
+ DWORD size;
+ HRESULT hres;
TRACE("(%p)->(%p)\n", This, p);
- *p = SysAllocString(app_verW);
+ size = sizeof(user_agent);
+ hres = ObtainUserAgentString(0, user_agent, &size);
+ if(FAILED(hres))
+ return hres;
+
+ if(strncmp(user_agent, "Mozilla/", 8)) {
+ FIXME("Unsupported user agent\n");
+ return E_FAIL;
+ }
+
+ size = MultiByteToWideChar(CP_ACP, 0, user_agent+8, -1, NULL, 0);
+ *p = SysAllocStringLen(NULL, size-1);
if(!*p)
return E_OUTOFMEMORY;
+ MultiByteToWideChar(CP_ACP, 0, user_agent+8, -1, *p, size);
return S_OK;
}
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index 25bf7641eb1..264f9fba5bc 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -3173,6 +3173,16 @@ static void test_navigator(IHTMLDocument2 *doc)
ok(!strcmp_wa(bstr, buf), "userAgent returned %s, expected \"%s\"\n", wine_dbgstr_w(bstr), buf);
SysFreeString(bstr);
+ if(!strncmp(buf, "Mozilla/", 8)) {
+ bstr = NULL;
+ hres = IOmNavigator_get_appVersion(navigator, &bstr);
+ ok(hres == S_OK, "get_appVersion failed: %08x\n", hres);
+ ok(!strcmp_wa(bstr, buf+8), "appVersion returned %s, expected \"%s\"\n", wine_dbgstr_w(bstr), buf+8);
+ SysFreeString(bstr);
+ }else {
+ skip("nonstandard user agent\n");
+ }
+
ref = IOmNavigator_Release(navigator);
ok(!ref, "navigator should be destroyed here\n");
}