diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index 06ae7ae8396..ba292ab4b15 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -27,6 +27,9 @@
#include "mshtmdid.h"
#include "shlguid.h"
+#define NO_SHLWAPI_REG
+#include "shlwapi.h"
+
#include "wine/debug.h"
#include "mshtml_private.h"
@@ -1666,6 +1669,52 @@ static ULONG WINAPI HTMLPrivateWindow_Release(IHTMLPrivateWindow *iface)
return IHTMLWindow2_Release(&This->IHTMLWindow2_iface);
}
+static void handle_javascript(HTMLWindow *window, const WCHAR *code)
+{
+ VARIANT v;
+ HRESULT hres;
+
+ static const WCHAR jscriptW[] = {'j','s','c','r','i','p','t',0};
+
+ set_download_state(window->doc_obj, 1);
+
+ V_VT(&v) = VT_EMPTY;
+ hres = exec_script(window, code, jscriptW, &v);
+ if(SUCCEEDED(hres) && V_VT(&v) != VT_EMPTY) {
+ FIXME("javascirpt URL returned %s\n", debugstr_variant(&v));
+ VariantClear(&v);
+ }
+
+ if(window->doc_obj->view_sink)
+ IAdviseSink_OnViewChange(window->doc_obj->view_sink, DVASPECT_CONTENT, -1);
+
+ set_download_state(window->doc_obj, 0);
+}
+
+typedef struct {
+ task_t header;
+ HTMLWindow *window;
+ IUri *uri;
+} navigate_javascript_task_t;
+
+static void navigate_javascript_proc(task_t *_task)
+{
+ navigate_javascript_task_t *task = (navigate_javascript_task_t*)_task;
+ BSTR code;
+ HRESULT hres;
+
+ task->window->readystate = READYSTATE_COMPLETE;
+
+ hres = IUri_GetPath(task->uri, &code);
+ if(SUCCEEDED(hres)) {
+ handle_javascript(task->window, code);
+ SysFreeString(code);
+ }
+
+ IHTMLWindow2_Release(&task->window->IHTMLWindow2_iface);
+ IUri_Release(task->uri);
+}
+
typedef struct {
task_t header;
HTMLWindow *window;
@@ -1691,12 +1740,12 @@ static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface,
BSTR arg4, VARIANT *post_data_var, VARIANT *headers_var, ULONG flags)
{
HTMLWindow *This = impl_from_IHTMLPrivateWindow(iface);
- navigate_task_t *task;
DWORD post_data_size = 0;
BYTE *post_data = NULL;
WCHAR *headers = NULL;
nsChannelBSC *bsc;
IMoniker *mon;
+ DWORD scheme;
BSTR new_url;
IUri *uri;
HRESULT hres;
@@ -1740,7 +1789,6 @@ static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface,
return hres;
hres = CreateURLMonikerEx2(NULL, uri, &mon, URL_MK_UNIFORM);
- IUri_Release(uri);
if(FAILED(hres))
return hres;
@@ -1771,23 +1819,49 @@ static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface,
prepare_for_binding(&This->doc_obj->basedoc, mon, NULL, TRUE);
+ hres = IUri_GetScheme(uri, &scheme);
+
+ if(scheme != URL_SCHEME_JAVASCRIPT) {
+ navigate_task_t *task;
+
+ IUri_Release(uri);
+
+ task = heap_alloc(sizeof(*task));
+ if(!task) {
+ IUnknown_Release((IUnknown*)bsc);
+ IMoniker_Release(mon);
+ return E_OUTOFMEMORY;
+ }
+
+ IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
+ task->window = This;
+ task->bscallback = bsc;
+ task->mon = mon;
+ push_task(&task->header, navigate_proc, This->task_magic);
+
+ /* Silently and repeated when real loading starts? */
+ This->readystate = READYSTATE_LOADING;
+ }else {
+ navigate_javascript_task_t *task;
- task = heap_alloc(sizeof(*task));
- if(!task) {
IUnknown_Release((IUnknown*)bsc);
IMoniker_Release(mon);
- return E_OUTOFMEMORY;
+
+ task = heap_alloc(sizeof(*task));
+ if(!task) {
+ IUri_Release(uri);
+ return E_OUTOFMEMORY;
+ }
+
+ IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
+ task->window = This;
+ task->uri = uri;
+ push_task(&task->header, navigate_javascript_proc, This->task_magic);
+
+ /* Why silently? */
+ This->readystate = READYSTATE_COMPLETE;
}
- IHTMLWindow2_AddRef(&This->IHTMLWindow2_iface);
- task->window = This;
- task->bscallback = bsc;
- task->mon = mon;
- push_task(&task->header, navigate_proc, This->task_magic);
-
- /* Silently and repeated when real loading starts? */
- This->readystate = READYSTATE_LOADING;
-
return S_OK;
}