Jacek Caban : mshtml: Store HTMLDocument reference in HTMLSelectionObject.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Aug 16 05:38:39 CDT 2007


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Aug 15 19:17:49 2007 +0200

mshtml: Store HTMLDocument reference in HTMLSelectionObject.

---

 dlls/mshtml/htmldoc.c        |    5 ++++-
 dlls/mshtml/mshtml_private.h |    6 +++++-
 dlls/mshtml/selection.c      |   19 ++++++++++++++++++-
 3 files changed, 27 insertions(+), 3 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index f75d591..f70b96e 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -172,6 +172,7 @@ static ULONG WINAPI HTMLDocument_Release(IHTMLDocument2 *iface)
         if(This->window)
             IHTMLWindow2_Release(HTMLWINDOW2(This->window));
 
+        detach_selection(This);
         release_nodes(This);
 
         ConnectionPointContainer_Destroy(&This->cp_container);
@@ -376,7 +377,7 @@ static HRESULT WINAPI HTMLDocument_get_selection(IHTMLDocument2 *iface, IHTMLSel
         }
     }
 
-    *p = HTMLSelectionObject_Create(nsselection);
+    *p = HTMLSelectionObject_Create(This, nsselection);
     return S_OK;
 }
 
@@ -1128,6 +1129,8 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
     ret->readystate = READYSTATE_UNINITIALIZED;
     ret->window = NULL;
 
+    list_init(&ret->selection_list);
+
     hres = IHTMLDocument_QueryInterface(HTMLDOC(ret), riid, ppvObject);
     if(FAILED(hres)) {
         mshtml_free(ret);
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index d96c0fc..69472ff 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -150,6 +150,8 @@ struct HTMLDocument {
     ConnectionPoint cp_htmldocevents2;
     ConnectionPoint cp_propnotif;
 
+    struct list selection_list;
+
     HTMLDOMNode *nodes;
 };
 
@@ -401,11 +403,13 @@ HRESULT load_stream(BSCallback*,IStream*);
 void set_document_bscallback(HTMLDocument*,BSCallback*);
 void set_current_mon(HTMLDocument*,IMoniker*);
 
-IHTMLSelectionObject *HTMLSelectionObject_Create(nsISelection*);
+IHTMLSelectionObject *HTMLSelectionObject_Create(HTMLDocument*,nsISelection*);
 IHTMLTxtRange *HTMLTxtRange_Create(nsIDOMRange*);
 IHTMLStyle *HTMLStyle_Create(nsIDOMCSSStyleDeclaration*);
 IHTMLStyleSheet *HTMLStyleSheet_Create(void);
 
+void detach_selection(HTMLDocument*);
+
 void HTMLElement_Create(HTMLDOMNode*);
 void HTMLBodyElement_Create(HTMLElement*);
 void HTMLInputElement_Create(HTMLElement*);
diff --git a/dlls/mshtml/selection.c b/dlls/mshtml/selection.c
index fe191f4..1ee3b97 100644
--- a/dlls/mshtml/selection.c
+++ b/dlls/mshtml/selection.c
@@ -42,6 +42,9 @@ typedef struct {
     LONG ref;
 
     nsISelection *nsselection;
+    HTMLDocument *doc;
+
+    struct list entry;
 } HTMLSelectionObject;
 
 #define HTMLSELOBJ(x)  ((IHTMLSelectionObject*) &(x)->lpHTMLSelectionObjectVtbl)
@@ -95,6 +98,8 @@ static ULONG WINAPI HTMLSelectionObject_Release(IHTMLSelectionObject *iface)
     if(!ref) {
         if(This->nsselection)
             nsISelection_Release(This->nsselection);
+        if(This->doc)
+            list_remove(&This->entry);
         mshtml_free(This);
     }
 
@@ -208,7 +213,7 @@ static const IHTMLSelectionObjectVtbl HTMLSelectionObjectVtbl = {
     HTMLSelectionObject_get_type
 };
 
-IHTMLSelectionObject *HTMLSelectionObject_Create(nsISelection *nsselection)
+IHTMLSelectionObject *HTMLSelectionObject_Create(HTMLDocument *doc, nsISelection *nsselection)
 {
     HTMLSelectionObject *ret = mshtml_alloc(sizeof(HTMLSelectionObject));
 
@@ -216,5 +221,17 @@ IHTMLSelectionObject *HTMLSelectionObject_Create(nsISelection *nsselection)
     ret->ref = 1;
     ret->nsselection = nsselection; /* We shouldn't call AddRef here */
 
+    ret->doc = doc;
+    list_add_head(&doc->selection_list, &ret->entry);
+
     return HTMLSELOBJ(ret);
 }
+
+void detach_selection(HTMLDocument *This)
+{
+    HTMLSelectionObject *iter;
+
+    LIST_FOR_EACH_ENTRY(iter, &This->selection_list, HTMLSelectionObject, entry) {
+        iter->doc = NULL;
+    }
+}




More information about the wine-cvs mailing list