Bug 1448850 - Remove nsIMessageBroadcaster. r=bz.

--HG--
extra : rebase_source : c9ef8d762347b3c71dd5cfeffafbfbb81eb6e042
This commit is contained in:
Peter Van der Beken 2018-02-14 17:35:39 +01:00
Родитель 355e71640d
Коммит 01a1cdcd31
24 изменённых файлов: 160 добавлений и 257 удалений

Просмотреть файл

@ -7,12 +7,13 @@
#include "mozilla/dom/ChromeMessageBroadcaster.h"
#include "AccessCheck.h"
#include "mozilla/HoldDropJSObjects.h"
#include "mozilla/dom/ContentParent.h"
#include "mozilla/dom/MessageManagerBinding.h"
namespace mozilla {
namespace dom {
ChromeMessageBroadcaster::ChromeMessageBroadcaster(nsFrameMessageManager* aParentManager,
ChromeMessageBroadcaster::ChromeMessageBroadcaster(ChromeMessageBroadcaster* aParentManager,
MessageManagerFlags aFlags)
: MessageListenerManager(nullptr, aParentManager,
aFlags |
@ -43,5 +44,28 @@ ChromeMessageBroadcaster::WrapObject(JSContext* aCx,
return ChromeMessageBroadcasterBinding::Wrap(aCx, this, aGivenProto);
}
void
ChromeMessageBroadcaster::ReleaseCachedProcesses()
{
ContentParent::ReleaseCachedProcesses();
}
void
ChromeMessageBroadcaster::AddChildManager(MessageListenerManager* aManager)
{
mChildManagers.AppendElement(aManager);
RefPtr<nsFrameMessageManager> kungfuDeathGrip = this;
RefPtr<nsFrameMessageManager> kungfuDeathGrip2 = aManager;
LoadPendingScripts(this, aManager);
}
void
ChromeMessageBroadcaster::RemoveChildManager(MessageListenerManager* aManager)
{
mChildManagers.RemoveElement(aManager);
}
} // namespace dom
} // namespace mozilla

Просмотреть файл

@ -22,14 +22,21 @@ public:
MessageManagerFlags::MM_PROCESSMANAGER |
MessageManagerFlags::MM_OWNSCALLBACK)));
}
explicit ChromeMessageBroadcaster(nsFrameMessageManager* aParentManager)
explicit ChromeMessageBroadcaster(ChromeMessageBroadcaster* aParentManager)
: ChromeMessageBroadcaster(aParentManager, MessageManagerFlags::MM_NONE)
{}
static ChromeMessageBroadcaster* From(nsFrameMessageManager* aManager)
{
if (aManager->IsBroadcaster() && aManager->IsChrome()) {
return static_cast<ChromeMessageBroadcaster*>(aManager);
}
return nullptr;
}
virtual JSObject* WrapObject(JSContext* aCx,
JS::Handle<JSObject*> aGivenProto) override;
using nsFrameMessageManager::BroadcastAsyncMessage;
void BroadcastAsyncMessage(JSContext* aCx, const nsAString& aMessageName,
JS::Handle<JS::Value> aObj,
JS::Handle<JSObject*> aObjects,
@ -42,12 +49,11 @@ public:
{
return mChildManagers.Length();
}
using nsFrameMessageManager::GetChildAt;
MessageListenerManager* GetChildAt(uint32_t aIndex)
{
return mChildManagers.SafeElementAt(aIndex);
}
// XPCOM ReleaseCachedProcesses is OK
void ReleaseCachedProcesses();
// ProcessScriptLoader
void LoadProcessScript(const nsAString& aUrl, bool aAllowDelayedLoad,
@ -86,8 +92,11 @@ public:
GetDelayedScripts(aCx, aScripts, aError);
}
void AddChildManager(MessageListenerManager* aManager);
void RemoveChildManager(MessageListenerManager* aManager);
private:
ChromeMessageBroadcaster(nsFrameMessageManager* aParentManager,
ChromeMessageBroadcaster(ChromeMessageBroadcaster* aParentManager,
MessageManagerFlags aFlags);
virtual ~ChromeMessageBroadcaster();
};

Просмотреть файл

@ -11,7 +11,7 @@ namespace mozilla {
namespace dom {
ChromeMessageSender::ChromeMessageSender(ipc::MessageManagerCallback* aCallback,
nsFrameMessageManager* aParentManager,
ChromeMessageBroadcaster* aParentManager,
MessageManagerFlags aFlags)
: MessageSender(aCallback, aParentManager, aFlags | MessageManagerFlags::MM_CHROME)
{

Просмотреть файл

@ -12,11 +12,13 @@
namespace mozilla {
namespace dom {
class ChromeMessageBroadcaster;
class ChromeMessageSender final : public MessageSender
{
public:
ChromeMessageSender(ipc::MessageManagerCallback* aCallback,
nsFrameMessageManager* aParentManager,
ChromeMessageBroadcaster* aParentManager,
MessageManagerFlags aFlags=MessageManagerFlags::MM_NONE);
virtual JSObject* WrapObject(JSContext* aCx,

Просмотреть файл

@ -10,7 +10,7 @@ namespace mozilla {
namespace dom {
MessageListenerManager::MessageListenerManager(ipc::MessageManagerCallback* aCallback,
nsFrameMessageManager* aParentManager,
ChromeMessageBroadcaster* aParentManager,
ipc::MessageManagerFlags aFlags)
: nsFrameMessageManager(aCallback, aFlags),
mParentManager(aParentManager)

Просмотреть файл

@ -22,12 +22,12 @@ public:
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(MessageListenerManager,
nsFrameMessageManager)
nsISupports* GetParentObject()
ChromeMessageBroadcaster* GetParentObject()
{
return ToSupports(mParentManager.get());
return mParentManager;
}
virtual nsFrameMessageManager* GetParentManager() override
virtual ChromeMessageBroadcaster* GetParentManager() override
{
return mParentManager;
}
@ -40,11 +40,11 @@ public:
protected:
MessageListenerManager(ipc::MessageManagerCallback* aCallback,
nsFrameMessageManager* aParentManager,
ChromeMessageBroadcaster* aParentManager,
MessageManagerFlags aFlags);
virtual ~MessageListenerManager();
RefPtr<nsFrameMessageManager> mParentManager;
RefPtr<ChromeMessageBroadcaster> mParentManager;
};
} // namespace dom

Просмотреть файл

@ -19,7 +19,7 @@ public:
protected:
MessageSender(ipc::MessageManagerCallback* aCallback,
nsFrameMessageManager* aParentManager,
ChromeMessageBroadcaster* aParentManager,
MessageManagerFlags aFlags)
: MessageListenerManager(aCallback, aParentManager, aFlags)
{}

Просмотреть файл

@ -86,21 +86,20 @@ nsCCUncollectableMarker::Init()
}
static void
MarkChildMessageManagers(nsIMessageBroadcaster* aMM)
MarkChildMessageManagers(ChromeMessageBroadcaster* aMM)
{
aMM->MarkForCC();
uint32_t tabChildCount = 0;
aMM->GetChildCount(&tabChildCount);
uint32_t tabChildCount = aMM->ChildCount();
for (uint32_t j = 0; j < tabChildCount; ++j) {
nsCOMPtr<nsIMessageListenerManager> childMM;
aMM->GetChildAt(j, getter_AddRefs(childMM));
RefPtr<MessageListenerManager> childMM = aMM->GetChildAt(j);
if (!childMM) {
continue;
}
nsCOMPtr<nsIMessageBroadcaster> strongNonLeafMM = do_QueryInterface(childMM);
nsIMessageBroadcaster* nonLeafMM = strongNonLeafMM;
RefPtr<ChromeMessageBroadcaster> strongNonLeafMM =
ChromeMessageBroadcaster::From(childMM);
ChromeMessageBroadcaster* nonLeafMM = strongNonLeafMM;
nsCOMPtr<nsIMessageSender> strongTabMM = do_QueryInterface(childMM);
nsIMessageSender* tabMM = strongTabMM;
@ -150,27 +149,25 @@ MarkMessageManagers()
if (!XRE_IsParentProcess()) {
return;
}
nsCOMPtr<nsIMessageBroadcaster> strongGlobalMM =
do_GetService("@mozilla.org/globalmessagemanager;1");
RefPtr<ChromeMessageBroadcaster> strongGlobalMM =
nsFrameMessageManager::GetGlobalMessageManager();
if (!strongGlobalMM) {
return;
}
nsIMessageBroadcaster* globalMM = strongGlobalMM;
ChromeMessageBroadcaster* globalMM = strongGlobalMM;
strongGlobalMM = nullptr;
MarkChildMessageManagers(globalMM);
if (nsFrameMessageManager::sParentProcessManager) {
nsFrameMessageManager::sParentProcessManager->MarkForCC();
uint32_t childCount = 0;
nsFrameMessageManager::sParentProcessManager->GetChildCount(&childCount);
uint32_t childCount = nsFrameMessageManager::sParentProcessManager->ChildCount();
for (uint32_t i = 0; i < childCount; ++i) {
nsCOMPtr<nsIMessageListenerManager> childMM;
nsFrameMessageManager::sParentProcessManager->
GetChildAt(i, getter_AddRefs(childMM));
RefPtr<MessageListenerManager> childMM =
nsFrameMessageManager::sParentProcessManager->GetChildAt(i);
if (!childMM) {
continue;
}
nsIMessageListenerManager* child = childMM;
MessageListenerManager* child = childMM;
childMM = nullptr;
child->MarkForCC();
}

Просмотреть файл

@ -7771,20 +7771,18 @@ nsContentUtils::GetHostOrIPv6WithBrackets(nsIURI* aURI, nsAString& aHost)
}
bool
nsContentUtils::CallOnAllRemoteChildren(nsIMessageBroadcaster* aManager,
nsContentUtils::CallOnAllRemoteChildren(ChromeMessageBroadcaster* aManager,
CallOnRemoteChildFunction aCallback,
void* aArg)
{
uint32_t tabChildCount = 0;
aManager->GetChildCount(&tabChildCount);
uint32_t tabChildCount = aManager->ChildCount();
for (uint32_t j = 0; j < tabChildCount; ++j) {
nsCOMPtr<nsIMessageListenerManager> childMM;
aManager->GetChildAt(j, getter_AddRefs(childMM));
RefPtr<MessageListenerManager> childMM = aManager->GetChildAt(j);
if (!childMM) {
continue;
}
nsCOMPtr<nsIMessageBroadcaster> nonLeafMM = do_QueryInterface(childMM);
RefPtr<ChromeMessageBroadcaster> nonLeafMM = ChromeMessageBroadcaster::From(childMM);
if (nonLeafMM) {
if (CallOnAllRemoteChildren(nonLeafMM, aCallback, aArg)) {
return true;
@ -7815,10 +7813,9 @@ nsContentUtils::CallOnAllRemoteChildren(nsPIDOMWindowOuter* aWindow,
CallOnRemoteChildFunction aCallback,
void* aArg)
{
nsCOMPtr<nsIDOMChromeWindow> chromeWindow(do_QueryInterface(aWindow));
if (chromeWindow) {
nsCOMPtr<nsIMessageBroadcaster> windowMM;
chromeWindow->GetMessageManager(getter_AddRefs(windowMM));
nsGlobalWindowOuter* window = nsGlobalWindowOuter::Cast(aWindow);
if (window->IsChromeWindow()) {
RefPtr<ChromeMessageBroadcaster> windowMM = window->GetMessageManager();
if (windowMM) {
CallOnAllRemoteChildren(windowMM, aCallback, aArg);
}

Просмотреть файл

@ -82,7 +82,6 @@ class nsIInterfaceRequestor;
class nsIIOService;
class nsILoadInfo;
class nsILoadGroup;
class nsIMessageBroadcaster;
class nsNameSpaceManager;
class nsIObserver;
class nsIParser;
@ -129,6 +128,7 @@ class EventListenerManager;
class HTMLEditor;
namespace dom {
class ChromeMessageBroadcaster;
struct CustomElementDefinition;
class DocumentFragment;
class Element;
@ -3343,7 +3343,7 @@ private:
mozilla::dom::AutocompleteInfo& aInfo,
bool aGrantAllValidValue = false);
static bool CallOnAllRemoteChildren(nsIMessageBroadcaster* aManager,
static bool CallOnAllRemoteChildren(mozilla::dom::ChromeMessageBroadcaster* aManager,
CallOnRemoteChildFunction aCallback,
void* aArg);

Просмотреть файл

@ -24,7 +24,6 @@
class nsIContent;
class nsIDocShellTreeItem;
class nsPIDOMWindowOuter;
class nsIMessageBroadcaster;
namespace mozilla {
namespace dom {
@ -178,12 +177,6 @@ protected:
*/
void EnsureCurrentWidgetFocused();
/**
* Iterate over the children of the message broadcaster and notify them
* of the activation change.
*/
void ActivateOrDeactivateChildren(nsIMessageBroadcaster* aManager, bool aActive);
/**
* Activate or deactivate the window and send the activate/deactivate events.
*/

Просмотреть файл

@ -2909,28 +2909,27 @@ nsFrameLoader::EnsureMessageManager()
return NS_OK;
}
nsCOMPtr<nsIDOMChromeWindow> chromeWindow =
do_QueryInterface(GetOwnerDoc()->GetWindow());
nsCOMPtr<nsIMessageBroadcaster> parentManager;
RefPtr<nsGlobalWindowOuter> window =
nsGlobalWindowOuter::Cast(GetOwnerDoc()->GetWindow());
RefPtr<ChromeMessageBroadcaster> parentManager;
if (chromeWindow) {
if (window && window->IsChromeWindow()) {
nsAutoString messagemanagergroup;
if (mOwnerContent->IsXULElement() &&
mOwnerContent->GetAttr(kNameSpaceID_None,
nsGkAtoms::messagemanagergroup,
messagemanagergroup)) {
chromeWindow->GetGroupMessageManager(messagemanagergroup, getter_AddRefs(parentManager));
parentManager = window->GetGroupMessageManager(messagemanagergroup);
}
if (!parentManager) {
chromeWindow->GetMessageManager(getter_AddRefs(parentManager));
parentManager = window->GetMessageManager();
}
} else {
parentManager = do_GetService("@mozilla.org/globalmessagemanager;1");
parentManager = nsFrameMessageManager::GetGlobalMessageManager();
}
mMessageManager = new ChromeMessageSender(nullptr,
static_cast<nsFrameMessageManager*>(parentManager.get()));
mMessageManager = new ChromeMessageSender(nullptr, parentManager);
if (!IsRemoteFrame()) {
nsresult rv = MaybeCreateDocShell();
if (NS_FAILED(rv)) {

Просмотреть файл

@ -29,6 +29,7 @@
#include "nsIProtocolHandler.h"
#include "nsIScriptSecurityManager.h"
#include "xpcpublic.h"
#include "mozilla/ClearOnShutdown.h"
#include "mozilla/CycleCollectedJSContext.h"
#include "mozilla/Preferences.h"
#include "mozilla/ScriptPreloader.h"
@ -132,23 +133,13 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsFrameMessageManager)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIContentFrameMessageManager)
/* nsFrameMessageManager implements nsIMessageSender and nsIMessageBroadcaster,
* both of which descend from nsIMessageListenerManager. QI'ing to
* nsIMessageListenerManager is therefore ambiguous and needs explicit casts
* depending on which child interface applies. */
NS_INTERFACE_MAP_ENTRY_AGGREGATED(nsIMessageListenerManager,
(mIsBroadcaster ?
static_cast<nsIMessageListenerManager*>(
static_cast<nsIMessageBroadcaster*>(this)) :
static_cast<nsIMessageListenerManager*>(
static_cast<nsIMessageSender*>(this))))
NS_INTERFACE_MAP_ENTRY(nsIMessageListenerManager)
/* Message managers in child process implement nsIMessageSender.
Message managers in the chrome process are
either broadcasters (if they have subordinate/child message
managers) or they're simple message senders. */
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIMessageSender, !mChrome || !mIsBroadcaster)
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIMessageBroadcaster, mChrome && mIsBroadcaster)
/* nsIContentFrameMessageManager is accessible only in TabChildGlobal. */
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsIContentFrameMessageManager,
@ -750,46 +741,6 @@ nsFrameMessageManager::SendAsyncMessage(const nsAString& aMessageName,
}
// nsIMessageBroadcaster
NS_IMETHODIMP
nsFrameMessageManager::BroadcastAsyncMessage(const nsAString& aMessageName,
JS::Handle<JS::Value> aJSON,
JS::Handle<JS::Value> aObjects,
JSContext* aCx,
uint8_t aArgc)
{
return DispatchAsyncMessage(aMessageName, aJSON, aObjects, nullptr,
JS::UndefinedHandleValue, aCx, aArgc);
}
NS_IMETHODIMP
nsFrameMessageManager::GetChildCount(uint32_t* aChildCount)
{
*aChildCount = mChildManagers.Length();
return NS_OK;
}
NS_IMETHODIMP
nsFrameMessageManager::GetChildAt(uint32_t aIndex,
nsIMessageListenerManager** aMM)
{
MessageListenerManager* mm = mChildManagers.SafeElementAt(aIndex);
if (mm) {
CallQueryInterface(mm, aMM);
} else {
*aMM = nullptr;
}
return NS_OK;
}
NS_IMETHODIMP
nsFrameMessageManager::ReleaseCachedProcesses()
{
ContentParent::ReleaseCachedProcesses();
return NS_OK;
}
class MMListenerRemover
{
public:
@ -1044,23 +995,6 @@ nsFrameMessageManager::ReceiveMessage(nsISupports* aTarget,
return NS_OK;
}
void
nsFrameMessageManager::AddChildManager(MessageListenerManager* aManager)
{
mChildManagers.AppendElement(aManager);
RefPtr<nsFrameMessageManager> kungfuDeathGrip = this;
RefPtr<nsFrameMessageManager> kungfuDeathGrip2 = aManager;
LoadPendingScripts(this, aManager);
}
void
nsFrameMessageManager::RemoveChildManager(MessageListenerManager* aManager)
{
mChildManagers.RemoveElement(aManager);
}
void
nsFrameMessageManager::LoadPendingScripts(nsFrameMessageManager* aManager,
nsFrameMessageManager* aChildMM)
@ -1352,20 +1286,16 @@ ReportReferentCount(const char* aManagerType,
#undef REPORT
}
static StaticRefPtr<ChromeMessageBroadcaster> sGlobalMessageManager;
NS_IMETHODIMP
MessageManagerReporter::CollectReports(nsIHandleReportCallback* aHandleReport,
nsISupports* aData, bool aAnonymize)
{
if (XRE_IsParentProcess()) {
nsCOMPtr<nsIMessageBroadcaster> globalmm =
do_GetService("@mozilla.org/globalmessagemanager;1");
if (globalmm) {
RefPtr<nsFrameMessageManager> mm =
static_cast<nsFrameMessageManager*>(globalmm.get());
MessageManagerReferentCount count;
CountReferents(mm, &count);
ReportReferentCount("global-manager", count, aHandleReport, aData);
}
if (XRE_IsParentProcess() && sGlobalMessageManager) {
MessageManagerReferentCount count;
CountReferents(sGlobalMessageManager, &count);
ReportReferentCount("global-manager", count, aHandleReport, aData);
}
if (nsFrameMessageManager::sParentProcessManager) {
@ -1386,15 +1316,25 @@ MessageManagerReporter::CollectReports(nsIHandleReportCallback* aHandleReport,
} // namespace dom
} // namespace mozilla
nsresult
NS_NewGlobalMessageManager(nsIMessageBroadcaster** aResult)
already_AddRefed<ChromeMessageBroadcaster>
nsFrameMessageManager::GetGlobalMessageManager()
{
NS_ENSURE_TRUE(XRE_IsParentProcess(),
NS_ERROR_NOT_AVAILABLE);
RefPtr<nsFrameMessageManager> mm =
new ChromeMessageBroadcaster(MessageManagerFlags::MM_GLOBAL);
RegisterStrongMemoryReporter(new MessageManagerReporter());
mm.forget(aResult);
RefPtr<ChromeMessageBroadcaster> mm;
if (sGlobalMessageManager) {
mm = sGlobalMessageManager;
} else {
sGlobalMessageManager = mm =
new ChromeMessageBroadcaster(MessageManagerFlags::MM_GLOBAL);
ClearOnShutdown(&sGlobalMessageManager);
RegisterStrongMemoryReporter(new MessageManagerReporter());
}
return mm.forget();
}
nsresult
NS_NewGlobalMessageManager(nsISupports** aResult)
{
*aResult = nsFrameMessageManager::GetGlobalMessageManager().take();
return NS_OK;
}
@ -1644,7 +1584,7 @@ nsMessageManagerScriptExecutor::MarkScopesForCC()
NS_IMPL_ISUPPORTS(nsScriptCacheCleaner, nsIObserver)
ChildProcessMessageManager* nsFrameMessageManager::sChildProcessManager = nullptr;
nsFrameMessageManager* nsFrameMessageManager::sParentProcessManager = nullptr;
ChromeMessageBroadcaster* nsFrameMessageManager::sParentProcessManager = nullptr;
nsFrameMessageManager* nsFrameMessageManager::sSameProcessParentManager = nullptr;
class nsAsyncMessageToSameProcessChild : public nsSameProcessAsyncMessageBase,
@ -1860,11 +1800,11 @@ public:
// This creates the global parent process message manager.
nsresult
NS_NewParentProcessMessageManager(nsIMessageBroadcaster** aResult)
NS_NewParentProcessMessageManager(nsISupports** aResult)
{
NS_ASSERTION(!nsFrameMessageManager::sParentProcessManager,
"Re-creating sParentProcessManager");
RefPtr<nsFrameMessageManager> mm =
RefPtr<ChromeMessageBroadcaster> mm =
new ChromeMessageBroadcaster(MessageManagerFlags::MM_PROCESSMANAGER);
nsFrameMessageManager::sParentProcessManager = mm;
nsFrameMessageManager::NewProcessMessageManager(false); // Create same process message manager.
@ -1877,7 +1817,7 @@ ChromeMessageSender*
nsFrameMessageManager::NewProcessMessageManager(bool aIsRemote)
{
if (!nsFrameMessageManager::sParentProcessManager) {
nsCOMPtr<nsIMessageBroadcaster> dummy =
nsCOMPtr<nsISupports> dummy =
do_GetService("@mozilla.org/parentprocessmessagemanager;1");
}

Просмотреть файл

@ -42,6 +42,7 @@ namespace dom {
class nsIContentParent;
class nsIContentChild;
class ChildProcessMessageManager;
class ChromeMessageBroadcaster;
class ChromeMessageSender;
class ClonedMessageData;
class MessageListener;
@ -172,8 +173,7 @@ private:
JS::Rooted<JSObject*> mObj;
};
class nsFrameMessageManager : public nsIContentFrameMessageManager,
public nsIMessageBroadcaster
class nsFrameMessageManager : public nsIContentFrameMessageManager
{
friend class mozilla::dom::MessageManagerReporter;
typedef mozilla::dom::ipc::StructuredCloneData StructuredCloneData;
@ -252,7 +252,6 @@ public:
NS_DECL_NSIMESSAGELISTENERMANAGER
NS_DECL_NSIMESSAGESENDER
NS_DECL_NSIMESSAGEBROADCASTER
NS_DECL_NSICONTENTFRAMEMESSAGEMANAGER
static mozilla::dom::ChromeMessageSender*
@ -264,8 +263,6 @@ public:
mozilla::jsipc::CpowHolder* aCpows, nsIPrincipal* aPrincipal,
nsTArray<StructuredCloneData>* aRetVal);
void AddChildManager(mozilla::dom::MessageListenerManager* aManager);
void RemoveChildManager(mozilla::dom::MessageListenerManager* aManager);
void Disconnect(bool aRemoveFromParent = true);
void Close();
@ -291,8 +288,12 @@ public:
nsIPrincipal* aPrincipal);
bool IsGlobal() { return mGlobal; }
bool IsBroadcaster() { return mIsBroadcaster; }
bool IsChrome() { return mChrome; }
static nsFrameMessageManager* GetParentProcessManager()
// GetGlobalMessageManager creates the global message manager if it hasn't been yet.
static already_AddRefed<mozilla::dom::ChromeMessageBroadcaster>
GetGlobalMessageManager();
static mozilla::dom::ChromeMessageBroadcaster* GetParentProcessManager()
{
return sParentProcessManager;
}
@ -312,7 +313,7 @@ public:
protected:
friend class MMListenerRemover;
virtual nsFrameMessageManager* GetParentManager()
virtual mozilla::dom::ChromeMessageBroadcaster* GetParentManager()
{
return nullptr;
}
@ -389,7 +390,7 @@ protected:
void LoadPendingScripts(nsFrameMessageManager* aManager,
nsFrameMessageManager* aChildMM);
public:
static nsFrameMessageManager* sParentProcessManager;
static mozilla::dom::ChromeMessageBroadcaster* sParentProcessManager;
static nsFrameMessageManager* sSameProcessParentManager;
static nsTArray<nsCOMPtr<nsIRunnable> >* sPendingSameProcessAsyncMessages;
private:

Просмотреть файл

@ -7768,49 +7768,27 @@ nsGlobalWindowInner::NotifyDefaultButtonLoaded(Element& aDefaultButton,
#endif
}
NS_IMETHODIMP
nsGlobalWindowInner::GetMessageManager(nsIMessageBroadcaster** aManager)
{
ErrorResult rv;
NS_IF_ADDREF(*aManager = GetMessageManager(rv));
return rv.StealNSResult();
}
ChromeMessageBroadcaster*
nsGlobalWindowInner::GetMessageManager(ErrorResult& aError)
nsGlobalWindowInner::MessageManager()
{
MOZ_ASSERT(IsChromeWindow());
if (!mChromeFields.mMessageManager) {
nsCOMPtr<nsIMessageBroadcaster> globalMM =
do_GetService("@mozilla.org/globalmessagemanager;1");
mChromeFields.mMessageManager =
new ChromeMessageBroadcaster(static_cast<nsFrameMessageManager*>(globalMM.get()));
RefPtr<ChromeMessageBroadcaster> globalMM =
nsFrameMessageManager::GetGlobalMessageManager();
mChromeFields.mMessageManager = new ChromeMessageBroadcaster(globalMM);
}
return mChromeFields.mMessageManager;
}
NS_IMETHODIMP
nsGlobalWindowInner::GetGroupMessageManager(const nsAString& aGroup,
nsIMessageBroadcaster** aManager)
{
MOZ_RELEASE_ASSERT(IsChromeWindow());
ErrorResult rv;
NS_IF_ADDREF(*aManager = GetGroupMessageManager(aGroup, rv));
return rv.StealNSResult();
}
ChromeMessageBroadcaster*
nsGlobalWindowInner::GetGroupMessageManager(const nsAString& aGroup,
ErrorResult& aError)
nsGlobalWindowInner::GetGroupMessageManager(const nsAString& aGroup)
{
MOZ_ASSERT(IsChromeWindow());
RefPtr<ChromeMessageBroadcaster> messageManager =
mChromeFields.mGroupMessageManagers.LookupForAdd(aGroup).OrInsert(
[this, &aError] () {
nsFrameMessageManager* parent = GetMessageManager(aError);
return new ChromeMessageBroadcaster(parent);
[this] () {
return new ChromeMessageBroadcaster(MessageManager());
});
return messageManager;
}

Просмотреть файл

@ -947,11 +947,8 @@ public:
void Restore();
void NotifyDefaultButtonLoaded(mozilla::dom::Element& aDefaultButton,
mozilla::ErrorResult& aError);
mozilla::dom::ChromeMessageBroadcaster*
GetMessageManager(mozilla::ErrorResult& aError);
mozilla::dom::ChromeMessageBroadcaster*
GetGroupMessageManager(const nsAString& aGroup,
mozilla::ErrorResult& aError);
mozilla::dom::ChromeMessageBroadcaster* MessageManager();
mozilla::dom::ChromeMessageBroadcaster* GetGroupMessageManager(const nsAString& aGroup);
void BeginWindowMove(mozilla::dom::Event& aMouseDownEvent,
mozilla::dom::Element* aPanel,
mozilla::ErrorResult& aError);

Просмотреть файл

@ -7534,18 +7534,24 @@ nsGlobalWindowOuter::SetBrowserDOMWindowOuter(nsIBrowserDOMWindow* aBrowserWindo
mChromeFields.mBrowserDOMWindow = aBrowserWindow;
}
NS_IMETHODIMP
nsGlobalWindowOuter::GetMessageManager(nsIMessageBroadcaster** aManager)
ChromeMessageBroadcaster*
nsGlobalWindowOuter::GetMessageManager()
{
FORWARD_TO_INNER(GetMessageManager, (aManager), NS_ERROR_UNEXPECTED);
if (!mInnerWindow) {
NS_WARNING("No inner window available!");
return nullptr;
}
return GetCurrentInnerWindowInternal()->MessageManager();
}
NS_IMETHODIMP
nsGlobalWindowOuter::GetGroupMessageManager(const nsAString& aGroup,
nsIMessageBroadcaster** aManager)
ChromeMessageBroadcaster*
nsGlobalWindowOuter::GetGroupMessageManager(const nsAString& aGroup)
{
MOZ_RELEASE_ASSERT(IsChromeWindow());
FORWARD_TO_INNER(GetGroupMessageManager, (aGroup, aManager), NS_ERROR_UNEXPECTED);
if (!mInnerWindow) {
NS_WARNING("No inner window available!");
return nullptr;
}
return GetCurrentInnerWindowInternal()->GetGroupMessageManager(aGroup);
}
void

Просмотреть файл

@ -265,6 +265,9 @@ public:
// nsIDOMChromeWindow (only implemented on chrome windows)
NS_DECL_NSIDOMCHROMEWINDOW
mozilla::dom::ChromeMessageBroadcaster* GetMessageManager();
mozilla::dom::ChromeMessageBroadcaster* GetGroupMessageManager(const nsAString& aGroup);
nsresult
OpenJS(const nsAString& aUrl, const nsAString& aName,
const nsAString& aOptions, nsPIDOMWindowOuter **_retval);

Просмотреть файл

@ -306,46 +306,6 @@ interface nsIMessageSender : nsIMessageListenerManager
readonly attribute AString remoteType;
};
/**
* Message "broadcasters" don't have a single "other side" that they
* send messages to, but rather a set of subordinate message managers.
* For example, broadcasting a message through a window message
* manager will broadcast the message to all frame message managers
* within its window.
*/
[uuid(4d7d62ad-4725-4f39-86cf-8fb22bf9c1d8)]
interface nsIMessageBroadcaster : nsIMessageListenerManager
{
/**
* Like |sendAsyncMessage()|, but also broadcasts this message to
* all "child" message managers of this message manager. See long
* comment above for details.
*
* WARNING: broadcasting messages can be very expensive and leak
* sensitive data. Use with extreme caution.
*/
[implicit_jscontext, optional_argc]
void broadcastAsyncMessage([optional] in AString messageName,
[optional] in jsval obj,
[optional] in jsval objects);
/**
* Number of subordinate message managers.
*/
readonly attribute unsigned long childCount;
/**
* Return a single subordinate message manager.
*/
nsIMessageListenerManager getChildAt(in unsigned long aIndex);
/**
* Some processes are kept alive after their last tab/window are closed for testing
* (see dom.ipc.keepProcessesAlive). This function releases those.
*/
void releaseCachedProcesses();
};
[uuid(694e367c-aa25-4446-8499-2c527c4bd838)]
interface nsIContentFrameMessageManager : nsIMessageSender
{

Просмотреть файл

@ -333,6 +333,12 @@ interface ContentProcessMessageManager
// WebIDL spec.
ContentProcessMessageManager implements MessageManagerGlobal;
/**
* Message "broadcasters" don't have a single "other side" that they send messages to, but
* rather a set of subordinate message managers. For example, broadcasting a message
* through a window message manager will broadcast the message to all frame message
* managers within its window.
*/
[ChromeOnly]
interface ChromeMessageBroadcaster : MessageListenerManager
{

Просмотреть файл

@ -8,7 +8,6 @@
interface nsIBrowserDOMWindow;
interface nsIDOMElement;
interface nsIDOMEvent;
interface nsIMessageBroadcaster;
interface mozIDOMWindowProxy;
// Scriptable only so Components.interfaces.nsIDOMChromeWindow works.
@ -22,14 +21,4 @@ interface nsIDOMChromeWindow : nsISupports
*/
[noscript]
readonly attribute nsIBrowserDOMWindow browserDOMWindow;
[noscript]
readonly attribute nsIMessageBroadcaster messageManager;
/**
* Returns the message manager identified by the given group name that
* manages all frame loaders belonging to that group.
*/
[noscript]
nsIMessageBroadcaster getGroupMessageManager(in AString group);
};

Просмотреть файл

@ -157,6 +157,7 @@
#include "nsThread.h"
#include "nsWindowWatcher.h"
#include "nsIXULRuntime.h"
#include "mozilla/dom/ChromeMessageBroadcaster.h"
#include "mozilla/dom/nsMixedContentBlocker.h"
#include "nsMemoryInfoDumper.h"
#include "nsMemoryReporterManager.h"
@ -2270,7 +2271,7 @@ ContentParent::InitInternal(ProcessPriority aInitialPriority)
if (ssm) {
ssm->CloneDomainPolicy(&xpcomInit.domainPolicy());
if (nsFrameMessageManager* mm = nsFrameMessageManager::sParentProcessManager) {
if (ChromeMessageBroadcaster* mm = nsFrameMessageManager::sParentProcessManager) {
AutoJSAPI jsapi;
if (NS_WARN_IF(!jsapi.Init(xpc::PrivilegedJunkScope()))) {
MOZ_CRASH();

Просмотреть файл

@ -430,14 +430,14 @@ partial interface Window {
[Throws, Func="nsGlobalWindowInner::IsPrivilegedChromeWindow"]
void notifyDefaultButtonLoaded(Element defaultButton);
[Throws, Func="nsGlobalWindowInner::IsPrivilegedChromeWindow"]
[Func="nsGlobalWindowInner::IsPrivilegedChromeWindow"]
readonly attribute ChromeMessageBroadcaster messageManager;
/**
* Returns the message manager identified by the given group name that
* manages all frame loaders belonging to that group.
*/
[Throws, Func="nsGlobalWindowInner::IsPrivilegedChromeWindow"]
[Func="nsGlobalWindowInner::IsPrivilegedChromeWindow"]
ChromeMessageBroadcaster getGroupMessageManager(DOMString aGroup);
/**

Просмотреть файл

@ -16,6 +16,7 @@
#include "nsDataDocumentContentPolicy.h"
#include "nsNoDataProtocolContentPolicy.h"
#include "nsDOMCID.h"
#include "nsFrameMessageManager.h"
#include "nsHTMLContentSerializer.h"
#include "nsHTMLParts.h"
#include "nsIComponentManager.h"
@ -318,8 +319,8 @@ nsresult NS_NewTextEncoder(nsIDocumentEncoder** aResult);
nsresult NS_NewContentPolicy(nsIContentPolicy** aResult);
nsresult NS_NewEventListenerService(nsIEventListenerService** aResult);
nsresult NS_NewGlobalMessageManager(nsIMessageBroadcaster** aResult);
nsresult NS_NewParentProcessMessageManager(nsIMessageBroadcaster** aResult);
nsresult NS_NewGlobalMessageManager(nsISupports** aResult);
nsresult NS_NewParentProcessMessageManager(nsISupports** aResult);
nsresult NS_NewChildProcessMessageManager(nsIMessageSender** aResult);
nsresult NS_NewXULControllers(nsISupports* aOuter, REFNSIID aIID, void** aResult);
@ -396,8 +397,8 @@ MAKE_CTOR(CreateXULDocument, nsIDocument, NS_NewXUL
#endif
MAKE_CTOR(CreateContentDLF, nsIDocumentLoaderFactory, NS_NewContentDocumentLoaderFactory)
MAKE_CTOR(CreateEventListenerService, nsIEventListenerService, NS_NewEventListenerService)
MAKE_CTOR(CreateGlobalMessageManager, nsIMessageBroadcaster, NS_NewGlobalMessageManager)
MAKE_CTOR(CreateParentMessageManager, nsIMessageBroadcaster, NS_NewParentProcessMessageManager)
MAKE_CTOR(CreateGlobalMessageManager, nsISupports, NS_NewGlobalMessageManager)
MAKE_CTOR(CreateParentMessageManager, nsISupports, NS_NewParentProcessMessageManager)
MAKE_CTOR(CreateChildMessageManager, nsIMessageSender, NS_NewChildProcessMessageManager)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsDataDocumentContentPolicy)
NS_GENERIC_FACTORY_CONSTRUCTOR(nsNoDataProtocolContentPolicy)