From cfaf00fa51d4812ba25a221b78e76f514f58487b Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Fri, 17 Aug 2007 02:37:01 +0200 Subject: [PATCH] mshtml: Store HTMLDocument reference in HTMLTxtRange object. --- dlls/mshtml/htmlbody.c | 2 +- dlls/mshtml/htmldoc.c | 2 ++ dlls/mshtml/mshtml_private.h | 4 +++- dlls/mshtml/selection.c | 2 +- dlls/mshtml/txtrange.c | 21 +++++++++++++++++++-- 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c index 40d8983acc7..b6b78f6a2d4 100644 --- a/dlls/mshtml/htmlbody.c +++ b/dlls/mshtml/htmlbody.c @@ -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; } diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c index f70b96eea94..19da49aee05 100644 --- a/dlls/mshtml/htmldoc.c +++ b/dlls/mshtml/htmldoc.c @@ -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)) { diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 69472ffc531..63e202797ea 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -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*); diff --git a/dlls/mshtml/selection.c b/dlls/mshtml/selection.c index 1ee3b971810..4139d3b04c3 100644 --- a/dlls/mshtml/selection.c +++ b/dlls/mshtml/selection.c @@ -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; } diff --git a/dlls/mshtml/txtrange.c b/dlls/mshtml/txtrange.c index ae90e8191a9..70791a38c9c 100644 --- a/dlls/mshtml/txtrange.c +++ b/dlls/mshtml/txtrange.c @@ -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; + } +}