diff options
Diffstat (limited to 'dom/ipc/ContentProcessManager.h')
-rw-r--r-- | dom/ipc/ContentProcessManager.h | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/dom/ipc/ContentProcessManager.h b/dom/ipc/ContentProcessManager.h new file mode 100644 index 000000000..cc6d8bd8b --- /dev/null +++ b/dom/ipc/ContentProcessManager.h @@ -0,0 +1,166 @@ +/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=8 sts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef mozilla_dom_ContentProcessManager_h +#define mozilla_dom_ContentProcessManager_h + +#include <map> +#include <set> +#include "mozilla/StaticPtr.h" +#include "mozilla/dom/TabContext.h" +#include "mozilla/dom/ipc/IdType.h" +#include "nsTArray.h" + +namespace mozilla { +namespace dom { +class ContentParent; + +struct RemoteFrameInfo +{ + TabId mOpenerTabId; + TabContext mContext; +}; + +struct ContentProcessInfo +{ + ContentParent* mCp; + ContentParentId mParentCpId; + std::set<ContentParentId> mChildrenCpId; + std::map<TabId, RemoteFrameInfo> mRemoteFrames; +}; + +class ContentProcessManager final +{ +public: + static ContentProcessManager* GetSingleton(); + ~ContentProcessManager() {MOZ_COUNT_DTOR(ContentProcessManager);}; + + /** + * Add a new content process into the map. + * If aParentCpId is not 0, it's a nested content process. + */ + void AddContentProcess(ContentParent* aChildCp, + const ContentParentId& aParentCpId = ContentParentId(0)); + /** + * Remove the content process by id. + */ + void RemoveContentProcess(const ContentParentId& aChildCpId); + /** + * Add a grandchild content process into the map. + * aParentCpId must be already added in the map by AddContentProcess(). + */ + bool AddGrandchildProcess(const ContentParentId& aParentCpId, + const ContentParentId& aChildCpId); + /** + * Get the parent process's id by child process's id. + * Used to check if a child really belongs to the parent. + */ + bool GetParentProcessId(const ContentParentId& aChildCpId, + /*out*/ ContentParentId* aParentCpId); + /** + * Return the ContentParent pointer by id. + */ + ContentParent* GetContentProcessById(const ContentParentId& aChildCpId); + + /** + * Return a list of all child process's id. + */ + nsTArray<ContentParentId> + GetAllChildProcessById(const ContentParentId& aParentCpId); + + /** + * Allocate a tab id for the given content process's id. + * Used when a content process wants to create a new tab. aOpenerTabId and + * aContext are saved in RemoteFrameInfo, which is a part of + * ContentProcessInfo. We can use the tab id and process id to locate the + * TabContext for future use. + */ + TabId AllocateTabId(const TabId& aOpenerTabId, + const IPCTabContext& aContext, + const ContentParentId& aChildCpId); + + /** + * Remove the RemoteFrameInfo by the given process and tab id. + */ + void DeallocateTabId(const ContentParentId& aChildCpId, + const TabId& aChildTabId); + + /** + * Get the TabContext by the given content process and tab id. + */ + bool + GetTabContextByProcessAndTabId(const ContentParentId& aChildCpId, + const TabId& aChildTabId, + /*out*/ TabContext* aTabContext); + + /** + * Get all TabContext which are inside the given content process. + * Used for AppProcessChecker to cehck app status. + */ + nsTArray<TabContext> + GetTabContextByContentProcess(const ContentParentId& aChildCpId); + + /** + * Query a tab's opener id by the given process and tab id. + * XXX Currently not used. Plan to be used for bug 1020179. + */ + bool GetRemoteFrameOpenerTabId(const ContentParentId& aChildCpId, + const TabId& aChildTabId, + /*out*/ TabId* aOpenerTabId); + + /** + * Get all TabParents' Ids managed by the givent content process. + * Return empty array when TabParent couldn't be found via aChildCpId + */ + nsTArray<TabId> + GetTabParentsByProcessId(const ContentParentId& aChildCpId); + + /** + * Get the TabParent by the given content process and tab id. + * Return nullptr when TabParent couldn't be found via aChildCpId + * and aChildTabId. + * (or probably because the TabParent is not in the chrome process) + */ + already_AddRefed<TabParent> + GetTabParentByProcessAndTabId(const ContentParentId& aChildCpId, + const TabId& aChildTabId); + + /** + * Get the TabParent on top level by the given content process and tab id. + * + * This function return the TabParent belong to the chrome process, + * called top-level TabParent here, by given aChildCpId and aChildTabId. + * The given aChildCpId and aChildTabId are related to a content process + * and a tab respectively. In nested-oop, the top-level TabParent isn't + * always the opener tab of the given tab in content process. This function + * will call GetTabParentByProcessAndTabId iteratively until the Tab returned + * is belong to the chrome process. + */ + already_AddRefed<TabParent> + GetTopLevelTabParentByProcessAndTabId(const ContentParentId& aChildCpId, + const TabId& aChildTabId); + + /** + * Return appId by given TabId and ContentParentId. + * It will return nsIScriptSecurityManager::NO_APP_ID + * if the given tab is not an app. + */ + uint32_t + GetAppIdByProcessAndTabId(const ContentParentId& aChildCpId, + const TabId& aChildTabId); + +private: + static StaticAutoPtr<ContentProcessManager> sSingleton; + TabId mUniqueId; + std::map<ContentParentId, ContentProcessInfo> mContentParentMap; + + ContentProcessManager() {MOZ_COUNT_CTOR(ContentProcessManager);}; +}; + +} // namespace dom +} // namespace mozilla + +#endif // mozilla_dom_ContentProcessManager_h |