Jacek Caban : mshtml: Better error handling in NSContainer initialization.
Alexandre Julliard
julliard at winehq.org
Tue Oct 18 12:56:28 CDT 2011
Module: wine
Branch: master
Commit: b5a031d8046ff23b049c664f2e51239a8235ef6d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=b5a031d8046ff23b049c664f2e51239a8235ef6d
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Oct 18 12:27:37 2011 +0200
mshtml: Better error handling in NSContainer initialization.
---
dlls/mshtml/htmldoc.c | 6 +-
dlls/mshtml/mshtml_private.h | 2 +-
dlls/mshtml/nsembed.c | 140 ++++++++++++++++++++++++++---------------
3 files changed, 93 insertions(+), 55 deletions(-)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 0636a04..9af5c8f 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -2377,11 +2377,11 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
doc->usermode = UNKNOWN_USERMODE;
- doc->nscontainer = NSContainer_Create(doc, NULL);
- if(!doc->nscontainer) {
+ hres = create_nscontainer(doc, NULL, &doc->nscontainer);
+ if(FAILED(hres)) {
ERR("Failed to init Gecko, returning CLASS_E_CLASSNOTAVAILABLE\n");
htmldoc_release(&doc->basedoc);
- return CLASS_E_CLASSNOTAVAILABLE;
+ return hres;
}
hres = htmldoc_query_interface(&doc->basedoc, riid, ppvObject);
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 9123179..6ee082e 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -641,7 +641,7 @@ void ConnectionPoint_Init(ConnectionPoint*,ConnectionPointContainer*,REFIID,cp_s
void ConnectionPointContainer_Init(ConnectionPointContainer*,IUnknown*) DECLSPEC_HIDDEN;
void ConnectionPointContainer_Destroy(ConnectionPointContainer*) DECLSPEC_HIDDEN;
-NSContainer *NSContainer_Create(HTMLDocumentObj*,NSContainer*) DECLSPEC_HIDDEN;
+HRESULT create_nscontainer(HTMLDocumentObj*,NSContainer*,NSContainer**) DECLSPEC_HIDDEN;
void NSContainer_Release(NSContainer*) DECLSPEC_HIDDEN;
nsresult create_chrome_window(nsIWebBrowserChrome*,nsIWebBrowserChrome**) DECLSPEC_HIDDEN;
diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c
index b6de72f..12c6c15 100644
--- a/dlls/mshtml/nsembed.c
+++ b/dlls/mshtml/nsembed.c
@@ -1717,105 +1717,108 @@ static const nsISupportsWeakReferenceVtbl nsSupportsWeakReferenceVtbl = {
nsresult create_chrome_window(nsIWebBrowserChrome *parent, nsIWebBrowserChrome **ret)
{
NSContainer *new_container;
+ HRESULT hres;
if(parent->lpVtbl != &nsWebBrowserChromeVtbl)
return NS_ERROR_UNEXPECTED;
- new_container = NSContainer_Create(NULL, impl_from_nsIWebBrowserChrome(parent));
+ hres = create_nscontainer(NULL, impl_from_nsIWebBrowserChrome(parent), &new_container);
+ if(FAILED(hres))
+ return NS_ERROR_FAILURE;
+
*ret = &new_container->nsIWebBrowserChrome_iface;
return NS_OK;
}
-NSContainer *NSContainer_Create(HTMLDocumentObj *doc, NSContainer *parent)
+static HRESULT init_nscontainer(NSContainer *nscontainer)
{
nsIWebBrowserSetup *wbsetup;
nsIScrollable *scrollable;
- NSContainer *ret;
nsresult nsres;
- if(!load_gecko(TRUE))
- return NULL;
-
- ret = heap_alloc_zero(sizeof(NSContainer));
-
- ret->nsIWebBrowserChrome_iface.lpVtbl = &nsWebBrowserChromeVtbl;
- ret->nsIContextMenuListener_iface.lpVtbl = &nsContextMenuListenerVtbl;
- ret->nsIURIContentListener_iface.lpVtbl = &nsURIContentListenerVtbl;
- ret->nsIEmbeddingSiteWindow_iface.lpVtbl = &nsEmbeddingSiteWindowVtbl;
- ret->nsITooltipListener_iface.lpVtbl = &nsTooltipListenerVtbl;
- ret->nsIInterfaceRequestor_iface.lpVtbl = &nsInterfaceRequestorVtbl;
- ret->nsISupportsWeakReference_iface.lpVtbl = &nsSupportsWeakReferenceVtbl;
-
- ret->doc = doc;
- ret->ref = 1;
-
nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr, NS_WEBBROWSER_CONTRACTID,
- NULL, &IID_nsIWebBrowser, (void**)&ret->webbrowser);
+ NULL, &IID_nsIWebBrowser, (void**)&nscontainer->webbrowser);
if(NS_FAILED(nsres)) {
ERR("Creating WebBrowser failed: %08x\n", nsres);
- heap_free(ret);
- return NULL;
+ return E_FAIL;
}
- if(parent)
- nsIWebBrowserChrome_AddRef(&parent->nsIWebBrowserChrome_iface);
- ret->parent = parent;
-
- nsres = nsIWebBrowser_SetContainerWindow(ret->webbrowser, &ret->nsIWebBrowserChrome_iface);
- if(NS_FAILED(nsres))
+ nsres = nsIWebBrowser_SetContainerWindow(nscontainer->webbrowser, &nscontainer->nsIWebBrowserChrome_iface);
+ if(NS_FAILED(nsres)) {
ERR("SetContainerWindow failed: %08x\n", nsres);
+ return E_FAIL;
+ }
- nsres = nsIWebBrowser_QueryInterface(ret->webbrowser, &IID_nsIBaseWindow,
- (void**)&ret->window);
- if(NS_FAILED(nsres))
+ nsres = nsIWebBrowser_QueryInterface(nscontainer->webbrowser, &IID_nsIBaseWindow,
+ (void**)&nscontainer->window);
+ if(NS_FAILED(nsres)) {
ERR("Could not get nsIBaseWindow interface: %08x\n", nsres);
+ return E_FAIL;
+ }
- nsres = nsIWebBrowser_QueryInterface(ret->webbrowser, &IID_nsIWebBrowserSetup,
+ nsres = nsIWebBrowser_QueryInterface(nscontainer->webbrowser, &IID_nsIWebBrowserSetup,
(void**)&wbsetup);
if(NS_SUCCEEDED(nsres)) {
nsres = nsIWebBrowserSetup_SetProperty(wbsetup, SETUP_IS_CHROME_WRAPPER, FALSE);
nsIWebBrowserSetup_Release(wbsetup);
- if(NS_FAILED(nsres))
+ if(NS_FAILED(nsres)) {
ERR("SetProperty(SETUP_IS_CHROME_WRAPPER) failed: %08x\n", nsres);
+ return E_FAIL;
+ }
}else {
ERR("Could not get nsIWebBrowserSetup interface\n");
+ return E_FAIL;
}
- nsres = nsIWebBrowser_QueryInterface(ret->webbrowser, &IID_nsIWebNavigation,
- (void**)&ret->navigation);
- if(NS_FAILED(nsres))
+ nsres = nsIWebBrowser_QueryInterface(nscontainer->webbrowser, &IID_nsIWebNavigation,
+ (void**)&nscontainer->navigation);
+ if(NS_FAILED(nsres)) {
ERR("Could not get nsIWebNavigation interface: %08x\n", nsres);
+ return E_FAIL;
+ }
- nsres = nsIWebBrowserFocus_QueryInterface(ret->webbrowser, &IID_nsIWebBrowserFocus,
- (void**)&ret->focus);
- if(NS_FAILED(nsres))
+ nsres = nsIWebBrowserFocus_QueryInterface(nscontainer->webbrowser, &IID_nsIWebBrowserFocus,
+ (void**)&nscontainer->focus);
+ if(NS_FAILED(nsres)) {
ERR("Could not get nsIWebBrowserFocus interface: %08x\n", nsres);
+ return E_FAIL;
+ }
- if(!nscontainer_class)
+ if(!nscontainer_class) {
register_nscontainer_class();
+ if(!nscontainer_class)
+ return E_FAIL;
+ }
- ret->hwnd = CreateWindowExW(0, wszNsContainer, NULL,
+ nscontainer->hwnd = CreateWindowExW(0, wszNsContainer, NULL,
WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN, 0, 0, 100, 100,
- GetDesktopWindow(), NULL, hInst, ret);
+ GetDesktopWindow(), NULL, hInst, nscontainer);
+ if(!nscontainer->hwnd) {
+ WARN("Could not create window\n");
+ return E_FAIL;
+ }
- nsres = nsIBaseWindow_InitWindow(ret->window, ret->hwnd, NULL, 0, 0, 100, 100);
+ nsres = nsIBaseWindow_InitWindow(nscontainer->window, nscontainer->hwnd, NULL, 0, 0, 100, 100);
if(NS_SUCCEEDED(nsres)) {
- nsres = nsIBaseWindow_Create(ret->window);
- if(NS_FAILED(nsres))
+ nsres = nsIBaseWindow_Create(nscontainer->window);
+ if(NS_FAILED(nsres)) {
WARN("Creating window failed: %08x\n", nsres);
+ return E_FAIL;
+ }
- nsIBaseWindow_SetVisibility(ret->window, FALSE);
- nsIBaseWindow_SetEnabled(ret->window, FALSE);
+ nsIBaseWindow_SetVisibility(nscontainer->window, FALSE);
+ nsIBaseWindow_SetEnabled(nscontainer->window, FALSE);
}else {
ERR("InitWindow failed: %08x\n", nsres);
+ return E_FAIL;
}
- nsres = nsIWebBrowser_SetParentURIContentListener(ret->webbrowser,
- &ret->nsIURIContentListener_iface);
+ nsres = nsIWebBrowser_SetParentURIContentListener(nscontainer->webbrowser,
+ &nscontainer->nsIURIContentListener_iface);
if(NS_FAILED(nsres))
ERR("SetParentURIContentListener failed: %08x\n", nsres);
- nsres = nsIWebBrowser_QueryInterface(ret->webbrowser, &IID_nsIScrollable, (void**)&scrollable);
+ nsres = nsIWebBrowser_QueryInterface(nscontainer->webbrowser, &IID_nsIScrollable, (void**)&scrollable);
if(NS_SUCCEEDED(nsres)) {
nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable,
ScrollOrientation_Y, Scrollbar_Always);
@@ -1832,7 +1835,42 @@ NSContainer *NSContainer_Create(HTMLDocumentObj *doc, NSContainer *parent)
ERR("Could not get nsIScrollable: %08x\n", nsres);
}
- return ret;
+ return S_OK;
+}
+
+HRESULT create_nscontainer(HTMLDocumentObj *doc, NSContainer *parent, NSContainer **_ret)
+{
+ NSContainer *ret;
+ HRESULT hres;
+
+ if(!load_gecko(TRUE))
+ return CLASS_E_CLASSNOTAVAILABLE;
+
+ ret = heap_alloc_zero(sizeof(NSContainer));
+ if(!ret)
+ return E_OUTOFMEMORY;
+
+ ret->nsIWebBrowserChrome_iface.lpVtbl = &nsWebBrowserChromeVtbl;
+ ret->nsIContextMenuListener_iface.lpVtbl = &nsContextMenuListenerVtbl;
+ ret->nsIURIContentListener_iface.lpVtbl = &nsURIContentListenerVtbl;
+ ret->nsIEmbeddingSiteWindow_iface.lpVtbl = &nsEmbeddingSiteWindowVtbl;
+ ret->nsITooltipListener_iface.lpVtbl = &nsTooltipListenerVtbl;
+ ret->nsIInterfaceRequestor_iface.lpVtbl = &nsInterfaceRequestorVtbl;
+ ret->nsISupportsWeakReference_iface.lpVtbl = &nsSupportsWeakReferenceVtbl;
+
+ ret->doc = doc;
+ ret->ref = 1;
+
+ if(parent)
+ nsIWebBrowserChrome_AddRef(&parent->nsIWebBrowserChrome_iface);
+ ret->parent = parent;
+
+ hres = init_nscontainer(ret);
+ if(SUCCEEDED(hres))
+ *_ret = ret;
+ else
+ nsIWebBrowserChrome_Release(&ret->nsIWebBrowserChrome_iface);
+ return hres;
}
void NSContainer_Release(NSContainer *This)
More information about the wine-cvs
mailing list