mshtml: Better error handling in NSContainer initialization.
This commit is contained in:
parent
32b24db041
commit
b5a031d804
@ -2377,11 +2377,11 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
|
|||||||
|
|
||||||
doc->usermode = UNKNOWN_USERMODE;
|
doc->usermode = UNKNOWN_USERMODE;
|
||||||
|
|
||||||
doc->nscontainer = NSContainer_Create(doc, NULL);
|
hres = create_nscontainer(doc, NULL, &doc->nscontainer);
|
||||||
if(!doc->nscontainer) {
|
if(FAILED(hres)) {
|
||||||
ERR("Failed to init Gecko, returning CLASS_E_CLASSNOTAVAILABLE\n");
|
ERR("Failed to init Gecko, returning CLASS_E_CLASSNOTAVAILABLE\n");
|
||||||
htmldoc_release(&doc->basedoc);
|
htmldoc_release(&doc->basedoc);
|
||||||
return CLASS_E_CLASSNOTAVAILABLE;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
hres = htmldoc_query_interface(&doc->basedoc, riid, ppvObject);
|
hres = htmldoc_query_interface(&doc->basedoc, riid, ppvObject);
|
||||||
|
@ -641,7 +641,7 @@ void ConnectionPoint_Init(ConnectionPoint*,ConnectionPointContainer*,REFIID,cp_s
|
|||||||
void ConnectionPointContainer_Init(ConnectionPointContainer*,IUnknown*) DECLSPEC_HIDDEN;
|
void ConnectionPointContainer_Init(ConnectionPointContainer*,IUnknown*) DECLSPEC_HIDDEN;
|
||||||
void ConnectionPointContainer_Destroy(ConnectionPointContainer*) 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;
|
void NSContainer_Release(NSContainer*) DECLSPEC_HIDDEN;
|
||||||
nsresult create_chrome_window(nsIWebBrowserChrome*,nsIWebBrowserChrome**) DECLSPEC_HIDDEN;
|
nsresult create_chrome_window(nsIWebBrowserChrome*,nsIWebBrowserChrome**) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
|
@ -1717,105 +1717,108 @@ static const nsISupportsWeakReferenceVtbl nsSupportsWeakReferenceVtbl = {
|
|||||||
nsresult create_chrome_window(nsIWebBrowserChrome *parent, nsIWebBrowserChrome **ret)
|
nsresult create_chrome_window(nsIWebBrowserChrome *parent, nsIWebBrowserChrome **ret)
|
||||||
{
|
{
|
||||||
NSContainer *new_container;
|
NSContainer *new_container;
|
||||||
|
HRESULT hres;
|
||||||
|
|
||||||
if(parent->lpVtbl != &nsWebBrowserChromeVtbl)
|
if(parent->lpVtbl != &nsWebBrowserChromeVtbl)
|
||||||
return NS_ERROR_UNEXPECTED;
|
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;
|
*ret = &new_container->nsIWebBrowserChrome_iface;
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
NSContainer *NSContainer_Create(HTMLDocumentObj *doc, NSContainer *parent)
|
static HRESULT init_nscontainer(NSContainer *nscontainer)
|
||||||
{
|
{
|
||||||
nsIWebBrowserSetup *wbsetup;
|
nsIWebBrowserSetup *wbsetup;
|
||||||
nsIScrollable *scrollable;
|
nsIScrollable *scrollable;
|
||||||
NSContainer *ret;
|
|
||||||
nsresult nsres;
|
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,
|
nsres = nsIComponentManager_CreateInstanceByContractID(pCompMgr, NS_WEBBROWSER_CONTRACTID,
|
||||||
NULL, &IID_nsIWebBrowser, (void**)&ret->webbrowser);
|
NULL, &IID_nsIWebBrowser, (void**)&nscontainer->webbrowser);
|
||||||
if(NS_FAILED(nsres)) {
|
if(NS_FAILED(nsres)) {
|
||||||
ERR("Creating WebBrowser failed: %08x\n", nsres);
|
ERR("Creating WebBrowser failed: %08x\n", nsres);
|
||||||
heap_free(ret);
|
return E_FAIL;
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(parent)
|
nsres = nsIWebBrowser_SetContainerWindow(nscontainer->webbrowser, &nscontainer->nsIWebBrowserChrome_iface);
|
||||||
nsIWebBrowserChrome_AddRef(&parent->nsIWebBrowserChrome_iface);
|
if(NS_FAILED(nsres)) {
|
||||||
ret->parent = parent;
|
|
||||||
|
|
||||||
nsres = nsIWebBrowser_SetContainerWindow(ret->webbrowser, &ret->nsIWebBrowserChrome_iface);
|
|
||||||
if(NS_FAILED(nsres))
|
|
||||||
ERR("SetContainerWindow failed: %08x\n", nsres);
|
ERR("SetContainerWindow failed: %08x\n", nsres);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
nsres = nsIWebBrowser_QueryInterface(ret->webbrowser, &IID_nsIBaseWindow,
|
nsres = nsIWebBrowser_QueryInterface(nscontainer->webbrowser, &IID_nsIBaseWindow,
|
||||||
(void**)&ret->window);
|
(void**)&nscontainer->window);
|
||||||
if(NS_FAILED(nsres))
|
if(NS_FAILED(nsres)) {
|
||||||
ERR("Could not get nsIBaseWindow interface: %08x\n", 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);
|
(void**)&wbsetup);
|
||||||
if(NS_SUCCEEDED(nsres)) {
|
if(NS_SUCCEEDED(nsres)) {
|
||||||
nsres = nsIWebBrowserSetup_SetProperty(wbsetup, SETUP_IS_CHROME_WRAPPER, FALSE);
|
nsres = nsIWebBrowserSetup_SetProperty(wbsetup, SETUP_IS_CHROME_WRAPPER, FALSE);
|
||||||
nsIWebBrowserSetup_Release(wbsetup);
|
nsIWebBrowserSetup_Release(wbsetup);
|
||||||
if(NS_FAILED(nsres))
|
if(NS_FAILED(nsres)) {
|
||||||
ERR("SetProperty(SETUP_IS_CHROME_WRAPPER) failed: %08x\n", nsres);
|
ERR("SetProperty(SETUP_IS_CHROME_WRAPPER) failed: %08x\n", nsres);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
}else {
|
}else {
|
||||||
ERR("Could not get nsIWebBrowserSetup interface\n");
|
ERR("Could not get nsIWebBrowserSetup interface\n");
|
||||||
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsres = nsIWebBrowser_QueryInterface(ret->webbrowser, &IID_nsIWebNavigation,
|
nsres = nsIWebBrowser_QueryInterface(nscontainer->webbrowser, &IID_nsIWebNavigation,
|
||||||
(void**)&ret->navigation);
|
(void**)&nscontainer->navigation);
|
||||||
if(NS_FAILED(nsres))
|
if(NS_FAILED(nsres)) {
|
||||||
ERR("Could not get nsIWebNavigation interface: %08x\n", nsres);
|
ERR("Could not get nsIWebNavigation interface: %08x\n", nsres);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
nsres = nsIWebBrowserFocus_QueryInterface(ret->webbrowser, &IID_nsIWebBrowserFocus,
|
nsres = nsIWebBrowserFocus_QueryInterface(nscontainer->webbrowser, &IID_nsIWebBrowserFocus,
|
||||||
(void**)&ret->focus);
|
(void**)&nscontainer->focus);
|
||||||
if(NS_FAILED(nsres))
|
if(NS_FAILED(nsres)) {
|
||||||
ERR("Could not get nsIWebBrowserFocus interface: %08x\n", nsres);
|
ERR("Could not get nsIWebBrowserFocus interface: %08x\n", nsres);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
if(!nscontainer_class)
|
if(!nscontainer_class) {
|
||||||
register_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,
|
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)) {
|
if(NS_SUCCEEDED(nsres)) {
|
||||||
nsres = nsIBaseWindow_Create(ret->window);
|
nsres = nsIBaseWindow_Create(nscontainer->window);
|
||||||
if(NS_FAILED(nsres))
|
if(NS_FAILED(nsres)) {
|
||||||
WARN("Creating window failed: %08x\n", nsres);
|
WARN("Creating window failed: %08x\n", nsres);
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
nsIBaseWindow_SetVisibility(ret->window, FALSE);
|
nsIBaseWindow_SetVisibility(nscontainer->window, FALSE);
|
||||||
nsIBaseWindow_SetEnabled(ret->window, FALSE);
|
nsIBaseWindow_SetEnabled(nscontainer->window, FALSE);
|
||||||
}else {
|
}else {
|
||||||
ERR("InitWindow failed: %08x\n", nsres);
|
ERR("InitWindow failed: %08x\n", nsres);
|
||||||
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
nsres = nsIWebBrowser_SetParentURIContentListener(ret->webbrowser,
|
nsres = nsIWebBrowser_SetParentURIContentListener(nscontainer->webbrowser,
|
||||||
&ret->nsIURIContentListener_iface);
|
&nscontainer->nsIURIContentListener_iface);
|
||||||
if(NS_FAILED(nsres))
|
if(NS_FAILED(nsres))
|
||||||
ERR("SetParentURIContentListener failed: %08x\n", 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)) {
|
if(NS_SUCCEEDED(nsres)) {
|
||||||
nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable,
|
nsres = nsIScrollable_SetDefaultScrollbarPreferences(scrollable,
|
||||||
ScrollOrientation_Y, Scrollbar_Always);
|
ScrollOrientation_Y, Scrollbar_Always);
|
||||||
@ -1832,7 +1835,42 @@ NSContainer *NSContainer_Create(HTMLDocumentObj *doc, NSContainer *parent)
|
|||||||
ERR("Could not get nsIScrollable: %08x\n", nsres);
|
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)
|
void NSContainer_Release(NSContainer *This)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user