Commit d460c673 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

mshtml: Moved range_list to HTMLDocumentNode object.

parent b3c2b380
......@@ -602,6 +602,7 @@ static HRESULT WINAPI HTMLBodyElement_createTextRange(IHTMLBodyElement *iface, I
nsIDOMDocumentRange *nsdocrange;
nsIDOMRange *nsrange = NULL;
nsresult nsres;
HRESULT hres;
TRACE("(%p)->(%p)\n", This, range);
......@@ -628,8 +629,10 @@ static HRESULT WINAPI HTMLBodyElement_createTextRange(IHTMLBodyElement *iface, I
nsIDOMDocumentRange_Release(nsdocrange);
*range = HTMLTxtRange_Create(This->textcont.element.node.doc, nsrange);
return S_OK;
hres = HTMLTxtRange_Create(This->textcont.element.node.doc->doc_node, nsrange, range);
nsIDOMRange_Release(nsrange);
return hres;
}
#undef HTMLBODY_THIS
......
......@@ -1740,7 +1740,6 @@ static void init_doc(HTMLDocument *doc, const htmldoc_vtbl_t *vtbl)
doc->readystate = READYSTATE_UNINITIALIZED;
list_init(&doc->bindings);
list_init(&doc->range_list);
HTMLDocument_HTMLDocument3_Init(doc);
HTMLDocument_HTMLDocument5_Init(doc);
......@@ -1771,7 +1770,6 @@ static void destroy_htmldoc(HTMLDocument *This)
release_event_target(This->event_target);
heap_free(This->mime);
detach_ranges(This);
release_nodes(This);
release_dispex(&This->dispex);
......@@ -1809,6 +1807,7 @@ static ULONG HTMLDocumentNode_Release(HTMLDocument *base)
if(!ref) {
detach_selection(This);
detach_ranges(This);
destroy_htmldoc(&This->basedoc);
heap_free(This);
}
......@@ -1844,6 +1843,7 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob
doc->basedoc.window = window;
list_init(&doc->selection_list);
list_init(&doc->range_list);
*ret = doc;
return S_OK;
......
......@@ -301,8 +301,6 @@ struct HTMLDocument {
ConnectionPoint cp_htmldocevents2;
ConnectionPoint cp_propnotif;
struct list range_list;
HTMLDOMNode *nodes;
};
......@@ -327,6 +325,7 @@ struct HTMLDocumentNode {
LONG ref;
struct list selection_list;
struct list range_list;
};
struct HTMLDocumentObj {
......@@ -638,13 +637,13 @@ void channelbsc_set_channel(nsChannelBSC*,nsChannel*,nsIStreamListener*,nsISuppo
IMoniker *get_channelbsc_mon(nsChannelBSC*);
HRESULT HTMLSelectionObject_Create(HTMLDocumentNode*,nsISelection*,IHTMLSelectionObject**);
IHTMLTxtRange *HTMLTxtRange_Create(HTMLDocument*,nsIDOMRange*);
HRESULT HTMLTxtRange_Create(HTMLDocumentNode*,nsIDOMRange*,IHTMLTxtRange**);
IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration*);
IHTMLStyleSheet *HTMLStyleSheet_Create(nsIDOMStyleSheet*);
IHTMLStyleSheetsCollection *HTMLStyleSheetsCollection_Create(nsIDOMStyleSheetList*);
void detach_selection(HTMLDocumentNode*);
void detach_ranges(HTMLDocument*);
void detach_ranges(HTMLDocumentNode*);
HRESULT get_node_text(HTMLDOMNode*,BSTR*);
HTMLDOMNode *HTMLDOMTextNode_Create(HTMLDocument*,nsIDOMNode*);
......
......@@ -140,7 +140,9 @@ static HRESULT WINAPI HTMLSelectionObject_Invoke(IHTMLSelectionObject *iface, DI
static HRESULT WINAPI HTMLSelectionObject_createRange(IHTMLSelectionObject *iface, IDispatch **range)
{
HTMLSelectionObject *This = HTMLSELOBJ_THIS(iface);
IHTMLTxtRange *range_obj = NULL;
nsIDOMRange *nsrange = NULL;
HRESULT hres;
TRACE("(%p)->(%p)\n", This, range);
......@@ -178,8 +180,11 @@ static HRESULT WINAPI HTMLSelectionObject_createRange(IHTMLSelectionObject *ifac
ERR("GetRangeAt failed: %08x\n", nsres);
}
*range = (IDispatch*)HTMLTxtRange_Create(&This->doc->basedoc, nsrange);
return S_OK;
hres = HTMLTxtRange_Create(This->doc, nsrange, &range_obj);
nsIDOMRange_Release(nsrange);
*range = (IDispatch*)range_obj;
return hres;
}
static HRESULT WINAPI HTMLSelectionObject_empty(IHTMLSelectionObject *iface)
......
......@@ -43,7 +43,7 @@ typedef struct {
LONG ref;
nsIDOMRange *nsrange;
HTMLDocument *doc;
HTMLDocumentNode *doc;
struct list entry;
} HTMLTxtRange;
......@@ -72,7 +72,7 @@ typedef enum {
RU_TEXTEDIT
} range_unit_t;
static HTMLTxtRange *get_range_object(HTMLDocument *doc, IHTMLTxtRange *iface)
static HTMLTxtRange *get_range_object(HTMLDocumentNode *doc, IHTMLTxtRange *iface)
{
HTMLTxtRange *iter;
......@@ -342,7 +342,7 @@ static nsIDOMNode *prev_node(HTMLTxtRange *This, nsIDOMNode *iter)
if(!iter) {
nsIDOMHTMLElement *nselem;
nsIDOMHTMLDocument_GetBody(This->doc->nsdoc, &nselem);
nsIDOMHTMLDocument_GetBody(This->doc->basedoc.nsdoc, &nselem);
nsIDOMElement_GetLastChild(nselem, &tmp);
if(!tmp)
return (nsIDOMNode*)nselem;
......@@ -1139,7 +1139,7 @@ static HRESULT WINAPI HTMLTxtRange_put_text(IHTMLTxtRange *iface, BSTR v)
return MSHTML_E_NODOC;
nsAString_Init(&text_str, v);
nsres = nsIDOMHTMLDocument_CreateTextNode(This->doc->nsdoc, &text_str, &text_node);
nsres = nsIDOMHTMLDocument_CreateTextNode(This->doc->basedoc.nsdoc, &text_str, &text_node);
nsAString_Finish(&text_str);
if(NS_FAILED(nsres)) {
ERR("CreateTextNode failed: %08x\n", nsres);
......@@ -1201,7 +1201,7 @@ static HRESULT WINAPI HTMLTxtRange_parentElement(IHTMLTxtRange *iface, IHTMLElem
return S_OK;
}
node = get_node(This->doc, nsnode, TRUE);
node = get_node(&This->doc->basedoc, nsnode, TRUE);
nsIDOMNode_Release(nsnode);
return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node), &IID_IHTMLElement, (void**)parent);
......@@ -1211,14 +1211,15 @@ static HRESULT WINAPI HTMLTxtRange_duplicate(IHTMLTxtRange *iface, IHTMLTxtRange
{
HTMLTxtRange *This = HTMLTXTRANGE_THIS(iface);
nsIDOMRange *nsrange = NULL;
HRESULT hres;
TRACE("(%p)->(%p)\n", This, Duplicate);
nsIDOMRange_CloneRange(This->nsrange, &nsrange);
*Duplicate = HTMLTxtRange_Create(This->doc, nsrange);
hres = HTMLTxtRange_Create(This->doc, nsrange, Duplicate);
nsIDOMRange_Release(nsrange);
return S_OK;
return hres;
}
static HRESULT WINAPI HTMLTxtRange_inRange(IHTMLTxtRange *iface, IHTMLTxtRange *Range,
......@@ -1347,7 +1348,7 @@ static HRESULT WINAPI HTMLTxtRange_expand(IHTMLTxtRange *iface, BSTR Unit, VARIA
nsIDOMHTMLElement *nsbody = NULL;
nsresult nsres;
nsres = nsIDOMHTMLDocument_GetBody(This->doc->nsdoc, &nsbody);
nsres = nsIDOMHTMLDocument_GetBody(This->doc->basedoc.nsdoc, &nsbody);
if(NS_FAILED(nsres) || !nsbody) {
ERR("Could not get body: %08x\n", nsres);
break;
......@@ -1550,7 +1551,7 @@ static HRESULT WINAPI HTMLTxtRange_select(IHTMLTxtRange *iface)
TRACE("(%p)\n", This);
nsres = nsIDOMWindow_GetSelection(This->doc->window->nswindow, &nsselection);
nsres = nsIDOMWindow_GetSelection(This->doc->basedoc.window->nswindow, &nsselection);
if(NS_FAILED(nsres)) {
ERR("GetSelection failed: %08x\n", nsres);
return E_FAIL;
......@@ -1787,17 +1788,17 @@ static HRESULT exec_indent(HTMLTxtRange *This, VARIANT *in, VARIANT *out)
TRACE("(%p)->(%p %p)\n", This, in, out);
if(!This->doc->nsdoc) {
if(!This->doc->basedoc.nsdoc) {
WARN("NULL nsdoc\n");
return E_NOTIMPL;
}
nsAString_Init(&tag_str, blockquoteW);
nsIDOMHTMLDocument_CreateElement(This->doc->nsdoc, &tag_str, &blockquote_elem);
nsIDOMHTMLDocument_CreateElement(This->doc->basedoc.nsdoc, &tag_str, &blockquote_elem);
nsAString_Finish(&tag_str);
nsAString_Init(&tag_str, pW);
nsIDOMDocument_CreateElement(This->doc->nsdoc, &tag_str, &p_elem);
nsIDOMDocument_CreateElement(This->doc->basedoc.nsdoc, &tag_str, &p_elem);
nsAString_Finish(&tag_str);
nsIDOMRange_ExtractContents(This->nsrange, &fragment);
......@@ -1847,9 +1848,13 @@ static const IOleCommandTargetVtbl OleCommandTargetVtbl = {
RangeCommandTarget_Exec
};
IHTMLTxtRange *HTMLTxtRange_Create(HTMLDocument *doc, nsIDOMRange *nsrange)
HRESULT HTMLTxtRange_Create(HTMLDocumentNode *doc, nsIDOMRange *nsrange, IHTMLTxtRange **p)
{
HTMLTxtRange *ret = heap_alloc(sizeof(HTMLTxtRange));
HTMLTxtRange *ret;
ret = heap_alloc(sizeof(HTMLTxtRange));
if(!ret)
return E_OUTOFMEMORY;
ret->lpHTMLTxtRangeVtbl = &HTMLTxtRangeVtbl;
ret->lpOleCommandTargetVtbl = &OleCommandTargetVtbl;
......@@ -1862,10 +1867,11 @@ IHTMLTxtRange *HTMLTxtRange_Create(HTMLDocument *doc, nsIDOMRange *nsrange)
ret->doc = doc;
list_add_head(&doc->range_list, &ret->entry);
return HTMLTXTRANGE(ret);
*p = HTMLTXTRANGE(ret);
return S_OK;
}
void detach_ranges(HTMLDocument *This)
void detach_ranges(HTMLDocumentNode *This)
{
HTMLTxtRange *iter;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment