mshtml: Store HTMLDocument reference in HTMLTxtRange object.

oldstable
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);
}
*range = HTMLTxtRange_Create(nsrange);
*range = HTMLTxtRange_Create(This->element->node->doc, nsrange);
return S_OK;
}

View File

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

View File

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

View File

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

View File

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