mshtml: Store HTMLDocument reference in HTMLTxtRange object.
This commit is contained in:
parent
9ca3a22487
commit
cfaf00fa51
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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*);
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue