summaryrefslogtreecommitdiff
path: root/dom/ipc/ContentProcessManager.h
blob: cc6d8bd8b89e031197f8fed9abb6c1596fcaa48d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
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