Jacek Caban : mshtml: Store HTMLDocument pointer in BSCallback object.

Alexandre Julliard julliard at winehq.org
Tue Nov 6 08:24:33 CST 2007


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Nov  5 21:45:07 2007 +0100

mshtml: Store HTMLDocument pointer in BSCallback object.

---

 dlls/mshtml/htmldoc.c        |    1 +
 dlls/mshtml/mshtml_private.h |    5 ++++-
 dlls/mshtml/navigate.c       |   27 ++++++++++++++++++++++++---
 dlls/mshtml/persist.c        |    2 +-
 dlls/mshtml/task.c           |    7 ++++---
 5 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 4ea2912..e9df70e 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -1185,6 +1185,7 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
     ret->window = NULL;
     ret->option_factory = NULL;
 
+    list_init(&ret->bindings);
     list_init(&ret->selection_list);
     list_init(&ret->range_list);
 
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 14ae1be..2a8627c 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -140,6 +140,7 @@ struct HTMLDocument {
     BSCallback *bscallback;
     IMoniker *mon;
     LPOLESTR url;
+    struct list bindings;
 
     HWND hwnd;
     HWND tooltips_hwnd;
@@ -260,6 +261,8 @@ struct BSCallback {
     HTMLDocument *doc;
 
     nsProtocolStream *nsstream;
+
+    struct list entry;
 };
 
 typedef struct {
@@ -417,7 +420,7 @@ void init_nsevents(NSContainer*);
 nsresult get_nsinterface(nsISupports*,REFIID,void**);
 
 BSCallback *create_bscallback(IMoniker*);
-HRESULT start_binding(BSCallback*);
+HRESULT start_binding(HTMLDocument*,BSCallback*);
 HRESULT load_stream(BSCallback*,IStream*);
 void set_document_bscallback(HTMLDocument*,BSCallback*);
 void set_current_mon(HTMLDocument*,IMoniker*);
diff --git a/dlls/mshtml/navigate.c b/dlls/mshtml/navigate.c
index 659ba22..85fb2e5 100644
--- a/dlls/mshtml/navigate.c
+++ b/dlls/mshtml/navigate.c
@@ -29,6 +29,7 @@
 #include "winuser.h"
 #include "ole2.h"
 #include "hlguids.h"
+#include "shlguid.h"
 
 #include "wine/debug.h"
 #include "wine/unicode.h"
@@ -222,7 +223,7 @@ static HRESULT read_stream_data(BSCallback *This, IStream *stream)
                 FIXME("OnStartRequest failed: %08x\n", nsres);
 
             /* events are reset when a new document URI is loaded, so re-initialise them here */
-            if(This->doc && This->doc->nscontainer)
+            if(This->doc && This->doc->bscallback == This && This->doc->nscontainer)
                 init_nsevents(This->doc->nscontainer);
         }
 
@@ -328,6 +329,7 @@ static ULONG WINAPI BindStatusCallback_Release(IBindStatusCallback *iface)
             IMoniker_Release(This->mon);
         if(This->binding)
             IBinding_Release(This->binding);
+        list_remove(&This->entry);
         mshtml_free(This->headers);
         mshtml_free(This);
     }
@@ -345,6 +347,9 @@ static HRESULT WINAPI BindStatusCallback_OnStartBinding(IBindStatusCallback *ifa
     IBinding_AddRef(pbind);
     This->binding = pbind;
 
+    if(This->doc)
+        list_add_head(&This->doc->bindings, &This->entry);
+
     add_nsrequest(This);
 
     return S_OK;
@@ -414,7 +419,12 @@ static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallback *ifac
         }
     }
 
-    if(This->doc && !This->doc->nscontainer) {
+    list_remove(&This->entry);
+
+    if(FAILED(hresult))
+        return S_OK;
+
+    if(This->doc && This->doc->bscallback == This && !This->doc->nscontainer) {
         task_t *task = mshtml_alloc(sizeof(task_t));
 
         task->doc = This->doc;
@@ -670,6 +680,8 @@ BSCallback *create_bscallback(IMoniker *mon)
     ret->binding = NULL;
     ret->doc = NULL;
 
+    list_init(&ret->entry);
+
     if(mon)
         IMoniker_AddRef(mon);
     ret->mon = mon;
@@ -796,12 +808,14 @@ void hlink_frame_navigate(HTMLDocument *doc, IHlinkFrame *hlink_frame,
     IBindStatusCallback_Release(STATUSCLB(callback));
 }
 
-HRESULT start_binding(BSCallback *bscallback)
+HRESULT start_binding(HTMLDocument *doc, BSCallback *bscallback)
 {
     IStream *str = NULL;
     IBindCtx *bctx;
     HRESULT hres;
 
+    bscallback->doc = doc;
+
     hres = CreateAsyncBindCtx(0, STATUSCLB(bscallback), NULL, &bctx);
     if(FAILED(hres)) {
         WARN("CreateAsyncBindCtx failed: %08x\n", hres);
@@ -828,6 +842,8 @@ HRESULT start_binding(BSCallback *bscallback)
 
 void set_document_bscallback(HTMLDocument *doc, BSCallback *callback)
 {
+    BSCallback *iter;
+
     if(doc->bscallback) {
         if(doc->bscallback->binding)
             IBinding_Abort(doc->bscallback->binding);
@@ -835,6 +851,11 @@ void set_document_bscallback(HTMLDocument *doc, BSCallback *callback)
         IBindStatusCallback_Release(STATUSCLB(doc->bscallback));
     }
 
+    LIST_FOR_EACH_ENTRY(iter, &doc->bindings, BSCallback, entry) {
+        iter->doc = NULL;
+        list_remove(&iter->entry);
+    }
+
     doc->bscallback = callback;
 
     if(callback) {
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index 70da02e..8a4ad25 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -429,7 +429,7 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva
         return hres;
 
     if(!bind_complete)
-        return start_binding(This->bscallback);
+        return start_binding(This, This->bscallback);
 
     return S_OK;
 }
diff --git a/dlls/mshtml/task.c b/dlls/mshtml/task.c
index 5204a89..3a94cbc 100644
--- a/dlls/mshtml/task.c
+++ b/dlls/mshtml/task.c
@@ -211,9 +211,10 @@ static void set_progress(HTMLDocument *doc)
     }
 }
 
-static void task_start_binding(BSCallback *bscallback)
+static void task_start_binding(HTMLDocument *doc, BSCallback *bscallback)
 {
-    start_binding(bscallback);
+    if(doc)
+        start_binding(doc, bscallback);
     IBindStatusCallback_Release(STATUSCLB(bscallback));
 }
 
@@ -230,7 +231,7 @@ static void process_task(task_t *task)
         set_progress(task->doc);
         break;
     case TASK_START_BINDING:
-        task_start_binding(task->bscallback);
+        task_start_binding(task->doc, task->bscallback);
         break;
     default:
         ERR("Wrong task_id %d\n", task->task_id);




More information about the wine-cvs mailing list