Jacek Caban : mshtml: Moved range_list to HTMLDocumentNode object.
Alexandre Julliard
julliard at winehq.org
Thu Sep 17 13:52:32 CDT 2009
Module: wine
Branch: master
Commit: d460c67305d912d40148e11375d3dc3fa03412e5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d460c67305d912d40148e11375d3dc3fa03412e5
Author: Jacek Caban <jacek at codeweavers.com>
Date: Wed Sep 16 22:11:43 2009 +0200
mshtml: Moved range_list to HTMLDocumentNode object.
---
dlls/mshtml/htmlbody.c | 7 +++++--
dlls/mshtml/htmldoc.c | 4 ++--
dlls/mshtml/mshtml_private.h | 7 +++----
dlls/mshtml/selection.c | 9 +++++++--
dlls/mshtml/txtrange.c | 38 ++++++++++++++++++++++----------------
5 files changed, 39 insertions(+), 26 deletions(-)
diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c
index da5d70a..280464a 100644
--- a/dlls/mshtml/htmlbody.c
+++ b/dlls/mshtml/htmlbody.c
@@ -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
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index b835c99..5261c97 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -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;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 05fb91f..1c744ed 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -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*);
diff --git a/dlls/mshtml/selection.c b/dlls/mshtml/selection.c
index 0d1729d..65e3ecb 100644
--- a/dlls/mshtml/selection.c
+++ b/dlls/mshtml/selection.c
@@ -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)
diff --git a/dlls/mshtml/txtrange.c b/dlls/mshtml/txtrange.c
index e6a6ff2..9ed6f63 100644
--- a/dlls/mshtml/txtrange.c
+++ b/dlls/mshtml/txtrange.c
@@ -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;
More information about the wine-cvs
mailing list