diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 60e250db181..0d02f26e593 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -500,6 +500,7 @@ BOOL load_gecko(BOOL);
void close_gecko(void);
void register_nsservice(nsIComponentRegistrar*,nsIServiceManager*);
void init_nsio(nsIComponentManager*,nsIComponentRegistrar*);
+void release_nsio(void);
BOOL install_wine_gecko(BOOL);
HRESULT nsuri_to_url(LPCWSTR,BSTR*);
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index 923604d05df..34bc6d5dc89 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -865,6 +865,8 @@ void close_gecko(void)
{
TRACE("()\n");
+ release_nsio();
+
if(pCompMgr)
nsIComponentManager_Release(pCompMgr);
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 31fb89710f0..0669463d685 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -47,6 +47,7 @@ static const IID NS_IOSERVICE_CID =
{0x9ac9e770, 0x18bc, 0x11d3, {0x93, 0x37, 0x00, 0x10, 0x4b, 0xa0, 0xfd, 0x40}};
static nsIIOService *nsio = NULL;
+static nsINetUtil *net_util;
static const WCHAR about_blankW[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
@@ -2260,21 +2261,9 @@ static nsrefcnt NSAPI nsNetUtil_Release(nsINetUtil *iface)
static nsresult NSAPI nsNetUtil_ParseContentType(nsINetUtil *iface, const nsACString *aTypeHeader,
nsACString *aCharset, PRBool *aHadCharset, nsACString *aContentType)
{
- nsINetUtil *net_util;
- nsresult nsres;
-
TRACE("(%p %p %p %p)\n", aTypeHeader, aCharset, aHadCharset, aContentType);
- nsres = nsIIOService_QueryInterface(nsio, &IID_nsINetUtil, (void**)&net_util);
- if(NS_FAILED(nsres)) {
- WARN("Could not get nsINetUtil interface: %08x\n", nsres);
- return nsres;
- }
-
- nsres = nsINetUtil_ParseContentType(net_util, aTypeHeader, aCharset, aHadCharset, aContentType);
-
- nsINetUtil_Release(net_util);
- return nsres;
+ return nsINetUtil_ParseContentType(net_util, aTypeHeader, aCharset, aHadCharset, aContentType);
}
static const nsINetUtilVtbl nsNetUtilVtbl = {
@@ -2380,6 +2369,13 @@ void init_nsio(nsIComponentManager *component_manager, nsIComponentRegistrar *re
return;
}
+ nsres = nsIIOService_QueryInterface(nsio, &IID_nsINetUtil, (void**)&net_util);
+ if(NS_FAILED(nsres)) {
+ WARN("Could not get nsINetUtil interface: %08x\n", nsres);
+ nsIIOService_Release(nsio);
+ return;
+ }
+
nsres = nsIComponentRegistrar_UnregisterFactory(registrar, &NS_IOSERVICE_CID, old_factory);
nsIFactory_Release(old_factory);
if(NS_FAILED(nsres))
@@ -2390,3 +2386,16 @@ void init_nsio(nsIComponentManager *component_manager, nsIComponentRegistrar *re
if(NS_FAILED(nsres))
ERR("RegisterFactory failed: %08x\n", nsres);
}
+
+void release_nsio(void)
+{
+ if(net_util) {
+ nsINetUtil_Release(net_util);
+ net_util = NULL;
+ }
+
+ if(nsio) {
+ nsIIOService_Release(nsio);
+ nsio = NULL;
+ }
+}