bug #88229 (r=adamlock, r=ccarlen) Allow the embeddor to spin up a sub-event-pump when nsIWebBrowserChrome::CreateBrowserWindow(...) is called to ensure that a documeent has been loaded before returning... This means that we need to push a PLEventQ for them :-)
git-svn-id: svn://10.0.0.236/branches/MOZILLA_0_9_2_BRANCH@99676 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
@@ -60,6 +60,9 @@
|
||||
#include "nsIWalletService.h"
|
||||
#include "nsIWebBrowserChromeFocus.h"
|
||||
|
||||
#include "nsIEventQueue.h"
|
||||
#include "nsIEventQueueService.h"
|
||||
|
||||
static char *sWindowWatcherContractID = "@mozilla.org/embedcomp/window-watcher;1";
|
||||
|
||||
|
||||
@@ -432,27 +435,65 @@ NS_IMETHODIMP nsDocShellTreeOwner::GetNewWindow(PRInt32 aChromeFlags,
|
||||
nsIDocShellTreeItem** aDocShellTreeItem)
|
||||
{
|
||||
nsresult rv;
|
||||
|
||||
if(mTreeOwner)
|
||||
return mTreeOwner->GetNewWindow(aChromeFlags, aDocShellTreeItem);
|
||||
nsCOMPtr<nsIEventQueueService> eventQService;
|
||||
nsCOMPtr<nsIEventQueue> eventQ;
|
||||
|
||||
*aDocShellTreeItem = nsnull;
|
||||
|
||||
NS_ENSURE_TRUE(mWebBrowserChrome, NS_ERROR_FAILURE);
|
||||
aChromeFlags &= ~(nsIWebBrowserChrome::CHROME_WITH_SIZE | nsIWebBrowserChrome::CHROME_WITH_POSITION);
|
||||
//
|
||||
// The first thing to do is push a nested event queue for PLEvent
|
||||
// processing...
|
||||
//
|
||||
// When nsIWebBrowserChrome::CreateBrowserWindow(...) is called, the
|
||||
// embeddor must create a nested message pump, and block until the
|
||||
// initial document has been loaded into the webBrowser.
|
||||
//
|
||||
// The nested event queue is also needed so that event processing from
|
||||
// necko will be handled.
|
||||
//
|
||||
eventQService = do_GetService(NS_EVENTQUEUESERVICE_CONTRACTID, &rv);
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
nsCOMPtr<nsIWebBrowser> webBrowser;
|
||||
rv = mWebBrowserChrome->CreateBrowserWindow(PRUint32(aChromeFlags),
|
||||
-1, -1, -1, -1, // this is kind of a problem
|
||||
getter_AddRefs(webBrowser));
|
||||
if (NS_SUCCEEDED(rv) && webBrowser) {
|
||||
nsCOMPtr<nsIInterfaceRequestor> asreq(do_QueryInterface(webBrowser));
|
||||
if (asreq) {
|
||||
nsCOMPtr<nsIDocShell> asshell(do_GetInterface(asreq));
|
||||
if (asshell)
|
||||
rv = CallQueryInterface(asshell, aDocShellTreeItem);
|
||||
//
|
||||
// IMPORTANT: Once the new event queue has been pushed, any early returns
|
||||
// --------- in this method must pop the queue !!!
|
||||
//
|
||||
rv = eventQService->PushThreadEventQueue(getter_AddRefs(eventQ));
|
||||
if (NS_FAILED(rv)) return rv;
|
||||
|
||||
//
|
||||
// Now, create the new top-level window. If a tree owner exists, then ask
|
||||
// it for the window, otherwise create it using nsIWebBrowserChrome...
|
||||
//
|
||||
if(mTreeOwner) {
|
||||
rv = mTreeOwner->GetNewWindow(aChromeFlags, aDocShellTreeItem);
|
||||
}
|
||||
else if (mWebBrowserChrome) {
|
||||
aChromeFlags &= ~(nsIWebBrowserChrome::CHROME_WITH_SIZE | nsIWebBrowserChrome::CHROME_WITH_POSITION);
|
||||
|
||||
nsCOMPtr<nsIWebBrowser> webBrowser;
|
||||
rv = mWebBrowserChrome->CreateBrowserWindow(PRUint32(aChromeFlags),
|
||||
-1, -1, -1, -1, // this is kind of a problem
|
||||
getter_AddRefs(webBrowser));
|
||||
if (NS_SUCCEEDED(rv) && webBrowser) {
|
||||
nsCOMPtr<nsIInterfaceRequestor> asreq(do_QueryInterface(webBrowser));
|
||||
if (asreq) {
|
||||
nsCOMPtr<nsIDocShell> asshell(do_GetInterface(asreq));
|
||||
if (asshell)
|
||||
rv = CallQueryInterface(asshell, aDocShellTreeItem);
|
||||
}
|
||||
}
|
||||
}
|
||||
// No tree owner or nsIWebBrowserChrome... We are out of luck :-(
|
||||
else {
|
||||
rv = NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
//
|
||||
// Pop the nested Event Queue...
|
||||
//
|
||||
(void) eventQService->PopThreadEventQueue(eventQ);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user