Module: wine Branch: master Commit: bcfa7c57d65c6f640d232e037ee2801a3bde5e11 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bcfa7c57d65c6f640d232e037e...
Author: Jacek Caban jacek@codeweavers.com Date: Sun Nov 8 15:40:11 2009 +0100
mshtml: Split parse_complete to handle_load and mutation observer.
---
dlls/mshtml/mshtml_private.h | 1 - dlls/mshtml/mutation.c | 40 +++++++++++++++++++++++-- dlls/mshtml/nsevents.c | 47 ++++++++++++++++++++++++++++- dlls/mshtml/task.c | 67 ------------------------------------------ 4 files changed, 82 insertions(+), 73 deletions(-)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 94d835d..43601ae 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -683,7 +683,6 @@ HRESULT channelbsc_load_stream(nsChannelBSC*,IStream*); void channelbsc_set_channel(nsChannelBSC*,nsChannel*,nsIStreamListener*,nsISupports*); IMoniker *get_channelbsc_mon(nsChannelBSC*);
-void parse_complete(HTMLDocumentObj*); void set_ready_state(HTMLWindow*,READYSTATE);
HRESULT HTMLSelectionObject_Create(HTMLDocumentNode*,nsISelection*,IHTMLSelectionObject**); diff --git a/dlls/mshtml/mutation.c b/dlls/mshtml/mutation.c index b3cc62a..84c9241 100644 --- a/dlls/mshtml/mutation.c +++ b/dlls/mshtml/mutation.c @@ -27,6 +27,7 @@ #include "winuser.h" #include "winreg.h" #include "ole2.h" +#include "shlguid.h"
#include "mshtml_private.h" #include "htmlevent.h" @@ -353,10 +354,43 @@ static nsresult init_frame_window(HTMLDocumentNode *doc, nsISupports *nsunk) return nsres; }
-static void parse_complete_proc(task_t *_task) +/* Calls undocumented 69 cmd of CGID_Explorer */ +static void call_explorer_69(HTMLDocumentObj *doc) { - docobj_task_t *task = (docobj_task_t*)_task; - parse_complete(task->doc); + IOleCommandTarget *olecmd; + VARIANT var; + HRESULT hres; + + if(!doc->client) + return; + + hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); + if(FAILED(hres)) + return; + + VariantInit(&var); + hres = IOleCommandTarget_Exec(olecmd, &CGID_Explorer, 69, 0, NULL, &var); + IOleCommandTarget_Release(olecmd); + if(SUCCEEDED(hres) && V_VT(&var) != VT_NULL) + FIXME("handle result\n"); +} + +static void parse_complete_proc(task_t *task) +{ + HTMLDocumentObj *doc = ((docobj_task_t*)task)->doc; + + TRACE("(%p)\n", doc); + + if(doc->usermode == EDITMODE) + init_editor(&doc->basedoc); + + call_explorer_69(doc); + call_property_onchanged(&doc->basedoc.cp_propnotif, 1005); + call_explorer_69(doc); + + /* FIXME: IE7 calls EnableModelless(TRUE), EnableModelless(FALSE) and sets interactive state here */ + + set_ready_state(doc->basedoc.window, READYSTATE_INTERACTIVE); }
static void handle_end_load(HTMLDocumentNode *This) diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c index 096dcb3..7c4c09b 100644 --- a/dlls/mshtml/nsevents.c +++ b/dlls/mshtml/nsevents.c @@ -26,6 +26,8 @@ #include "winbase.h" #include "winuser.h" #include "ole2.h" +#include "mshtmcid.h" +#include "shlguid.h"
#include "wine/debug.h" #include "wine/unicode.h" @@ -173,6 +175,36 @@ static nsresult NSAPI handle_keypress(nsIDOMEventListener *iface, return NS_OK; }
+static void handle_docobj_load(HTMLDocumentObj *doc) +{ + IOleCommandTarget *olecmd = NULL; + HRESULT hres; + + if(!doc->client) + return; + + hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); + if(SUCCEEDED(hres)) { + VARIANT state, progress; + + V_VT(&progress) = VT_I4; + V_I4(&progress) = 0; + IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER, + &progress, NULL); + + V_VT(&state) = VT_I4; + V_I4(&state) = 0; + IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER, + &state, NULL); + + IOleCommandTarget_Exec(olecmd, &CGID_ShellDocView, 103, 0, NULL, NULL); + IOleCommandTarget_Exec(olecmd, &CGID_MSHTML, IDM_PARSECOMPLETE, 0, NULL, NULL); + IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_HTTPEQUIV_DONE, 0, NULL, NULL); + + IOleCommandTarget_Release(olecmd); + } +} + static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event) { HTMLDocumentNode *doc = NSEVENTLIST_THIS(iface)->This->doc; @@ -195,8 +227,19 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event if(doc_obj->usermode == EDITMODE) handle_edit_load(&doc_obj->basedoc);
- if(doc->basedoc.window->readystate != READYSTATE_COMPLETE) - set_ready_state(doc->basedoc.window, READYSTATE_COMPLETE); + if(doc == doc_obj->basedoc.doc_node) + handle_docobj_load(doc_obj); + + set_ready_state(doc->basedoc.window, READYSTATE_COMPLETE); + + if(doc == doc_obj->basedoc.doc_node) { + if(doc_obj->frame) { + static const WCHAR wszDone[] = {'D','o','n','e',0}; + IOleInPlaceFrame_SetStatusText(doc_obj->frame, wszDone); + } + + update_title(doc_obj); + }
if(!doc->nsdoc) { ERR("NULL nsdoc\n"); diff --git a/dlls/mshtml/task.c b/dlls/mshtml/task.c index 08f5534..e6b94a2 100644 --- a/dlls/mshtml/task.c +++ b/dlls/mshtml/task.c @@ -27,8 +27,6 @@ #include "winbase.h" #include "winuser.h" #include "ole2.h" -#include "mshtmcid.h" -#include "shlguid.h"
#include "wine/debug.h"
@@ -201,75 +199,10 @@ HRESULT clear_task_timer(HTMLDocument *doc, BOOL interval, DWORD id) return S_OK; }
-/* Calls undocumented 69 cmd of CGID_Explorer */ -static void call_explorer_69(HTMLDocumentObj *doc) -{ - IOleCommandTarget *olecmd; - VARIANT var; - HRESULT hres; - - if(!doc->client) - return; - - hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); - if(FAILED(hres)) - return; - - VariantInit(&var); - hres = IOleCommandTarget_Exec(olecmd, &CGID_Explorer, 69, 0, NULL, &var); - IOleCommandTarget_Release(olecmd); - if(SUCCEEDED(hres) && V_VT(&var) != VT_NULL) - FIXME("handle result\n"); -} - void parse_complete(HTMLDocumentObj *doc) { - IOleCommandTarget *olecmd = NULL; - TRACE("(%p)\n", doc);
- if(doc->usermode == EDITMODE) - init_editor(&doc->basedoc); - - call_explorer_69(doc); - call_property_onchanged(&doc->basedoc.cp_propnotif, 1005); - call_explorer_69(doc); - - /* FIXME: IE7 calls EnableModelless(TRUE), EnableModelless(FALSE) and sets interactive state here */ - - set_ready_state(doc->basedoc.window, READYSTATE_INTERACTIVE); - - if(doc->client) - IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd); - - if(olecmd) { - VARIANT state, progress; - - V_VT(&progress) = VT_I4; - V_I4(&progress) = 0; - IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER, - &progress, NULL); - - V_VT(&state) = VT_I4; - V_I4(&state) = 0; - IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER, - &state, NULL); - - IOleCommandTarget_Exec(olecmd, &CGID_ShellDocView, 103, 0, NULL, NULL); - IOleCommandTarget_Exec(olecmd, &CGID_MSHTML, IDM_PARSECOMPLETE, 0, NULL, NULL); - IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_HTTPEQUIV_DONE, 0, NULL, NULL); - - IOleCommandTarget_Release(olecmd); - } - - set_ready_state(doc->basedoc.window, READYSTATE_COMPLETE); - - if(doc->frame) { - static const WCHAR wszDone[] = {'D','o','n','e',0}; - IOleInPlaceFrame_SetStatusText(doc->frame, wszDone); - } - - update_title(doc); }
static void call_timer_disp(IDispatch *disp)