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
|
Browsing Context Embedding
==========================
Embedder Element to nsDocShell
------------------------------
In order to render the contents of a ``BrowsingContext``, the embedding
element needs to be able to communicate with the ``nsDocShell`` which is
currently being used to host it's content. This is done in 3 different ways
depending on which combination of processes is in-use.
- *in-process*: The ``nsFrameLoader`` directly embeds the ``nsDocShell``.
- *remote tab*: The parent process is the embedder, and uses a ``PBrowser``,
via a ``BrowserHost``. The ``BrowserChild`` actor holds the actual
``nsDocShell`` alive.
- *remote subframe*: A content process is the embedder, and uses a
``PBrowserBridge``, via a ``BrowserBridgeHost`` to communicate with the
parent process. The parent process then uses a ``BrowserParent``, as in the
*remote tab* case, to communicate with the ``nsDocShell``.
Diagram
^^^^^^^
.. digraph:: embedding
node [shape=rectangle]
subgraph cluster_choice {
color=transparent;
node [shape=none];
"In-Process";
"Remote Tab";
"Remote Subframe";
}
"nsFrameLoaderOwner" [label="nsFrameLoaderOwner\ne.g. <iframe>, <xul:browser>, <embed>"]
"nsFrameLoaderOwner" -> "nsFrameLoader";
"nsFrameLoader" -> "In-Process" [dir=none];
"nsFrameLoader" -> "Remote Tab" [dir=none];
"nsFrameLoader" -> "Remote Subframe" [dir=none];
"In-Process" -> "nsDocShell";
"Remote Tab" -> "BrowserHost";
"Remote Subframe" -> "BrowserBridgeHost";
"BrowserHost" -> "BrowserParent";
"BrowserParent" -> "BrowserChild" [label="PBrowser" style=dotted];
"BrowserChild" -> "nsDocShell";
"BrowserBridgeHost" -> "BrowserBridgeChild";
"BrowserBridgeChild" -> "BrowserBridgeParent" [label="PBrowserBridge", style=dotted];
"BrowserBridgeParent" -> "BrowserParent";
nsDocShell to Document
----------------------
Embedding an individual document within a ``nsDocShell`` is done within the
content process, which has that docshell.
Diagram
^^^^^^^
This diagram shows the objects involved in a content process which is being
used to host a given ``BrowsingContext``, along with rough relationships
between them. Dotted lines represent a "current" relationship, whereas solid
lines are a stronger lifetime relationship.
.. graph:: document
node [shape=rectangle]
"BrowsingContext" -- "nsDocShell" [style=dotted];
"nsDocShell" -- "nsGlobalWindowOuter";
"nsGlobalWindowOuter" -- "nsGlobalWindowInner" [style=dotted];
"nsGlobalWindowInner" -- "Document" [style=dotted];
"nsDocShell" -- "nsDocumentViewer" [style=dotted];
"nsDocumentViewer" -- "Document";
"nsDocumentViewer" -- "PresShell";
"nsGlobalWindowInner" -- "WindowGlobalChild";
"BrowsingContext" -- "WindowContext" [style=dotted];
"WindowContext" -- "nsGlobalWindowInner";
subgraph cluster_synced {
label = "Synced Contexts";
"BrowsingContext" "WindowContext";
}
|