diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index b5fe51ef48b..12e8520978b 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -1856,14 +1856,54 @@ static nsresult NSAPI nsURL_GetQuery(nsIWineURI *iface, nsACString *aQuery)
static nsresult NSAPI nsURL_SetQuery(nsIWineURI *iface, const nsACString *aQuery)
{
nsURI *This = NSURI_THIS(iface);
+ const WCHAR *ptr1, *ptr2;
+ const char *query;
+ WCHAR *new_url, *ptr;
+ DWORD len, size;
TRACE("(%p)->(%s)\n", This, debugstr_nsacstr(aQuery));
if(This->nsurl)
- return nsIURL_SetQuery(This->nsurl, aQuery);
+ nsIURL_SetQuery(This->nsurl, aQuery);
- FIXME("default action not implemented\n");
- return NS_ERROR_NOT_IMPLEMENTED;
+ if(!This->wine_url)
+ return NS_OK;
+
+ nsACString_GetData(aQuery, &query);
+ size = len = MultiByteToWideChar(CP_ACP, 0, query, -1, NULL, 0);
+ ptr1 = strchrW(This->wine_url, '?');
+ if(ptr1) {
+ size += ptr1-This->wine_url;
+ ptr2 = strchrW(ptr1, '#');
+ if(ptr2)
+ size += strlenW(ptr2);
+ }else {
+ ptr1 = This->wine_url + strlenW(This->wine_url);
+ ptr2 = NULL;
+ size += strlenW(This->wine_url);
+ }
+
+ if(*query)
+ size++;
+
+ new_url = heap_alloc(size*sizeof(WCHAR));
+ memcpy(new_url, This->wine_url, (ptr1-This->wine_url)*sizeof(WCHAR));
+ ptr = new_url + (ptr1-This->wine_url);
+ if(*query) {
+ *ptr++ = '?';
+ MultiByteToWideChar(CP_ACP, 0, query, -1, ptr, len);
+ ptr += len-1;
+ }
+ if(ptr2)
+ strcpyW(ptr, ptr2);
+ else
+ *ptr = 0;
+
+ TRACE("setting %s\n", debugstr_w(new_url));
+
+ heap_free(This->wine_url);
+ This->wine_url = new_url;
+ return NS_OK;
}
static nsresult NSAPI nsURL_GetRef(nsIWineURI *iface, nsACString *aRef)