mshtml: Associate PluginHost with containing HTMLDocumentDode.

This commit is contained in:
Jacek Caban 2010-12-09 16:27:51 +01:00 committed by Alexandre Julliard
parent d9dcafab91
commit b962fff243
5 changed files with 26 additions and 3 deletions

View File

@ -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;
}

View File

@ -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)

View File

@ -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))

View File

@ -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;
}

View File

@ -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*);