зеркало из https://github.com/mozilla/gecko-dev.git
93 строки
2.9 KiB
ReStructuredText
93 строки
2.9 KiB
ReStructuredText
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";
|
|
}
|