Jacek Caban : mshtml: Associate PluginHost with containing HTMLDocumentDode .

Alexandre Julliard julliard at winehq.org
Thu Dec 9 12:26:32 CST 2010


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Dec  9 16:27:51 2010 +0100

mshtml: Associate PluginHost with containing HTMLDocumentDode.

---

 dlls/mshtml/htmldoc.c        |    3 +++
 dlls/mshtml/mshtml_private.h |    1 +
 dlls/mshtml/npplugin.c       |    2 +-
 dlls/mshtml/pluginhost.c     |   17 ++++++++++++++++-
 dlls/mshtml/pluginhost.h     |    6 +++++-
 5 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index e9a0cd6..a4c1451 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -35,6 +35,7 @@
 
 #include "mshtml_private.h"
 #include "htmlevent.h"
+#include "pluginhost.h"
 
 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
 
@@ -1897,6 +1898,7 @@ static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
 
     detach_selection(This);
     detach_ranges(This);
+    detach_plugin_hosts(This);
     release_nodes(This);
 
     if(This->nsdoc) {
@@ -1982,6 +1984,7 @@ static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLWindow *wi
     list_init(&doc->bindings);
     list_init(&doc->selection_list);
     list_init(&doc->range_list);
+    list_init(&doc->plugin_hosts);
 
     return doc;
 }
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index c27a068..269962f 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -618,6 +618,7 @@ struct HTMLDocumentNode {
     struct list bindings;
     struct list selection_list;
     struct list range_list;
+    struct list plugin_hosts;
 };
 
 #define HTMLWINDOW2(x)   ((IHTMLWindow2*)                 &(x)->lpHTMLWindow2Vtbl)
diff --git a/dlls/mshtml/npplugin.c b/dlls/mshtml/npplugin.c
index 60f2125..a1c1c47 100644
--- a/dlls/mshtml/npplugin.c
+++ b/dlls/mshtml/npplugin.c
@@ -272,7 +272,7 @@ static NPError CDECL NPP_New(NPMIMEType pluginType, NPP instance, UINT16 mode, I
         PluginHost *host;
         HRESULT hres;
 
-        hres = create_plugin_host(obj, &host);
+        hres = create_plugin_host(window->doc, obj, &host);
         nsIDOMElement_Release(nselem);
         IUnknown_Release(obj);
         if(SUCCEEDED(hres))
diff --git a/dlls/mshtml/pluginhost.c b/dlls/mshtml/pluginhost.c
index e7f39d8..27404f6 100644
--- a/dlls/mshtml/pluginhost.c
+++ b/dlls/mshtml/pluginhost.c
@@ -160,6 +160,7 @@ static ULONG WINAPI PHClientSite_Release(IOleClientSite *iface)
     TRACE("(%p) ref=%d\n", This, ref);
 
     if(!ref) {
+        list_remove(&This->entry);
         if(This->plugin_unk)
             IUnknown_Release(This->plugin_unk);
         heap_free(This);
@@ -731,7 +732,18 @@ static const IServiceProviderVtbl ServiceProviderVtbl = {
     PHServiceProvider_QueryService
 };
 
-HRESULT create_plugin_host(IUnknown *unk, PluginHost **ret)
+void detach_plugin_hosts(HTMLDocumentNode *doc)
+{
+    PluginHost *iter;
+
+    while(!list_empty(&doc->plugin_hosts)) {
+        iter = LIST_ENTRY(list_head(&doc->plugin_hosts), PluginHost, entry);
+        list_remove(&iter->entry);
+        iter->doc = NULL;
+    }
+}
+
+HRESULT create_plugin_host(HTMLDocumentNode *doc, IUnknown *unk, PluginHost **ret)
 {
     PluginHost *host;
 
@@ -753,6 +765,9 @@ HRESULT create_plugin_host(IUnknown *unk, PluginHost **ret)
     IUnknown_AddRef(unk);
     host->plugin_unk = unk;
 
+    host->doc = doc;
+    list_add_tail(&doc->plugin_hosts, &host->entry);
+
     *ret = host;
     return S_OK;
 }
diff --git a/dlls/mshtml/pluginhost.h b/dlls/mshtml/pluginhost.h
index 2b66696..ab61523 100644
--- a/dlls/mshtml/pluginhost.h
+++ b/dlls/mshtml/pluginhost.h
@@ -32,7 +32,11 @@ typedef struct {
 
     IUnknown *plugin_unk;
     HWND hwnd;
+
+    HTMLDocumentNode *doc;
+    struct list entry;
 } PluginHost;
 
-HRESULT create_plugin_host(IUnknown*,PluginHost**);
+HRESULT create_plugin_host(HTMLDocumentNode*,IUnknown*,PluginHost**);
 void update_plugin_window(PluginHost*,HWND,const RECT*);
+void detach_plugin_hosts(HTMLDocumentNode*);




More information about the wine-cvs mailing list