mshtml: Moved binding list to HTMLDocumentNode.
This commit is contained in:
parent
12bddc55ed
commit
745f601d23
|
@ -1825,6 +1825,7 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob
|
|||
|
||||
doc->basedoc.window = window;
|
||||
|
||||
list_init(&doc->bindings);
|
||||
list_init(&doc->selection_list);
|
||||
list_init(&doc->range_list);
|
||||
|
||||
|
@ -1972,7 +1973,6 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
|
|||
doc->ref = 1;
|
||||
doc->basedoc.doc_obj = doc;
|
||||
|
||||
list_init(&doc->bindings);
|
||||
doc->usermode = UNKNOWN_USERMODE;
|
||||
doc->readystate = READYSTATE_UNINITIALIZED;
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ static struct list window_list = LIST_INIT(window_list);
|
|||
static void window_set_docnode(HTMLWindow *window, HTMLDocumentNode *doc_node)
|
||||
{
|
||||
if(window->doc) {
|
||||
abort_document_bindings(window->doc);
|
||||
window->doc->basedoc.window = NULL;
|
||||
htmldoc_release(&window->doc->basedoc);
|
||||
}
|
||||
|
@ -158,6 +159,7 @@ static ULONG WINAPI HTMLWindow2_Release(IHTMLWindow2 *iface)
|
|||
if(!ref) {
|
||||
DWORD i;
|
||||
|
||||
remove_target_tasks(This->task_magic);
|
||||
set_window_bscallback(This, NULL);
|
||||
set_current_mon(This, NULL);
|
||||
window_set_docnode(This, NULL);
|
||||
|
@ -1584,6 +1586,7 @@ HRESULT HTMLWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, HTML
|
|||
window->scriptmode = SCRIPTMODE_GECKO;
|
||||
list_init(&window->script_hosts);
|
||||
|
||||
window->task_magic = get_task_target_magic();
|
||||
update_window_doc(window);
|
||||
|
||||
list_init(&window->children);
|
||||
|
|
|
@ -213,6 +213,7 @@ struct HTMLWindow {
|
|||
LONG ref;
|
||||
|
||||
windowref_t *window_ref;
|
||||
LONG task_magic;
|
||||
|
||||
HTMLDocumentNode *doc;
|
||||
HTMLDocumentObj *doc_obj;
|
||||
|
@ -362,9 +363,6 @@ struct HTMLDocumentObj {
|
|||
LPWSTR mime;
|
||||
|
||||
DWORD update;
|
||||
|
||||
/* FIXME: probably should be in document node object */
|
||||
struct list bindings;
|
||||
};
|
||||
|
||||
typedef struct {
|
||||
|
@ -501,6 +499,7 @@ struct HTMLDocumentNode {
|
|||
mutation_queue_t *mutation_queue;
|
||||
mutation_queue_t *mutation_queue_tail;
|
||||
|
||||
struct list bindings;
|
||||
struct list selection_list;
|
||||
struct list range_list;
|
||||
};
|
||||
|
@ -663,10 +662,10 @@ nsresult get_nsinterface(nsISupports*,REFIID,void**);
|
|||
|
||||
void set_window_bscallback(HTMLWindow*,nsChannelBSC*);
|
||||
void set_current_mon(HTMLWindow*,IMoniker*);
|
||||
HRESULT start_binding(HTMLDocument*,BSCallback*,IBindCtx*);
|
||||
void detach_document_bindings(HTMLDocumentObj*);
|
||||
HRESULT start_binding(HTMLWindow*,HTMLDocumentNode*,BSCallback*,IBindCtx*);
|
||||
void abort_document_bindings(HTMLDocumentNode*);
|
||||
|
||||
HRESULT bind_mon_to_buffer(HTMLDocument*,IMoniker*,void**,DWORD*);
|
||||
HRESULT bind_mon_to_buffer(HTMLDocumentNode*,IMoniker*,void**,DWORD*);
|
||||
|
||||
nsChannelBSC *create_channelbsc(IMoniker*);
|
||||
HRESULT channelbsc_load_stream(nsChannelBSC*,IStream*);
|
||||
|
|
|
@ -84,7 +84,7 @@ struct BSCallback {
|
|||
IMoniker *mon;
|
||||
IBinding *binding;
|
||||
|
||||
HTMLDocument *doc;
|
||||
HTMLDocumentNode *doc;
|
||||
|
||||
struct list entry;
|
||||
};
|
||||
|
@ -315,7 +315,7 @@ static HRESULT WINAPI BindStatusCallback_OnStartBinding(IBindStatusCallback *ifa
|
|||
This->binding = pbind;
|
||||
|
||||
if(This->doc)
|
||||
list_add_head(&This->doc->doc_obj->bindings, &This->entry);
|
||||
list_add_head(&This->doc->bindings, &This->entry);
|
||||
|
||||
return This->vtbl->start_binding(This);
|
||||
}
|
||||
|
@ -707,7 +707,7 @@ static void parse_post_data(nsIInputStream *post_data_stream, LPWSTR *headers_re
|
|||
*post_data_len_ret = post_data_len;
|
||||
}
|
||||
|
||||
HRESULT start_binding(HTMLDocument *doc, BSCallback *bscallback, IBindCtx *bctx)
|
||||
HRESULT start_binding(HTMLWindow *window, HTMLDocumentNode *doc, BSCallback *bscallback, IBindCtx *bctx)
|
||||
{
|
||||
IStream *str = NULL;
|
||||
HRESULT hres;
|
||||
|
@ -716,7 +716,8 @@ HRESULT start_binding(HTMLDocument *doc, BSCallback *bscallback, IBindCtx *bctx)
|
|||
|
||||
/* NOTE: IE7 calls IsSystemMoniker here*/
|
||||
|
||||
call_docview_84(doc->doc_obj);
|
||||
if(window)
|
||||
call_docview_84(window->doc_obj);
|
||||
|
||||
if(bctx) {
|
||||
RegisterBindStatusCallback(bctx, STATUSCLB(bscallback), NULL, 0);
|
||||
|
@ -848,14 +849,14 @@ static BufferBSC *create_bufferbsc(IMoniker *mon)
|
|||
return ret;
|
||||
}
|
||||
|
||||
HRESULT bind_mon_to_buffer(HTMLDocument *doc, IMoniker *mon, void **buf, DWORD *size)
|
||||
HRESULT bind_mon_to_buffer(HTMLDocumentNode *doc, IMoniker *mon, void **buf, DWORD *size)
|
||||
{
|
||||
BufferBSC *bsc = create_bufferbsc(mon);
|
||||
HRESULT hres;
|
||||
|
||||
*buf = NULL;
|
||||
|
||||
hres = start_binding(doc, &bsc->bsc, NULL);
|
||||
hres = start_binding(NULL, doc, &bsc->bsc, NULL);
|
||||
if(SUCCEEDED(hres)) {
|
||||
hres = bsc->hres;
|
||||
if(SUCCEEDED(hres)) {
|
||||
|
@ -874,6 +875,8 @@ HRESULT bind_mon_to_buffer(HTMLDocument *doc, IMoniker *mon, void **buf, DWORD *
|
|||
struct nsChannelBSC {
|
||||
BSCallback bsc;
|
||||
|
||||
HTMLWindow *window;
|
||||
|
||||
nsChannel *nschannel;
|
||||
nsIStreamListener *nslistener;
|
||||
nsISupports *nscontext;
|
||||
|
@ -950,11 +953,12 @@ static HRESULT read_stream_data(nsChannelBSC *This, IStream *stream)
|
|||
|
||||
on_start_nsrequest(This);
|
||||
|
||||
if(This->window)
|
||||
update_window_doc(This->window);
|
||||
|
||||
/* events are reset when a new document URI is loaded, so re-initialise them here */
|
||||
if(This->bsc.doc && This->bsc.doc->window->bscallback == This && This->bsc.doc->doc_obj->nscontainer) {
|
||||
update_window_doc(This->bsc.doc->window);
|
||||
init_nsevents(This->bsc.doc->doc_obj->nscontainer);
|
||||
}
|
||||
if(This->window && This->window->doc_obj->basedoc.window == This->window)
|
||||
init_nsevents(This->window->doc_obj->nscontainer);
|
||||
}
|
||||
|
||||
This->bsc.readed += This->nsstream->buf_size;
|
||||
|
@ -1109,27 +1113,32 @@ IMoniker *get_channelbsc_mon(nsChannelBSC *This)
|
|||
|
||||
void set_window_bscallback(HTMLWindow *window, nsChannelBSC *callback)
|
||||
{
|
||||
BSCallback *iter;
|
||||
|
||||
if(window->bscallback) {
|
||||
if(window->bscallback->bsc.binding)
|
||||
IBinding_Abort(window->bscallback->bsc.binding);
|
||||
window->bscallback->bsc.doc = NULL;
|
||||
window->bscallback->window = NULL;
|
||||
IBindStatusCallback_Release(STATUSCLB(&window->bscallback->bsc));
|
||||
}
|
||||
|
||||
if(window->doc_obj) {
|
||||
LIST_FOR_EACH_ENTRY(iter, &window->doc_obj->bindings, BSCallback, entry) {
|
||||
iter->doc = NULL;
|
||||
list_remove(&iter->entry);
|
||||
}
|
||||
}
|
||||
|
||||
window->bscallback = callback;
|
||||
|
||||
if(callback) {
|
||||
callback->window = window;
|
||||
IBindStatusCallback_AddRef(STATUSCLB(&callback->bsc));
|
||||
callback->bsc.doc = &window->doc_obj->basedoc;
|
||||
callback->bsc.doc = window->doc;
|
||||
}
|
||||
}
|
||||
|
||||
void abort_document_bindings(HTMLDocumentNode *doc)
|
||||
{
|
||||
BSCallback *iter;
|
||||
|
||||
LIST_FOR_EACH_ENTRY(iter, &doc->bindings, BSCallback, entry) {
|
||||
if(iter->binding)
|
||||
IBinding_Abort(iter->binding);
|
||||
iter->doc = NULL;
|
||||
list_remove(&iter->entry);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -726,7 +726,7 @@ static HTMLWindow *get_channel_window(nsChannel *This)
|
|||
|
||||
typedef struct {
|
||||
task_t header;
|
||||
HTMLDocument *doc;
|
||||
HTMLDocumentNode *doc;
|
||||
nsChannelBSC *bscallback;
|
||||
} start_binding_task_t;
|
||||
|
||||
|
@ -734,7 +734,21 @@ 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);
|
||||
start_binding(NULL, task->doc, (BSCallback*)task->bscallback, NULL);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
task_t header;
|
||||
HTMLWindow *window;
|
||||
nsChannelBSC *bscallback;
|
||||
} start_doc_binding_task_t;
|
||||
|
||||
static void start_doc_binding_proc(task_t *_task)
|
||||
{
|
||||
start_doc_binding_task_t *task = (start_doc_binding_task_t*)_task;
|
||||
|
||||
start_binding(task->window, NULL, (BSCallback*)task->bscallback, NULL);
|
||||
IUnknown_Release((IUnknown*)task->bscallback);
|
||||
}
|
||||
|
||||
static nsresult async_open(nsChannel *This, HTMLWindow *window, BOOL is_doc_channel, nsIStreamListener *listener,
|
||||
|
@ -742,7 +756,6 @@ static nsresult async_open(nsChannel *This, HTMLWindow *window, BOOL is_doc_chan
|
|||
{
|
||||
nsChannelBSC *bscallback;
|
||||
IMoniker *mon = NULL;
|
||||
start_binding_task_t *task;
|
||||
HRESULT hres;
|
||||
|
||||
hres = create_mon_for_nschannel(This, &mon);
|
||||
|
@ -757,12 +770,22 @@ static nsresult async_open(nsChannel *This, HTMLWindow *window, BOOL is_doc_chan
|
|||
|
||||
channelbsc_set_channel(bscallback, This, listener, context);
|
||||
|
||||
task = heap_alloc(sizeof(start_binding_task_t));
|
||||
if(is_doc_channel) {
|
||||
start_doc_binding_task_t *task;
|
||||
|
||||
task->doc = &window->doc_obj->basedoc;
|
||||
task->bscallback = bscallback;
|
||||
set_window_bscallback(window, bscallback);
|
||||
|
||||
push_task(&task->header, start_binding_proc, window->doc_obj->basedoc.task_magic);
|
||||
task = heap_alloc(sizeof(start_doc_binding_task_t));
|
||||
task->window = window;
|
||||
task->bscallback = bscallback;
|
||||
push_task(&task->header, start_doc_binding_proc, window->task_magic);
|
||||
}else {
|
||||
start_binding_task_t *task = heap_alloc(sizeof(start_binding_task_t));
|
||||
|
||||
task->doc = window->doc;
|
||||
task->bscallback = bscallback;
|
||||
push_task(&task->header, start_binding_proc, window->doc->basedoc.task_magic);
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
}
|
||||
|
|
|
@ -361,7 +361,7 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva
|
|||
return hres;
|
||||
|
||||
if(!bind_complete)
|
||||
return start_binding(This, (BSCallback*)This->window->bscallback, pibc);
|
||||
return start_binding(This->window, NULL, (BSCallback*)This->window->bscallback, pibc);
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
|
|
@ -645,7 +645,7 @@ static void parse_extern_script(ScriptHost *script_host, LPCWSTR src)
|
|||
if(FAILED(hres))
|
||||
return;
|
||||
|
||||
hres = bind_mon_to_buffer(&script_host->window->doc_obj->basedoc, mon, (void**)&buf, &size);
|
||||
hres = bind_mon_to_buffer(script_host->window->doc, mon, (void**)&buf, &size);
|
||||
IMoniker_Release(mon);
|
||||
if(FAILED(hres))
|
||||
return;
|
||||
|
|
Loading…
Reference in New Issue