mshtml: Moved nsIDocumentObserver implementation to HTMLDocumentNode object.

This commit is contained in:
Jacek Caban 2009-10-21 21:28:09 +02:00 committed by Alexandre Julliard
parent f9eff68891
commit 5894e3be75
4 changed files with 74 additions and 75 deletions

View File

@ -1811,6 +1811,7 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob
doc->basedoc.doc_node = doc;
doc->basedoc.doc_obj = doc_obj;
init_mutation(doc);
init_dispex(&doc->node.dispex, (IUnknown*)HTMLDOMNODE(&doc->node), &HTMLDocumentNode_dispex);
init_doc(&doc->basedoc, (IUnknown*)HTMLDOMNODE(&doc->node), DISPATCHEX(&doc->node.dispex));
HTMLDocumentNode_SecMgr_Init(doc);
@ -1887,7 +1888,7 @@ static ULONG WINAPI CustomDoc_Release(ICustomDoc *iface)
set_current_mon(&This->basedoc, NULL);
if(This->basedoc.doc_node) {
if(This->basedoc.doc_node->nsdoc)
remove_mutation_observer(This->nscontainer, This->basedoc.doc_node->nsdoc);
remove_mutation_observer(This->basedoc.doc_node);
This->basedoc.doc_node->basedoc.doc_obj = NULL;
IHTMLDocument2_Release(HTMLDOC(&This->basedoc.doc_node->basedoc));
}

View File

@ -360,13 +360,6 @@ typedef struct {
NSContainer *This;
} nsEventListener;
typedef struct _mutation_queue_t {
DWORD type;
nsISupports *nsiface;
struct _mutation_queue_t *next;
} mutation_queue_t;
struct NSContainer {
const nsIWebBrowserChromeVtbl *lpWebBrowserChromeVtbl;
const nsIContextMenuListenerVtbl *lpContextMenuListenerVtbl;
@ -377,10 +370,6 @@ struct NSContainer {
const nsIWeakReferenceVtbl *lpWeakReferenceVtbl;
const nsISupportsWeakReferenceVtbl *lpSupportsWeakReferenceVtbl;
const nsIDocumentObserverVtbl *lpDocumentObserverVtbl;
const nsIRunnableVtbl *lpRunnableVtbl;
nsEventListener blur_listener;
nsEventListener focus_listener;
nsEventListener keypress_listener;
@ -404,9 +393,6 @@ struct NSContainer {
HWND hwnd;
mutation_queue_t *mutation_queue;
mutation_queue_t *mutation_queue_tail;
nsChannelBSC *bscallback; /* hack */
HWND reset_focus; /* hack */
};
@ -476,12 +462,22 @@ typedef struct {
ConnectionPoint cp;
} HTMLTextContainer;
typedef struct _mutation_queue_t {
DWORD type;
nsISupports *nsiface;
struct _mutation_queue_t *next;
} mutation_queue_t;
struct HTMLDocumentNode {
HTMLDOMNode node;
HTMLDocument basedoc;
const IInternetHostSecurityManagerVtbl *lpIInternetHostSecurityManagerVtbl;
const nsIDocumentObserverVtbl *lpIDocumentObserverVtbl;
const nsIRunnableVtbl *lpIRunnableVtbl;
LONG ref;
nsIDOMHTMLDocument *nsdoc;
@ -490,6 +486,9 @@ struct HTMLDocumentNode {
IInternetSecurityManager *secmgr;
mutation_queue_t *mutation_queue;
mutation_queue_t *mutation_queue_tail;
struct list selection_list;
struct list range_list;
};
@ -534,9 +533,9 @@ struct HTMLDocumentNode {
#define NSWEAKREF(x) ((nsIWeakReference*) &(x)->lpWeakReferenceVtbl)
#define NSSUPWEAKREF(x) ((nsISupportsWeakReference*) &(x)->lpSupportsWeakReferenceVtbl)
#define NSDOCOBS(x) ((nsIDocumentObserver*) &(x)->lpDocumentObserverVtbl)
#define NSDOCOBS(x) ((nsIDocumentObserver*) &(x)->lpIDocumentObserverVtbl)
#define NSRUNNABLE(x) ((nsIRunnable*) &(x)->lpRunnableVtbl)
#define NSRUNNABLE(x) ((nsIRunnable*) &(x)->lpIRunnableVtbl)
#define NSCHANNEL(x) ((nsIChannel*) &(x)->lpHttpChannelVtbl)
#define NSHTTPCHANNEL(x) ((nsIHttpChannel*) &(x)->lpHttpChannelVtbl)
@ -601,9 +600,9 @@ void ConnectionPointContainer_Destroy(ConnectionPointContainer*);
NSContainer *NSContainer_Create(HTMLDocumentObj*,NSContainer*);
void NSContainer_Release(NSContainer*);
void init_mutation(NSContainer*);
void set_mutation_observer(NSContainer*,nsIDOMHTMLDocument*);
void remove_mutation_observer(NSContainer*,nsIDOMHTMLDocument*);
void init_mutation(HTMLDocumentNode*);
void set_mutation_observer(HTMLDocumentNode*);
void remove_mutation_observer(HTMLDocumentNode*);
void HTMLDocument_LockContainer(HTMLDocumentObj*,BOOL);
void show_context_menu(HTMLDocumentObj*,DWORD,POINT*,IDispatch*);

View File

@ -40,33 +40,33 @@ enum {
MUTATION_SCRIPT
};
void set_mutation_observer(NSContainer *nscontainer, nsIDOMHTMLDocument *nshtmldoc)
void set_mutation_observer(HTMLDocumentNode *doc)
{
nsIDOMNSDocument *nsdoc;
nsresult nsres;
nsres = nsIDOMHTMLDocument_QueryInterface(nshtmldoc, &IID_nsIDOMNSDocument, (void**)&nsdoc);
nsres = nsIDOMHTMLDocument_QueryInterface(doc->nsdoc, &IID_nsIDOMNSDocument, (void**)&nsdoc);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMNSDocument: %08x\n", nsres);
return;
}
nsIDOMNSDocument_WineAddObserver(nsdoc, NSDOCOBS(nscontainer));
nsIDOMNSDocument_WineAddObserver(nsdoc, NSDOCOBS(doc));
nsIDOMNSDocument_Release(nsdoc);
}
void remove_mutation_observer(NSContainer *nscontainer, nsIDOMHTMLDocument *nshtmldoc)
void remove_mutation_observer(HTMLDocumentNode *doc)
{
nsIDOMNSDocument *nsdoc;
nsresult nsres;
nsres = nsIDOMHTMLDocument_QueryInterface(nshtmldoc, &IID_nsIDOMNSDocument, (void**)&nsdoc);
nsres = nsIDOMHTMLDocument_QueryInterface(doc->nsdoc, &IID_nsIDOMNSDocument, (void**)&nsdoc);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMNSDocument: %08x\n", nsres);
return;
}
nsIDOMNSDocument_WineRemoveObserver(nsdoc, NSDOCOBS(nscontainer));
nsIDOMNSDocument_WineRemoveObserver(nsdoc, NSDOCOBS(doc));
nsIDOMNSDocument_Release(nsdoc);
}
@ -209,12 +209,12 @@ static BOOL handle_insert_comment(HTMLDocumentNode *doc, const PRUnichar *commen
return TRUE;
}
static void add_script_runner(NSContainer *This)
static void add_script_runner(HTMLDocumentNode *This)
{
nsIDOMNSDocument *nsdoc;
nsresult nsres;
nsres = nsIDOMHTMLDocument_QueryInterface(This->doc->basedoc.doc_node->nsdoc, &IID_nsIDOMNSDocument, (void**)&nsdoc);
nsres = nsIDOMHTMLDocument_QueryInterface(This->nsdoc, &IID_nsIDOMNSDocument, (void**)&nsdoc);
if(NS_FAILED(nsres)) {
ERR("Could not get nsIDOMNSDocument: %08x\n", nsres);
return;
@ -224,12 +224,12 @@ static void add_script_runner(NSContainer *This)
nsIDOMNSDocument_Release(nsdoc);
}
#define NSRUNNABLE_THIS(iface) DEFINE_THIS(NSContainer, Runnable, iface)
#define NSRUNNABLE_THIS(iface) DEFINE_THIS(HTMLDocumentNode, IRunnable, iface)
static nsresult NSAPI nsRunnable_QueryInterface(nsIRunnable *iface,
nsIIDRef riid, nsQIResult result)
{
NSContainer *This = NSRUNNABLE_THIS(iface);
HTMLDocumentNode *This = NSRUNNABLE_THIS(iface);
if(IsEqualGUID(riid, &IID_nsISupports)) {
TRACE("(%p)->(IID_nsISupports %p)\n", This, result);
@ -249,26 +249,26 @@ static nsresult NSAPI nsRunnable_QueryInterface(nsIRunnable *iface,
static nsrefcnt NSAPI nsRunnable_AddRef(nsIRunnable *iface)
{
NSContainer *This = NSRUNNABLE_THIS(iface);
return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
HTMLDocumentNode *This = NSRUNNABLE_THIS(iface);
return htmldoc_addref(&This->basedoc);
}
static nsrefcnt NSAPI nsRunnable_Release(nsIRunnable *iface)
{
NSContainer *This = NSRUNNABLE_THIS(iface);
return nsIWebBrowserChrome_Release(NSWBCHROME(This));
HTMLDocumentNode *This = NSRUNNABLE_THIS(iface);
return htmldoc_release(&This->basedoc);
}
static void pop_mutation_queue(NSContainer *nscontainer)
static void pop_mutation_queue(HTMLDocumentNode *doc)
{
mutation_queue_t *tmp = nscontainer->mutation_queue;
mutation_queue_t *tmp = doc->mutation_queue;
if(!tmp)
return;
nscontainer->mutation_queue = tmp->next;
doc->mutation_queue = tmp->next;
if(!tmp->next)
nscontainer->mutation_queue_tail = NULL;
doc->mutation_queue_tail = NULL;
nsISupports_Release(tmp->nsiface);
heap_free(tmp);
@ -276,7 +276,7 @@ static void pop_mutation_queue(NSContainer *nscontainer)
static nsresult NSAPI nsRunnable_Run(nsIRunnable *iface)
{
NSContainer *This = NSRUNNABLE_THIS(iface);
HTMLDocumentNode *This = NSRUNNABLE_THIS(iface);
nsresult nsres;
TRACE("(%p)\n", This);
@ -300,7 +300,7 @@ static nsresult NSAPI nsRunnable_Run(nsIRunnable *iface)
const PRUnichar *comment;
nsAString_GetData(&comment_str, &comment);
remove_comment = handle_insert_comment(This->doc->basedoc.doc_node, comment);
remove_comment = handle_insert_comment(This, comment);
}
nsAString_Finish(&comment_str);
@ -340,7 +340,7 @@ static nsresult NSAPI nsRunnable_Run(nsIRunnable *iface)
break;
}
doc_insert_script(This->doc->basedoc.window, nsscript);
doc_insert_script(This->basedoc.window, nsscript);
nsIDOMHTMLScriptElement_Release(nsscript);
break;
}
@ -364,12 +364,12 @@ static const nsIRunnableVtbl nsRunnableVtbl = {
nsRunnable_Run
};
#define NSDOCOBS_THIS(iface) DEFINE_THIS(NSContainer, DocumentObserver, iface)
#define NSDOCOBS_THIS(iface) DEFINE_THIS(HTMLDocumentNode, IDocumentObserver, iface)
static nsresult NSAPI nsDocumentObserver_QueryInterface(nsIDocumentObserver *iface,
nsIIDRef riid, nsQIResult result)
{
NSContainer *This = NSDOCOBS_THIS(iface);
HTMLDocumentNode *This = NSDOCOBS_THIS(iface);
if(IsEqualGUID(&IID_nsISupports, riid)) {
TRACE("(%p)->(IID_nsISupports, %p)\n", This, result);
@ -386,20 +386,20 @@ static nsresult NSAPI nsDocumentObserver_QueryInterface(nsIDocumentObserver *ifa
return NS_NOINTERFACE;
}
nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
htmldoc_addref(&This->basedoc);
return NS_OK;
}
static nsrefcnt NSAPI nsDocumentObserver_AddRef(nsIDocumentObserver *iface)
{
NSContainer *This = NSDOCOBS_THIS(iface);
return nsIWebBrowserChrome_AddRef(NSWBCHROME(This));
HTMLDocumentNode *This = NSDOCOBS_THIS(iface);
return htmldoc_addref(&This->basedoc);
}
static nsrefcnt NSAPI nsDocumentObserver_Release(nsIDocumentObserver *iface)
{
NSContainer *This = NSDOCOBS_THIS(iface);
return nsIWebBrowserChrome_Release(NSWBCHROME(This));
HTMLDocumentNode *This = NSDOCOBS_THIS(iface);
return htmldoc_release(&This->basedoc);
}
static void NSAPI nsDocumentObserver_CharacterDataWillChange(nsIDocumentObserver *iface,
@ -461,24 +461,26 @@ static void NSAPI nsDocumentObserver_BeginLoad(nsIDocumentObserver *iface, nsIDo
static void NSAPI nsDocumentObserver_EndLoad(nsIDocumentObserver *iface, nsIDocument *aDocument)
{
NSContainer *This = NSDOCOBS_THIS(iface);
task_t *task;
HTMLDocumentNode *This = NSDOCOBS_THIS(iface);
TRACE("\n");
This->doc->basedoc.doc_node->content_ready = TRUE;
This->content_ready = TRUE;
task = heap_alloc(sizeof(task_t));
if(This == This->basedoc.doc_obj->basedoc.doc_node) {
task_t *task;
task = heap_alloc(sizeof(task_t));
task->doc = &This->doc->basedoc;
task->task_id = TASK_PARSECOMPLETE;
task->next = NULL;
task->doc = &This->basedoc.doc_obj->basedoc;
task->task_id = TASK_PARSECOMPLETE;
task->next = NULL;
/*
* This should be done in the worker thread that parses HTML,
* but we don't have such thread (Gecko parses HTML for us).
*/
push_task(task);
/*
* This should be done in the worker thread that parses HTML,
* but we don't have such thread (Gecko parses HTML for us).
*/
push_task(task);
}
}
static void NSAPI nsDocumentObserver_ContentStatesChanged(nsIDocumentObserver *iface, nsIDocument *aDocument,
@ -516,7 +518,7 @@ static void NSAPI nsDocumentObserver_StyleRuleRemoved(nsIDocumentObserver *iface
{
}
static void push_mutation_queue(NSContainer *nscontainer, DWORD type, nsISupports *nsiface)
static void push_mutation_queue(HTMLDocumentNode *doc, DWORD type, nsISupports *nsiface)
{
mutation_queue_t *elem;
@ -529,16 +531,16 @@ static void push_mutation_queue(NSContainer *nscontainer, DWORD type, nsISupport
elem->nsiface = nsiface;
nsISupports_AddRef(nsiface);
if(nscontainer->mutation_queue_tail)
nscontainer->mutation_queue_tail = nscontainer->mutation_queue_tail->next = elem;
if(doc->mutation_queue_tail)
doc->mutation_queue_tail = doc->mutation_queue_tail->next = elem;
else
nscontainer->mutation_queue = nscontainer->mutation_queue_tail = elem;
doc->mutation_queue = doc->mutation_queue_tail = elem;
}
static void NSAPI nsDocumentObserver_BindToDocument(nsIDocumentObserver *iface, nsIDocument *aDocument,
nsIContent *aContent)
{
NSContainer *This = NSDOCOBS_THIS(iface);
HTMLDocumentNode *This = NSDOCOBS_THIS(iface);
nsIDOMComment *nscomment;
nsIDOMElement *nselem;
nsresult nsres;
@ -547,7 +549,7 @@ static void NSAPI nsDocumentObserver_BindToDocument(nsIDocumentObserver *iface,
nsres = nsISupports_QueryInterface(aContent, &IID_nsIDOMElement, (void**)&nselem);
if(NS_SUCCEEDED(nsres)) {
check_event_attr(This->doc->basedoc.doc_node, nselem);
check_event_attr(This, nselem);
nsIDOMElement_Release(nselem);
}
@ -564,7 +566,7 @@ static void NSAPI nsDocumentObserver_BindToDocument(nsIDocumentObserver *iface,
static void NSAPI nsDocumentObserver_DoneAddingChildren(nsIDocumentObserver *iface, nsIContent *aContent,
PRBool aHaveNotified)
{
NSContainer *This = NSDOCOBS_THIS(iface);
HTMLDocumentNode *This = NSDOCOBS_THIS(iface);
nsIDOMHTMLScriptElement *nsscript;
nsresult nsres;
@ -608,8 +610,8 @@ static const nsIDocumentObserverVtbl nsDocumentObserverVtbl = {
nsDocumentObserver_DoneAddingChildren
};
void init_mutation(NSContainer *nscontainer)
void init_mutation(HTMLDocumentNode *doc)
{
nscontainer->lpDocumentObserverVtbl = &nsDocumentObserverVtbl;
nscontainer->lpRunnableVtbl = &nsRunnableVtbl;
doc->lpIDocumentObserverVtbl = &nsDocumentObserverVtbl;
doc->lpIRunnableVtbl = &nsRunnableVtbl;
}

View File

@ -837,9 +837,8 @@ void update_nsdocument(HTMLDocumentObj *doc)
}
if(doc->basedoc.doc_node && doc->basedoc.doc_node->nsdoc) {
remove_mutation_observer(doc->nscontainer, doc->basedoc.doc_node->nsdoc);
doc_node = doc->basedoc.doc_node;
remove_mutation_observer(doc_node);
doc_node->basedoc.doc_obj = NULL;
IHTMLDocument2_Release(HTMLDOC(&doc_node->basedoc));
doc->basedoc.doc_node = NULL;
@ -851,14 +850,13 @@ void update_nsdocument(HTMLDocumentObj *doc)
return;
}
set_mutation_observer(doc->nscontainer, nsdoc);
hres = create_doc_from_nsdoc(nsdoc, doc, doc->basedoc.window, &doc_node);
if(FAILED(hres)) {
ERR("Could not create document: %08x\n", hres);
return;
}
set_mutation_observer(doc_node);
doc->basedoc.doc_node = doc_node;
window_set_docnode(doc->basedoc.window, doc_node);
}
@ -1693,7 +1691,6 @@ NSContainer *NSContainer_Create(HTMLDocumentObj *doc, NSContainer *parent)
ret->doc = doc;
ret->ref = 1;
init_mutation(ret);
nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr, NS_WEBBROWSER_CONTRACTID,
NULL, &IID_nsIWebBrowser, (void**)&ret->webbrowser);