mshtml: Store HTMLDocument reference in HTMLTxtRange object.

This commit is contained in:
Jacek Caban 2007-08-17 02:37:01 +02:00 committed by Alexandre Julliard
parent 9ca3a22487
commit cfaf00fa51
5 changed files with 26 additions and 5 deletions

View File

@ -427,7 +427,7 @@ static HRESULT WINAPI HTMLBodyElement_createTextRange(IHTMLBodyElement *iface, I
nsIDOMDocumentRange_Release(nsdocrange); nsIDOMDocumentRange_Release(nsdocrange);
} }
*range = HTMLTxtRange_Create(nsrange); *range = HTMLTxtRange_Create(This->element->node->doc, nsrange);
return S_OK; return S_OK;
} }

View File

@ -173,6 +173,7 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface)
IHTMLWindow2_Release(HTMLWINDOW2(This->window)); IHTMLWindow2_Release(HTMLWINDOW2(This->window));
detach_selection(This); detach_selection(This);
detach_ranges(This);
release_nodes(This); release_nodes(This);
ConnectionPointContainer_Destroy(&This->cp_container); ConnectionPointContainer_Destroy(&This->cp_container);
@ -1130,6 +1131,7 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
ret->window = NULL; ret->window = NULL;
list_init(&ret->selection_list); list_init(&ret->selection_list);
list_init(&ret->range_list);
hres = IHTMLDocument_QueryInterface(HTMLDOC(ret), riid, ppvObject); hres = IHTMLDocument_QueryInterface(HTMLDOC(ret), riid, ppvObject);
if(FAILED(hres)) { if(FAILED(hres)) {

View File

@ -151,6 +151,7 @@ struct HTMLDocument {
ConnectionPoint cp_propnotif; ConnectionPoint cp_propnotif;
struct list selection_list; struct list selection_list;
struct list range_list;
HTMLDOMNode *nodes; HTMLDOMNode *nodes;
}; };
@ -404,11 +405,12 @@ void set_document_bscallback(HTMLDocument*,BSCallback*);
void set_current_mon(HTMLDocument*,IMoniker*); void set_current_mon(HTMLDocument*,IMoniker*);
IHTMLSelectionObject *HTMLSelectionObject_Create(HTMLDocument*,nsISelection*); IHTMLSelectionObject *HTMLSelectionObject_Create(HTMLDocument*,nsISelection*);
IHTMLTxtRange *HTMLTxtRange_Create(nsIDOMRange*); IHTMLTxtRange *HTMLTxtRange_Create(HTMLDocument*,nsIDOMRange*);
IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration*); IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration*);
IHTMLStyleSheet *HTMLStyleSheet_Create(void); IHTMLStyleSheet *HTMLStyleSheet_Create(void);
void detach_selection(HTMLDocument*); void detach_selection(HTMLDocument*);
void detach_ranges(HTMLDocument*);
void HTMLElement_Create(HTMLDOMNode*); void HTMLElement_Create(HTMLDOMNode*);
void HTMLBodyElement_Create(HTMLElement*); void HTMLBodyElement_Create(HTMLElement*);

View File

@ -161,7 +161,7 @@ static HRESULT WINAPI HTMLSelectionObject_createRange(IHTMLSelectionObject *ifac
ERR("GetRangeAt failed: %08x\n", nsres); ERR("GetRangeAt failed: %08x\n", nsres);
} }
*range = (IDispatch*)HTMLTxtRange_Create(nsrange); *range = (IDispatch*)HTMLTxtRange_Create(This->doc, nsrange);
return S_OK; return S_OK;
} }

View File

@ -42,6 +42,9 @@ typedef struct {
LONG ref; LONG ref;
nsIDOMRange *nsrange; nsIDOMRange *nsrange;
HTMLDocument *doc;
struct list entry;
} HTMLTxtRange; } HTMLTxtRange;
#define HTMLTXTRANGE(x) ((IHTMLTxtRange*) &(x)->lpHTMLTxtRangeVtbl) #define HTMLTXTRANGE(x) ((IHTMLTxtRange*) &(x)->lpHTMLTxtRangeVtbl)
@ -94,6 +97,8 @@ static ULONG WINAPI HTMLTxtRange_Release(IHTMLTxtRange *iface)
if(!ref) { if(!ref) {
if(This->nsrange) if(This->nsrange)
nsISelection_Release(This->nsrange); nsISelection_Release(This->nsrange);
if(This->doc)
list_remove(&This->entry);
mshtml_free(This); mshtml_free(This);
} }
@ -229,7 +234,7 @@ static HRESULT WINAPI HTMLTxtRange_duplicate(IHTMLTxtRange *iface, IHTMLTxtRange
TRACE("(%p)->(%p)\n", This, Duplicate); TRACE("(%p)->(%p)\n", This, Duplicate);
nsIDOMRange_CloneRange(This->nsrange, &nsrange); nsIDOMRange_CloneRange(This->nsrange, &nsrange);
*Duplicate = HTMLTxtRange_Create(nsrange); *Duplicate = HTMLTxtRange_Create(This->doc, nsrange);
nsIDOMRange_Release(nsrange); nsIDOMRange_Release(nsrange);
return S_OK; return S_OK;
@ -472,7 +477,7 @@ static const IHTMLTxtRangeVtbl HTMLTxtRangeVtbl = {
HTMLTxtRange_execCommandShowHelp HTMLTxtRange_execCommandShowHelp
}; };
IHTMLTxtRange *HTMLTxtRange_Create(nsIDOMRange *nsrange) IHTMLTxtRange *HTMLTxtRange_Create(HTMLDocument *doc, nsIDOMRange *nsrange)
{ {
HTMLTxtRange *ret = mshtml_alloc(sizeof(HTMLTxtRange)); HTMLTxtRange *ret = mshtml_alloc(sizeof(HTMLTxtRange));
@ -483,5 +488,17 @@ IHTMLTxtRange *HTMLTxtRange_Create(nsIDOMRange *nsrange)
nsIDOMRange_AddRef(nsrange); nsIDOMRange_AddRef(nsrange);
ret->nsrange = nsrange; ret->nsrange = nsrange;
ret->doc = doc;
list_add_head(&doc->range_list, &ret->entry);
return HTMLTXTRANGE(ret); return HTMLTXTRANGE(ret);
} }
void detach_ranges(HTMLDocument *This)
{
HTMLTxtRange *iter;
LIST_FOR_EACH_ENTRY(iter, &This->range_list, HTMLTxtRange, entry) {
iter->doc = NULL;
}
}