mshtml: Allow task queue to be used for different targets.
This commit is contained in:
parent
fd47fa4647
commit
12bddc55ed
|
@ -1714,6 +1714,7 @@ static void init_doc(HTMLDocument *doc, IUnknown *unk_impl, IDispatchEx *dispex)
|
||||||
|
|
||||||
doc->unk_impl = unk_impl;
|
doc->unk_impl = unk_impl;
|
||||||
doc->dispex = dispex;
|
doc->dispex = dispex;
|
||||||
|
doc->task_magic = get_task_target_magic();
|
||||||
|
|
||||||
HTMLDocument_HTMLDocument3_Init(doc);
|
HTMLDocument_HTMLDocument3_Init(doc);
|
||||||
HTMLDocument_HTMLDocument5_Init(doc);
|
HTMLDocument_HTMLDocument5_Init(doc);
|
||||||
|
@ -1733,7 +1734,7 @@ static void init_doc(HTMLDocument *doc, IUnknown *unk_impl, IDispatchEx *dispex)
|
||||||
|
|
||||||
static void destroy_htmldoc(HTMLDocument *This)
|
static void destroy_htmldoc(HTMLDocument *This)
|
||||||
{
|
{
|
||||||
remove_doc_tasks(This);
|
remove_target_tasks(This->task_magic);
|
||||||
|
|
||||||
ConnectionPointContainer_Destroy(&This->cp_container);
|
ConnectionPointContainer_Destroy(&This->cp_container);
|
||||||
}
|
}
|
||||||
|
|
|
@ -305,6 +305,8 @@ struct HTMLDocument {
|
||||||
|
|
||||||
HTMLWindow *window;
|
HTMLWindow *window;
|
||||||
|
|
||||||
|
LONG task_magic;
|
||||||
|
|
||||||
ConnectionPointContainer cp_container;
|
ConnectionPointContainer cp_container;
|
||||||
ConnectionPoint cp_htmldocevents;
|
ConnectionPoint cp_htmldocevents;
|
||||||
ConnectionPoint cp_htmldocevents2;
|
ConnectionPoint cp_htmldocevents2;
|
||||||
|
@ -671,6 +673,8 @@ HRESULT channelbsc_load_stream(nsChannelBSC*,IStream*);
|
||||||
void channelbsc_set_channel(nsChannelBSC*,nsChannel*,nsIStreamListener*,nsISupports*);
|
void channelbsc_set_channel(nsChannelBSC*,nsChannel*,nsIStreamListener*,nsISupports*);
|
||||||
IMoniker *get_channelbsc_mon(nsChannelBSC*);
|
IMoniker *get_channelbsc_mon(nsChannelBSC*);
|
||||||
|
|
||||||
|
void parse_complete(HTMLDocumentObj*);
|
||||||
|
|
||||||
HRESULT HTMLSelectionObject_Create(HTMLDocumentNode*,nsISelection*,IHTMLSelectionObject**);
|
HRESULT HTMLSelectionObject_Create(HTMLDocumentNode*,nsISelection*,IHTMLSelectionObject**);
|
||||||
HRESULT HTMLTxtRange_Create(HTMLDocumentNode*,nsIDOMRange*,IHTMLTxtRange**);
|
HRESULT HTMLTxtRange_Create(HTMLDocumentNode*,nsIDOMRange*,IHTMLTxtRange**);
|
||||||
IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration*);
|
IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration*);
|
||||||
|
@ -758,20 +762,19 @@ void set_dirty(HTMLDocument*,VARIANT_BOOL);
|
||||||
|
|
||||||
extern DWORD mshtml_tls;
|
extern DWORD mshtml_tls;
|
||||||
|
|
||||||
typedef struct task_t {
|
typedef struct task_t task_t;
|
||||||
HTMLDocument *doc;
|
typedef void (*task_proc_t)(task_t*);
|
||||||
|
|
||||||
enum {
|
|
||||||
TASK_SETDOWNLOADSTATE,
|
|
||||||
TASK_PARSECOMPLETE,
|
|
||||||
TASK_SETPROGRESS,
|
|
||||||
TASK_START_BINDING
|
|
||||||
} task_id;
|
|
||||||
|
|
||||||
nsChannelBSC *bscallback;
|
|
||||||
|
|
||||||
|
struct task_t {
|
||||||
|
LONG target_magic;
|
||||||
|
task_proc_t proc;
|
||||||
struct task_t *next;
|
struct task_t *next;
|
||||||
} task_t;
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
task_t header;
|
||||||
|
HTMLDocumentObj *doc;
|
||||||
|
} docobj_task_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
HWND thread_hwnd;
|
HWND thread_hwnd;
|
||||||
|
@ -782,8 +785,11 @@ typedef struct {
|
||||||
|
|
||||||
thread_data_t *get_thread_data(BOOL);
|
thread_data_t *get_thread_data(BOOL);
|
||||||
HWND get_thread_hwnd(void);
|
HWND get_thread_hwnd(void);
|
||||||
void push_task(task_t*);
|
|
||||||
void remove_doc_tasks(const HTMLDocument*);
|
LONG get_task_target_magic(void);
|
||||||
|
void push_task(task_t*,task_proc_t,LONG);
|
||||||
|
void remove_target_tasks(LONG);
|
||||||
|
|
||||||
DWORD set_task_timer(HTMLDocument*,DWORD,BOOL,IDispatch*);
|
DWORD set_task_timer(HTMLDocument*,DWORD,BOOL,IDispatch*);
|
||||||
HRESULT clear_task_timer(HTMLDocument*,BOOL,DWORD);
|
HRESULT clear_task_timer(HTMLDocument*,BOOL,DWORD);
|
||||||
|
|
||||||
|
|
|
@ -472,6 +472,12 @@ static void NSAPI nsDocumentObserver_BeginLoad(nsIDocumentObserver *iface, nsIDo
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void parse_complete_proc(task_t *_task)
|
||||||
|
{
|
||||||
|
docobj_task_t *task = (docobj_task_t*)_task;
|
||||||
|
parse_complete(task->doc);
|
||||||
|
}
|
||||||
|
|
||||||
static void NSAPI nsDocumentObserver_EndLoad(nsIDocumentObserver *iface, nsIDocument *aDocument)
|
static void NSAPI nsDocumentObserver_EndLoad(nsIDocumentObserver *iface, nsIDocument *aDocument)
|
||||||
{
|
{
|
||||||
HTMLDocumentNode *This = NSDOCOBS_THIS(iface);
|
HTMLDocumentNode *This = NSDOCOBS_THIS(iface);
|
||||||
|
@ -481,18 +487,19 @@ static void NSAPI nsDocumentObserver_EndLoad(nsIDocumentObserver *iface, nsIDocu
|
||||||
This->content_ready = TRUE;
|
This->content_ready = TRUE;
|
||||||
|
|
||||||
if(This == This->basedoc.doc_obj->basedoc.doc_node) {
|
if(This == This->basedoc.doc_obj->basedoc.doc_node) {
|
||||||
task_t *task;
|
docobj_task_t *task;
|
||||||
task = heap_alloc(sizeof(task_t));
|
|
||||||
|
|
||||||
task->doc = &This->basedoc.doc_obj->basedoc;
|
task = heap_alloc(sizeof(docobj_task_t));
|
||||||
task->task_id = TASK_PARSECOMPLETE;
|
if(!task)
|
||||||
task->next = NULL;
|
return;
|
||||||
|
|
||||||
|
task->doc = This->basedoc.doc_obj;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This should be done in the worker thread that parses HTML,
|
* This should be done in the worker thread that parses HTML,
|
||||||
* but we don't have such thread (Gecko parses HTML for us).
|
* but we don't have such thread (Gecko parses HTML for us).
|
||||||
*/
|
*/
|
||||||
push_task(task);
|
push_task(&task->header, &parse_complete_proc, This->basedoc.doc_obj->basedoc.task_magic);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -724,12 +724,25 @@ static HTMLWindow *get_channel_window(nsChannel *This)
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
task_t header;
|
||||||
|
HTMLDocument *doc;
|
||||||
|
nsChannelBSC *bscallback;
|
||||||
|
} start_binding_task_t;
|
||||||
|
|
||||||
|
static void start_binding_proc(task_t *_task)
|
||||||
|
{
|
||||||
|
start_binding_task_t *task = (start_binding_task_t*)_task;
|
||||||
|
|
||||||
|
start_binding(task->doc, (BSCallback*)task->bscallback, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static nsresult async_open(nsChannel *This, HTMLWindow *window, BOOL is_doc_channel, nsIStreamListener *listener,
|
static nsresult async_open(nsChannel *This, HTMLWindow *window, BOOL is_doc_channel, nsIStreamListener *listener,
|
||||||
nsISupports *context)
|
nsISupports *context)
|
||||||
{
|
{
|
||||||
nsChannelBSC *bscallback;
|
nsChannelBSC *bscallback;
|
||||||
IMoniker *mon = NULL;
|
IMoniker *mon = NULL;
|
||||||
task_t *task;
|
start_binding_task_t *task;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
hres = create_mon_for_nschannel(This, &mon);
|
hres = create_mon_for_nschannel(This, &mon);
|
||||||
|
@ -744,14 +757,12 @@ static nsresult async_open(nsChannel *This, HTMLWindow *window, BOOL is_doc_chan
|
||||||
|
|
||||||
channelbsc_set_channel(bscallback, This, listener, context);
|
channelbsc_set_channel(bscallback, This, listener, context);
|
||||||
|
|
||||||
task = heap_alloc(sizeof(task_t));
|
task = heap_alloc(sizeof(start_binding_task_t));
|
||||||
|
|
||||||
task->doc = &window->doc_obj->basedoc;
|
task->doc = &window->doc_obj->basedoc;
|
||||||
task->task_id = TASK_START_BINDING;
|
|
||||||
task->next = NULL;
|
|
||||||
task->bscallback = bscallback;
|
task->bscallback = bscallback;
|
||||||
|
|
||||||
push_task(task);
|
push_task(&task->header, start_binding_proc, window->doc_obj->basedoc.task_magic);
|
||||||
|
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -590,7 +590,7 @@ static HRESULT exec_editmode(HTMLDocument *This, DWORD cmdexecopt, VARIANT *in,
|
||||||
|
|
||||||
if(This->window->mon) {
|
if(This->window->mon) {
|
||||||
/* FIXME: We should find nicer way to do this */
|
/* FIXME: We should find nicer way to do this */
|
||||||
remove_doc_tasks(This);
|
remove_target_tasks(This->task_magic);
|
||||||
|
|
||||||
mon = This->window->mon;
|
mon = This->window->mon;
|
||||||
IMoniker_AddRef(mon);
|
IMoniker_AddRef(mon);
|
||||||
|
|
|
@ -75,11 +75,88 @@ void set_current_mon(HTMLWindow *This, IMoniker *mon)
|
||||||
set_script_mode(This, use_gecko_script(This->url) ? SCRIPTMODE_GECKO : SCRIPTMODE_ACTIVESCRIPT);
|
set_script_mode(This, use_gecko_script(This->url) ? SCRIPTMODE_GECKO : SCRIPTMODE_ACTIVESCRIPT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_progress_proc(task_t *_task)
|
||||||
|
{
|
||||||
|
docobj_task_t *task = (docobj_task_t*)_task;
|
||||||
|
IOleCommandTarget *olecmd = NULL;
|
||||||
|
HTMLDocumentObj *doc = task->doc;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
TRACE("(%p)\n", doc);
|
||||||
|
|
||||||
|
if(doc->client)
|
||||||
|
IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
|
||||||
|
|
||||||
|
if(olecmd) {
|
||||||
|
VARIANT progress_max, progress;
|
||||||
|
|
||||||
|
V_VT(&progress_max) = VT_I4;
|
||||||
|
V_I4(&progress_max) = 0; /* FIXME */
|
||||||
|
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSMAX, OLECMDEXECOPT_DONTPROMPTUSER,
|
||||||
|
&progress_max, NULL);
|
||||||
|
|
||||||
|
V_VT(&progress) = VT_I4;
|
||||||
|
V_I4(&progress) = 0; /* FIXME */
|
||||||
|
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER,
|
||||||
|
&progress, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(doc->usermode == EDITMODE && doc->hostui) {
|
||||||
|
DOCHOSTUIINFO hostinfo;
|
||||||
|
|
||||||
|
memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
|
||||||
|
hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
|
||||||
|
hres = IDocHostUIHandler_GetHostInfo(doc->hostui, &hostinfo);
|
||||||
|
if(SUCCEEDED(hres))
|
||||||
|
/* FIXME: use hostinfo */
|
||||||
|
TRACE("hostinfo = {%u %08x %08x %s %s}\n",
|
||||||
|
hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
|
||||||
|
debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void set_downloading_proc(task_t *_task)
|
||||||
|
{
|
||||||
|
HTMLDocumentObj *doc = ((docobj_task_t*)_task)->doc;
|
||||||
|
IOleCommandTarget *olecmd;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
|
TRACE("(%p)\n", doc);
|
||||||
|
|
||||||
|
if(doc->frame)
|
||||||
|
IOleInPlaceFrame_SetStatusText(doc->frame, NULL /* FIXME */);
|
||||||
|
|
||||||
|
if(!doc->client)
|
||||||
|
return;
|
||||||
|
|
||||||
|
hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
|
||||||
|
if(SUCCEEDED(hres)) {
|
||||||
|
VARIANT var;
|
||||||
|
|
||||||
|
V_VT(&var) = VT_I4;
|
||||||
|
V_I4(&var) = 1;
|
||||||
|
|
||||||
|
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER,
|
||||||
|
&var, NULL);
|
||||||
|
IOleCommandTarget_Release(olecmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(doc->hostui) {
|
||||||
|
IDropTarget *drop_target = NULL;
|
||||||
|
|
||||||
|
hres = IDocHostUIHandler_GetDropTarget(doc->hostui, NULL /* FIXME */, &drop_target);
|
||||||
|
if(drop_target) {
|
||||||
|
FIXME("Use IDropTarget\n");
|
||||||
|
IDropTarget_Release(drop_target);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BOOL *bind_complete)
|
static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BOOL *bind_complete)
|
||||||
{
|
{
|
||||||
nsChannelBSC *bscallback;
|
nsChannelBSC *bscallback;
|
||||||
LPOLESTR url = NULL;
|
LPOLESTR url = NULL;
|
||||||
task_t *task;
|
docobj_task_t *task;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
nsresult nsres;
|
nsresult nsres;
|
||||||
|
|
||||||
|
@ -166,22 +243,14 @@ static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BO
|
||||||
bscallback = create_channelbsc(mon);
|
bscallback = create_channelbsc(mon);
|
||||||
|
|
||||||
if(This->doc_obj->frame) {
|
if(This->doc_obj->frame) {
|
||||||
task = heap_alloc(sizeof(task_t));
|
task = heap_alloc(sizeof(docobj_task_t));
|
||||||
|
task->doc = This->doc_obj;
|
||||||
task->doc = This;
|
push_task(&task->header, set_progress_proc, This->doc_obj->basedoc.task_magic);
|
||||||
task->task_id = TASK_SETPROGRESS;
|
|
||||||
task->next = NULL;
|
|
||||||
|
|
||||||
push_task(task);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
task = heap_alloc(sizeof(task_t));
|
task = heap_alloc(sizeof(docobj_task_t));
|
||||||
|
task->doc = This->doc_obj;
|
||||||
task->doc = This;
|
push_task(&task->header, set_downloading_proc, This->doc_obj->basedoc.task_magic);
|
||||||
task->task_id = TASK_SETDOWNLOADSTATE;
|
|
||||||
task->next = NULL;
|
|
||||||
|
|
||||||
push_task(task);
|
|
||||||
|
|
||||||
if(This->doc_obj->nscontainer) {
|
if(This->doc_obj->nscontainer) {
|
||||||
This->doc_obj->nscontainer->bscallback = bscallback;
|
This->doc_obj->nscontainer->bscallback = bscallback;
|
||||||
|
|
|
@ -49,10 +49,14 @@ typedef struct {
|
||||||
struct list entry;
|
struct list entry;
|
||||||
} task_timer_t;
|
} task_timer_t;
|
||||||
|
|
||||||
void push_task(task_t *task)
|
void push_task(task_t *task, task_proc_t proc, LONG magic)
|
||||||
{
|
{
|
||||||
thread_data_t *thread_data = get_thread_data(TRUE);
|
thread_data_t *thread_data = get_thread_data(TRUE);
|
||||||
|
|
||||||
|
task->target_magic = magic;
|
||||||
|
task->proc = proc;
|
||||||
|
task->next = NULL;
|
||||||
|
|
||||||
if(thread_data->task_queue_tail)
|
if(thread_data->task_queue_tail)
|
||||||
thread_data->task_queue_tail->next = task;
|
thread_data->task_queue_tail->next = task;
|
||||||
else
|
else
|
||||||
|
@ -87,7 +91,7 @@ static void release_task_timer(HWND thread_hwnd, task_timer_t *timer)
|
||||||
heap_free(timer);
|
heap_free(timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove_doc_tasks(const HTMLDocument *doc)
|
void remove_target_tasks(LONG target)
|
||||||
{
|
{
|
||||||
thread_data_t *thread_data = get_thread_data(FALSE);
|
thread_data_t *thread_data = get_thread_data(FALSE);
|
||||||
struct list *liter, *ltmp;
|
struct list *liter, *ltmp;
|
||||||
|
@ -99,7 +103,7 @@ void remove_doc_tasks(const HTMLDocument *doc)
|
||||||
|
|
||||||
LIST_FOR_EACH_SAFE(liter, ltmp, &thread_data->timer_list) {
|
LIST_FOR_EACH_SAFE(liter, ltmp, &thread_data->timer_list) {
|
||||||
timer = LIST_ENTRY(liter, task_timer_t, entry);
|
timer = LIST_ENTRY(liter, task_timer_t, entry);
|
||||||
if(timer->doc == doc)
|
if(timer->doc->task_magic == target)
|
||||||
release_task_timer(thread_data->thread_hwnd, timer);
|
release_task_timer(thread_data->thread_hwnd, timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,11 +113,11 @@ void remove_doc_tasks(const HTMLDocument *doc)
|
||||||
}
|
}
|
||||||
|
|
||||||
while(thread_data->task_queue_head
|
while(thread_data->task_queue_head
|
||||||
&& thread_data->task_queue_head->doc == doc)
|
&& thread_data->task_queue_head->target_magic == target)
|
||||||
pop_task();
|
pop_task();
|
||||||
|
|
||||||
for(iter = thread_data->task_queue_head; iter; iter = iter->next) {
|
for(iter = thread_data->task_queue_head; iter; iter = iter->next) {
|
||||||
while(iter->next && iter->next->doc == doc) {
|
while(iter->next && iter->next->target_magic == target) {
|
||||||
tmp = iter->next;
|
tmp = iter->next;
|
||||||
iter->next = tmp->next;
|
iter->next = tmp->next;
|
||||||
heap_free(tmp);
|
heap_free(tmp);
|
||||||
|
@ -124,6 +128,12 @@ void remove_doc_tasks(const HTMLDocument *doc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LONG get_task_target_magic(void)
|
||||||
|
{
|
||||||
|
static LONG magic = 0x10000000;
|
||||||
|
return InterlockedIncrement(&magic);
|
||||||
|
}
|
||||||
|
|
||||||
static BOOL queue_timer(thread_data_t *thread_data, task_timer_t *timer)
|
static BOOL queue_timer(thread_data_t *thread_data, task_timer_t *timer)
|
||||||
{
|
{
|
||||||
task_timer_t *iter;
|
task_timer_t *iter;
|
||||||
|
@ -191,42 +201,6 @@ HRESULT clear_task_timer(HTMLDocument *doc, BOOL interval, DWORD id)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_downloading(HTMLDocumentObj *doc)
|
|
||||||
{
|
|
||||||
IOleCommandTarget *olecmd;
|
|
||||||
HRESULT hres;
|
|
||||||
|
|
||||||
TRACE("(%p)\n", doc);
|
|
||||||
|
|
||||||
if(doc->frame)
|
|
||||||
IOleInPlaceFrame_SetStatusText(doc->frame, NULL /* FIXME */);
|
|
||||||
|
|
||||||
if(!doc->client)
|
|
||||||
return;
|
|
||||||
|
|
||||||
hres = IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
|
|
||||||
if(SUCCEEDED(hres)) {
|
|
||||||
VARIANT var;
|
|
||||||
|
|
||||||
V_VT(&var) = VT_I4;
|
|
||||||
V_I4(&var) = 1;
|
|
||||||
|
|
||||||
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETDOWNLOADSTATE, OLECMDEXECOPT_DONTPROMPTUSER,
|
|
||||||
&var, NULL);
|
|
||||||
IOleCommandTarget_Release(olecmd);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(doc->hostui) {
|
|
||||||
IDropTarget *drop_target = NULL;
|
|
||||||
|
|
||||||
hres = IDocHostUIHandler_GetDropTarget(doc->hostui, NULL /* FIXME */, &drop_target);
|
|
||||||
if(drop_target) {
|
|
||||||
FIXME("Use IDropTarget\n");
|
|
||||||
IDropTarget_Release(drop_target);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Calls undocumented 69 cmd of CGID_Explorer */
|
/* Calls undocumented 69 cmd of CGID_Explorer */
|
||||||
static void call_explorer_69(HTMLDocumentObj *doc)
|
static void call_explorer_69(HTMLDocumentObj *doc)
|
||||||
{
|
{
|
||||||
|
@ -248,26 +222,26 @@ static void call_explorer_69(HTMLDocumentObj *doc)
|
||||||
FIXME("handle result\n");
|
FIXME("handle result\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_parsecomplete(HTMLDocument *doc)
|
void parse_complete(HTMLDocumentObj *doc)
|
||||||
{
|
{
|
||||||
IOleCommandTarget *olecmd = NULL;
|
IOleCommandTarget *olecmd = NULL;
|
||||||
|
|
||||||
TRACE("(%p)\n", doc);
|
TRACE("(%p)\n", doc);
|
||||||
|
|
||||||
if(doc->doc_obj->usermode == EDITMODE)
|
if(doc->usermode == EDITMODE)
|
||||||
init_editor(doc);
|
init_editor(&doc->basedoc);
|
||||||
|
|
||||||
call_explorer_69(doc->doc_obj);
|
call_explorer_69(doc);
|
||||||
call_property_onchanged(&doc->cp_propnotif, 1005);
|
call_property_onchanged(&doc->basedoc.cp_propnotif, 1005);
|
||||||
call_explorer_69(doc->doc_obj);
|
call_explorer_69(doc);
|
||||||
|
|
||||||
/* FIXME: IE7 calls EnableModelless(TRUE), EnableModelless(FALSE) and sets interactive state here */
|
/* FIXME: IE7 calls EnableModelless(TRUE), EnableModelless(FALSE) and sets interactive state here */
|
||||||
|
|
||||||
doc->doc_obj->readystate = READYSTATE_INTERACTIVE;
|
doc->readystate = READYSTATE_INTERACTIVE;
|
||||||
call_property_onchanged(&doc->cp_propnotif, DISPID_READYSTATE);
|
call_property_onchanged(&doc->basedoc.cp_propnotif, DISPID_READYSTATE);
|
||||||
|
|
||||||
if(doc->doc_obj->client)
|
if(doc->client)
|
||||||
IOleClientSite_QueryInterface(doc->doc_obj->client, &IID_IOleCommandTarget, (void**)&olecmd);
|
IOleClientSite_QueryInterface(doc->client, &IID_IOleCommandTarget, (void**)&olecmd);
|
||||||
|
|
||||||
if(olecmd) {
|
if(olecmd) {
|
||||||
VARIANT state, progress;
|
VARIANT state, progress;
|
||||||
|
@ -289,80 +263,15 @@ static void set_parsecomplete(HTMLDocument *doc)
|
||||||
IOleCommandTarget_Release(olecmd);
|
IOleCommandTarget_Release(olecmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
doc->doc_obj->readystate = READYSTATE_COMPLETE;
|
doc->readystate = READYSTATE_COMPLETE;
|
||||||
call_property_onchanged(&doc->cp_propnotif, DISPID_READYSTATE);
|
call_property_onchanged(&doc->basedoc.cp_propnotif, DISPID_READYSTATE);
|
||||||
|
|
||||||
if(doc->doc_obj->frame) {
|
if(doc->frame) {
|
||||||
static const WCHAR wszDone[] = {'D','o','n','e',0};
|
static const WCHAR wszDone[] = {'D','o','n','e',0};
|
||||||
IOleInPlaceFrame_SetStatusText(doc->doc_obj->frame, wszDone);
|
IOleInPlaceFrame_SetStatusText(doc->frame, wszDone);
|
||||||
}
|
}
|
||||||
|
|
||||||
update_title(doc->doc_obj);
|
update_title(doc);
|
||||||
}
|
|
||||||
|
|
||||||
static void set_progress(HTMLDocument *doc)
|
|
||||||
{
|
|
||||||
IOleCommandTarget *olecmd = NULL;
|
|
||||||
HRESULT hres;
|
|
||||||
|
|
||||||
TRACE("(%p)\n", doc);
|
|
||||||
|
|
||||||
if(doc->doc_obj->client)
|
|
||||||
IOleClientSite_QueryInterface(doc->doc_obj->client, &IID_IOleCommandTarget, (void**)&olecmd);
|
|
||||||
|
|
||||||
if(olecmd) {
|
|
||||||
VARIANT progress_max, progress;
|
|
||||||
|
|
||||||
V_VT(&progress_max) = VT_I4;
|
|
||||||
V_I4(&progress_max) = 0; /* FIXME */
|
|
||||||
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSMAX, OLECMDEXECOPT_DONTPROMPTUSER,
|
|
||||||
&progress_max, NULL);
|
|
||||||
|
|
||||||
V_VT(&progress) = VT_I4;
|
|
||||||
V_I4(&progress) = 0; /* FIXME */
|
|
||||||
IOleCommandTarget_Exec(olecmd, NULL, OLECMDID_SETPROGRESSPOS, OLECMDEXECOPT_DONTPROMPTUSER,
|
|
||||||
&progress, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(doc->doc_obj->usermode == EDITMODE && doc->doc_obj->hostui) {
|
|
||||||
DOCHOSTUIINFO hostinfo;
|
|
||||||
|
|
||||||
memset(&hostinfo, 0, sizeof(DOCHOSTUIINFO));
|
|
||||||
hostinfo.cbSize = sizeof(DOCHOSTUIINFO);
|
|
||||||
hres = IDocHostUIHandler_GetHostInfo(doc->doc_obj->hostui, &hostinfo);
|
|
||||||
if(SUCCEEDED(hres))
|
|
||||||
/* FIXME: use hostinfo */
|
|
||||||
TRACE("hostinfo = {%u %08x %08x %s %s}\n",
|
|
||||||
hostinfo.cbSize, hostinfo.dwFlags, hostinfo.dwDoubleClick,
|
|
||||||
debugstr_w(hostinfo.pchHostCss), debugstr_w(hostinfo.pchHostNS));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void task_start_binding(HTMLDocument *doc, BSCallback *bscallback)
|
|
||||||
{
|
|
||||||
if(doc)
|
|
||||||
start_binding(doc, bscallback, NULL);
|
|
||||||
IUnknown_Release((IUnknown*)bscallback);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void process_task(task_t *task)
|
|
||||||
{
|
|
||||||
switch(task->task_id) {
|
|
||||||
case TASK_SETDOWNLOADSTATE:
|
|
||||||
set_downloading(task->doc->doc_obj);
|
|
||||||
break;
|
|
||||||
case TASK_PARSECOMPLETE:
|
|
||||||
set_parsecomplete(task->doc);
|
|
||||||
break;
|
|
||||||
case TASK_SETPROGRESS:
|
|
||||||
set_progress(task->doc);
|
|
||||||
break;
|
|
||||||
case TASK_START_BINDING:
|
|
||||||
task_start_binding(task->doc, (BSCallback*)task->bscallback);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
ERR("Wrong task_id %d\n", task->task_id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void call_timer_disp(IDispatch *disp)
|
static void call_timer_disp(IDispatch *disp)
|
||||||
|
@ -433,7 +342,7 @@ static LRESULT WINAPI hidden_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lPa
|
||||||
if(!task)
|
if(!task)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
process_task(task);
|
task->proc(task);
|
||||||
heap_free(task);
|
heap_free(task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue