зеркало из https://github.com/mozilla/gecko-dev.git
Bug 990812 - Add nsIDOMChromeWindow.getGroupMessageManager() API r=smaug
This commit is contained in:
Родитель
54f552cc43
Коммит
b4db14fef7
|
@ -13115,6 +13115,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(nsGlobalChromeWindow,
|
|||
nsGlobalWindow)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mBrowserDOMWindow)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMessageManager)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mGroupMessageManagers)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
|
||||
|
||||
|
||||
|
@ -13126,6 +13127,10 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(nsGlobalChromeWindow,
|
|||
tmp->mMessageManager.get())->Disconnect();
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mMessageManager)
|
||||
}
|
||||
|
||||
tmp->mGroupMessageManagers.EnumerateRead(DisconnectGroupMessageManager, nullptr);
|
||||
tmp->mGroupMessageManagers.Clear();
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK(mGroupMessageManagers)
|
||||
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
|
||||
|
||||
DOMCI_DATA(ChromeWindow, nsGlobalChromeWindow)
|
||||
|
@ -13494,6 +13499,39 @@ nsGlobalWindow::GetMessageManager(ErrorResult& aError)
|
|||
return myself->mMessageManager;
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsGlobalChromeWindow::GetGroupMessageManager(const nsAString& aGroup,
|
||||
nsIMessageBroadcaster** aManager)
|
||||
{
|
||||
ErrorResult rv;
|
||||
NS_IF_ADDREF(*aManager = GetGroupMessageManager(aGroup, rv));
|
||||
return rv.ErrorCode();
|
||||
}
|
||||
|
||||
nsIMessageBroadcaster*
|
||||
nsGlobalWindow::GetGroupMessageManager(const nsAString& aGroup,
|
||||
ErrorResult& aError)
|
||||
{
|
||||
FORWARD_TO_INNER_OR_THROW(GetGroupMessageManager, (aGroup, aError), aError, nullptr);
|
||||
MOZ_ASSERT(IsChromeWindow());
|
||||
|
||||
nsGlobalChromeWindow* myself = static_cast<nsGlobalChromeWindow*>(this);
|
||||
nsCOMPtr<nsIMessageBroadcaster> messageManager =
|
||||
myself->mGroupMessageManagers.Get(aGroup);
|
||||
|
||||
if (!messageManager) {
|
||||
nsFrameMessageManager* parent =
|
||||
static_cast<nsFrameMessageManager*>(GetMessageManager(aError));
|
||||
|
||||
messageManager = new nsFrameMessageManager(nullptr,
|
||||
parent,
|
||||
MM_CHROME | MM_BROADCASTER);
|
||||
myself->mGroupMessageManagers.Put(aGroup, messageManager);
|
||||
}
|
||||
|
||||
return messageManager;
|
||||
}
|
||||
|
||||
// nsGlobalModalWindow implementation
|
||||
|
||||
// QueryInterface implementation for nsGlobalModalWindow
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include "nsTHashtable.h"
|
||||
#include "nsHashKeys.h"
|
||||
#include "nsRefPtrHashtable.h"
|
||||
#include "nsInterfaceHashtable.h"
|
||||
|
||||
// Local Includes
|
||||
// Helper Classes
|
||||
|
@ -1006,6 +1007,8 @@ public:
|
|||
void NotifyDefaultButtonLoaded(mozilla::dom::Element& aDefaultButton,
|
||||
mozilla::ErrorResult& aError);
|
||||
nsIMessageBroadcaster* GetMessageManager(mozilla::ErrorResult& aError);
|
||||
nsIMessageBroadcaster* GetGroupMessageManager(const nsAString& aGroup,
|
||||
mozilla::ErrorResult& aError);
|
||||
void BeginWindowMove(mozilla::dom::Event& aMouseDownEvent,
|
||||
mozilla::dom::Element* aPanel,
|
||||
mozilla::ErrorResult& aError);
|
||||
|
@ -1621,16 +1624,32 @@ public:
|
|||
NS_DECL_NSIDOMCHROMEWINDOW
|
||||
|
||||
nsGlobalChromeWindow(nsGlobalWindow *aOuterWindow)
|
||||
: nsGlobalWindow(aOuterWindow)
|
||||
: nsGlobalWindow(aOuterWindow),
|
||||
mGroupMessageManagers(1)
|
||||
{
|
||||
mIsChrome = true;
|
||||
mCleanMessageManager = true;
|
||||
}
|
||||
|
||||
static PLDHashOperator
|
||||
DisconnectGroupMessageManager(const nsAString& aKey,
|
||||
nsIMessageBroadcaster* aMM,
|
||||
void* aUserArg)
|
||||
{
|
||||
if (aMM) {
|
||||
static_cast<nsFrameMessageManager*>(aMM)->Disconnect();
|
||||
}
|
||||
return PL_DHASH_NEXT;
|
||||
}
|
||||
|
||||
~nsGlobalChromeWindow()
|
||||
{
|
||||
NS_ABORT_IF_FALSE(mCleanMessageManager,
|
||||
"chrome windows may always disconnect the msg manager");
|
||||
|
||||
mGroupMessageManagers.EnumerateRead(DisconnectGroupMessageManager, nullptr);
|
||||
mGroupMessageManagers.Clear();
|
||||
|
||||
if (mMessageManager) {
|
||||
static_cast<nsFrameMessageManager *>(
|
||||
mMessageManager.get())->Disconnect();
|
||||
|
@ -1652,10 +1671,12 @@ public:
|
|||
using nsGlobalWindow::Restore;
|
||||
using nsGlobalWindow::NotifyDefaultButtonLoaded;
|
||||
using nsGlobalWindow::GetMessageManager;
|
||||
using nsGlobalWindow::GetGroupMessageManager;
|
||||
using nsGlobalWindow::BeginWindowMove;
|
||||
|
||||
nsCOMPtr<nsIBrowserDOMWindow> mBrowserDOMWindow;
|
||||
nsCOMPtr<nsIMessageBroadcaster> mMessageManager;
|
||||
nsInterfaceHashtable<nsStringHashKey, nsIMessageBroadcaster> mGroupMessageManagers;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -10,7 +10,7 @@ interface nsIDOMElement;
|
|||
interface nsIDOMEvent;
|
||||
interface nsIMessageBroadcaster;
|
||||
|
||||
[scriptable, uuid(0c10226f-8abb-4345-aa6b-2780a6f4687e)]
|
||||
[scriptable, uuid(78bdcb41-1efa-409f-aaba-70842213f80f)]
|
||||
interface nsIDOMChromeWindow : nsISupports
|
||||
{
|
||||
const unsigned short STATE_MAXIMIZED = 1;
|
||||
|
@ -45,6 +45,12 @@ interface nsIDOMChromeWindow : nsISupports
|
|||
|
||||
readonly attribute nsIMessageBroadcaster messageManager;
|
||||
|
||||
/**
|
||||
* Returns the message manager identified by the given group name that
|
||||
* manages all frame loaders belonging to that group.
|
||||
*/
|
||||
nsIMessageBroadcaster getGroupMessageManager(in AString group);
|
||||
|
||||
/**
|
||||
* On some operating systems, we must allow the window manager to
|
||||
* handle window dragging. This function tells the window manager to
|
||||
|
|
|
@ -433,6 +433,13 @@ interface ChromeWindow {
|
|||
[Throws, Func="nsGlobalWindow::IsChromeWindow"]
|
||||
readonly attribute nsIMessageBroadcaster messageManager;
|
||||
|
||||
/**
|
||||
* Returns the message manager identified by the given group name that
|
||||
* manages all frame loaders belonging to that group.
|
||||
*/
|
||||
[Throws, Func="nsGlobalWindow::IsChromeWindow"]
|
||||
nsIMessageBroadcaster getGroupMessageManager(DOMString aGroup);
|
||||
|
||||
/**
|
||||
* On some operating systems, we must allow the window manager to
|
||||
* handle window dragging. This function tells the window manager to
|
||||
|
|
Загрузка…
Ссылка в новой задаче