Module: wine Branch: master Commit: 730299bae610581b4232953899ea308fd0521fb5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=730299bae610581b4232953899...
Author: Jacek Caban jacek@codeweavers.com Date: Sat Jul 23 12:51:57 2011 +0200
mshtml: Call set_moniker asynchronously in SuperNavigate.
---
dlls/mshtml/htmlwindow.c | 46 +++++++++++++++++++++++++++++++++++++----- dlls/mshtml/tests/htmldoc.c | 2 +- 2 files changed, 41 insertions(+), 7 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 911e1f2..06ae7ae 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -1666,10 +1666,32 @@ static ULONG WINAPI HTMLPrivateWindow_Release(IHTMLPrivateWindow *iface) return IHTMLWindow2_Release(&This->IHTMLWindow2_iface); }
+typedef struct { + task_t header; + HTMLWindow *window; + nsChannelBSC *bscallback; + IMoniker *mon; +} navigate_task_t; + +static void navigate_proc(task_t *_task) +{ + navigate_task_t *task = (navigate_task_t*)_task; + HRESULT hres; + + hres = set_moniker(&task->window->doc_obj->basedoc, task->mon, NULL, task->bscallback, TRUE); + if(SUCCEEDED(hres)) + hres = start_binding(task->window, NULL, (BSCallback*)task->bscallback, NULL); + + IUnknown_Release((IUnknown*)task->bscallback); + IHTMLWindow2_Release(&task->window->IHTMLWindow2_iface); + IMoniker_Release(task->mon); +} + static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface, BSTR url, BSTR arg2, BSTR arg3, 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; @@ -1748,13 +1770,25 @@ static HRESULT WINAPI HTMLPrivateWindow_SuperNavigate(IHTMLPrivateWindow *iface, }
prepare_for_binding(&This->doc_obj->basedoc, mon, NULL, TRUE); - hres = set_moniker(&This->doc_obj->basedoc, mon, NULL, bsc, TRUE); - if(SUCCEEDED(hres)) - hres = async_start_doc_binding(This, bsc);
- IUnknown_Release((IUnknown*)bsc); - IMoniker_Release(mon); - return hres; + + 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; + + return S_OK; }
static HRESULT WINAPI HTMLPrivateWindow_GetPendingUrl(IHTMLPrivateWindow *iface, BSTR *url) diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c index f22bdbd..88d0e8d 100644 --- a/dlls/mshtml/tests/htmldoc.c +++ b/dlls/mshtml/tests/htmldoc.c @@ -4306,7 +4306,7 @@ static void test_put_href(IHTMLDocument2 *doc, BOOL use_replace)
SET_EXPECT(Invoke_OnReadyStateChange_Loading); test_download(DWL_VERBDONE); - todo_wine CHECK_CALLED(Invoke_OnReadyStateChange_Loading); + CHECK_CALLED(Invoke_OnReadyStateChange_Loading);
hres = IHTMLPrivateWindow_GetAddressBarUrl(priv_window, &str2); ok(hres == S_OK, "GetAddressBarUrl failed: %08x\n", hres);