Jacek Caban : mshtml: Moved selection_list to HTMLDocumentNode object.

Alexandre Julliard julliard at winehq.org
Thu Sep 17 13:52:24 CDT 2009


Module: wine
Branch: master
Commit: 068489fb9485a38c0565ac5ad4bf2fac4b167de7
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=068489fb9485a38c0565ac5ad4bf2fac4b167de7

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Sep 16 22:09:42 2009 +0200

mshtml: Moved selection_list to HTMLDocumentNode object.

---

 dlls/mshtml/htmldoc.c        |    8 ++++----
 dlls/mshtml/mshtml_private.h |    7 ++++---
 dlls/mshtml/selection.c      |   31 ++++++++++++++++++-------------
 3 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index a15112a..8b96328 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -428,8 +428,7 @@ static HRESULT WINAPI HTMLDocument_get_selection(IHTMLDocument2 *iface, IHTMLSel
         return E_FAIL;
     }
 
-    *p = HTMLSelectionObject_Create(This, nsselection);
-    return S_OK;
+    return HTMLSelectionObject_Create(This->doc_node, nsselection, p);
 }
 
 static HRESULT WINAPI HTMLDocument_get_readyState(IHTMLDocument2 *iface, BSTR *p)
@@ -1741,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->selection_list);
     list_init(&doc->range_list);
 
     HTMLDocument_HTMLDocument3_Init(doc);
@@ -1787,7 +1785,6 @@ static void destroy_htmldoc(HTMLDocument *This)
         release_event_target(This->event_target);
 
     heap_free(This->mime);
-    detach_selection(This);
     detach_ranges(This);
     release_nodes(This);
     release_dispex(&This->dispex);
@@ -1825,6 +1822,7 @@ static ULONG HTMLDocumentNode_Release(HTMLDocument *base)
     TRACE("(%p) ref = %u\n", This, ref);
 
     if(!ref) {
+        detach_selection(This);
         destroy_htmldoc(&This->basedoc);
         heap_free(This);
     }
@@ -1859,6 +1857,8 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob
 
     doc->basedoc.window = window;
 
+    list_init(&doc->selection_list);
+
     *ret = doc;
     return S_OK;
 }
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index cf68394..0829190 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -320,7 +320,6 @@ struct HTMLDocument {
     ConnectionPoint cp_htmldocevents2;
     ConnectionPoint cp_propnotif;
 
-    struct list selection_list;
     struct list range_list;
 
     HTMLDOMNode *nodes;
@@ -345,6 +344,8 @@ struct HTMLDocumentNode {
     HTMLDocument basedoc;
 
     LONG ref;
+
+    struct list selection_list;
 };
 
 struct HTMLDocumentObj {
@@ -635,13 +636,13 @@ HRESULT channelbsc_load_stream(nsChannelBSC*,IStream*);
 void channelbsc_set_channel(nsChannelBSC*,nsChannel*,nsIStreamListener*,nsISupports*);
 IMoniker *get_channelbsc_mon(nsChannelBSC*);
 
-IHTMLSelectionObject *HTMLSelectionObject_Create(HTMLDocument*,nsISelection*);
+HRESULT HTMLSelectionObject_Create(HTMLDocumentNode*,nsISelection*,IHTMLSelectionObject**);
 IHTMLTxtRange *HTMLTxtRange_Create(HTMLDocument*,nsIDOMRange*);
 IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration*);
 IHTMLStyleSheet *HTMLStyleSheet_Create(nsIDOMStyleSheet*);
 IHTMLStyleSheetsCollection *HTMLStyleSheetsCollection_Create(nsIDOMStyleSheetList*);
 
-void detach_selection(HTMLDocument*);
+void detach_selection(HTMLDocumentNode*);
 void detach_ranges(HTMLDocument*);
 HRESULT get_node_text(HTMLDOMNode*,BSTR*);
 
diff --git a/dlls/mshtml/selection.c b/dlls/mshtml/selection.c
index 53151a1..0d1729d 100644
--- a/dlls/mshtml/selection.c
+++ b/dlls/mshtml/selection.c
@@ -38,7 +38,7 @@ typedef struct {
     LONG ref;
 
     nsISelection *nsselection;
-    HTMLDocument *doc;
+    HTMLDocumentNode *doc;
 
     struct list entry;
 } HTMLSelectionObject;
@@ -154,12 +154,12 @@ static HRESULT WINAPI HTMLSelectionObject_createRange(IHTMLSelectionObject *ifac
 
             TRACE("nsrange_cnt = 0\n");
 
-            if(!This->doc->nsdoc) {
+            if(!This->doc->basedoc.nsdoc) {
                 WARN("nsdoc is NULL\n");
                 return E_UNEXPECTED;
             }
 
-            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);
                 return E_FAIL;
@@ -178,7 +178,7 @@ static HRESULT WINAPI HTMLSelectionObject_createRange(IHTMLSelectionObject *ifac
             ERR("GetRangeAt failed: %08x\n", nsres);
     }
 
-    *range = (IDispatch*)HTMLTxtRange_Create(This->doc, nsrange);
+    *range = (IDispatch*)HTMLTxtRange_Create(&This->doc->basedoc, nsrange);
     return S_OK;
 }
 
@@ -230,21 +230,26 @@ static const IHTMLSelectionObjectVtbl HTMLSelectionObjectVtbl = {
     HTMLSelectionObject_get_type
 };
 
-IHTMLSelectionObject *HTMLSelectionObject_Create(HTMLDocument *doc, nsISelection *nsselection)
+HRESULT HTMLSelectionObject_Create(HTMLDocumentNode *doc, nsISelection *nsselection, IHTMLSelectionObject **ret)
 {
-    HTMLSelectionObject *ret = heap_alloc(sizeof(HTMLSelectionObject));
+    HTMLSelectionObject *selection;
 
-    ret->lpHTMLSelectionObjectVtbl = &HTMLSelectionObjectVtbl;
-    ret->ref = 1;
-    ret->nsselection = nsselection; /* We shouldn't call AddRef here */
+    selection = heap_alloc(sizeof(HTMLSelectionObject));
+    if(!selection)
+        return E_OUTOFMEMORY;
 
-    ret->doc = doc;
-    list_add_head(&doc->selection_list, &ret->entry);
+    selection->lpHTMLSelectionObjectVtbl = &HTMLSelectionObjectVtbl;
+    selection->ref = 1;
+    selection->nsselection = nsselection; /* We shouldn't call AddRef here */
 
-    return HTMLSELOBJ(ret);
+    selection->doc = doc;
+    list_add_head(&doc->selection_list, &selection->entry);
+
+    *ret = HTMLSELOBJ(selection);
+    return S_OK;
 }
 
-void detach_selection(HTMLDocument *This)
+void detach_selection(HTMLDocumentNode *This)
 {
     HTMLSelectionObject *iter;
 




More information about the wine-cvs mailing list