@@ -94,6 +94,11 @@ var REMOTE_CONTENT_SCRIPTS = Services.prefs.getBoolPref(
94
94
false
95
95
) ;
96
96
97
+ const REMOTE_CONTENT_SUBFRAMES = Services . prefs . getBoolPref (
98
+ "fission.autostart" ,
99
+ false
100
+ ) ;
101
+
97
102
let BASE_MANIFEST = Object . freeze ( {
98
103
applications : Object . freeze ( {
99
104
gecko : Object . freeze ( {
@@ -181,11 +186,13 @@ function promiseBrowserLoaded(browser, url, redirectUrl) {
181
186
class ContentPage {
182
187
constructor (
183
188
remote = REMOTE_CONTENT_SCRIPTS ,
189
+ remoteSubframes = REMOTE_CONTENT_SUBFRAMES ,
184
190
extension = null ,
185
191
privateBrowsing = false ,
186
192
userContextId = undefined
187
193
) {
188
194
this . remote = remote ;
195
+ this . remoteSubframes = remote && remoteSubframes ;
189
196
this . extension = extension ;
190
197
this . privateBrowsing = privateBrowsing ;
191
198
this . userContextId = userContextId ;
@@ -194,14 +201,20 @@ class ContentPage {
194
201
}
195
202
196
203
async _initBrowser ( ) {
197
- this . windowlessBrowser = Services . appShell . createWindowlessBrowser ( true ) ;
198
-
204
+ let chromeFlags = 0 ;
205
+ if ( this . remote ) {
206
+ chromeFlags |= Ci . nsIWebBrowserChrome . CHROME_REMOTE_WINDOW ;
207
+ }
208
+ if ( this . remoteSubframes ) {
209
+ chromeFlags |= Ci . nsIWebBrowserChrome . CHROME_FISSION_WINDOW ;
210
+ }
199
211
if ( this . privateBrowsing ) {
200
- let loadContext = this . windowlessBrowser . docShell . QueryInterface (
201
- Ci . nsILoadContext
202
- ) ;
203
- loadContext . usePrivateBrowsing = true ;
212
+ chromeFlags |= Ci . nsIWebBrowserChrome . CHROME_PRIVATE_WINDOW ;
204
213
}
214
+ this . windowlessBrowser = Services . appShell . createWindowlessBrowser (
215
+ true ,
216
+ chromeFlags
217
+ ) ;
205
218
206
219
let system = Services . scriptSecurityManager . getSystemPrincipal ( ) ;
207
220
@@ -229,6 +242,7 @@ class ContentPage {
229
242
let browser = chromeDoc . createXULElement ( "browser" ) ;
230
243
browser . setAttribute ( "type" , "content" ) ;
231
244
browser . setAttribute ( "disableglobalhistory" , "true" ) ;
245
+ browser . setAttribute ( "messagemanagergroup" , "webext-browsers" ) ;
232
246
if ( this . userContextId ) {
233
247
browser . setAttribute ( "usercontextid" , this . userContextId ) ;
234
248
}
@@ -244,6 +258,12 @@ class ContentPage {
244
258
if ( this . remote ) {
245
259
awaitFrameLoader = promiseEvent ( browser , "XULFrameLoaderCreated" ) ;
246
260
browser . setAttribute ( "remote" , "true" ) ;
261
+
262
+ browser . setAttribute ( "maychangeremoteness" , "true" ) ;
263
+ browser . addEventListener (
264
+ "DidChangeBrowserRemoteness" ,
265
+ this . didChangeBrowserRemoteness . bind ( this )
266
+ ) ;
247
267
}
248
268
249
269
chromeDoc . documentElement . appendChild ( browser ) ;
@@ -275,6 +295,12 @@ class ContentPage {
275
295
this . browser . messageManager . loadFrameScript ( frameScript , false , true ) ;
276
296
}
277
297
298
+ didChangeBrowserRemoteness ( event ) {
299
+ // XXX: Tests can load their own additional frame scripts, so we may need to
300
+ // track all scripts that have been loaded, and reload them here?
301
+ this . loadFrameScript ( frameScript ) ;
302
+ }
303
+
278
304
async loadURL ( url , redirectUrl = undefined ) {
279
305
await this . browserReady ;
280
306
@@ -297,6 +323,10 @@ class ContentPage {
297
323
298
324
let { messageManager } = this . browser ;
299
325
326
+ this . browser . removeEventListener (
327
+ "DidChangeBrowserRemoteness" ,
328
+ this . didChangeBrowserRemoteness . bind ( this )
329
+ ) ;
300
330
this . browser = null ;
301
331
302
332
this . windowlessBrowser . close ( ) ;
@@ -1024,6 +1054,9 @@ var ExtensionTestUtils = {
1024
1054
* @param {boolean } [options.remote]
1025
1055
* If true, load the URL in a content process. If false, load
1026
1056
* it in the parent process.
1057
+ * @param {boolean } [options.remoteSubframes]
1058
+ * If true, load cross-origin frames in separate content processes.
1059
+ * This is ignored if |options.remote| is false.
1027
1060
* @param {string } [options.redirectUrl]
1028
1061
* An optional URL that the initial page is expected to
1029
1062
* redirect to.
@@ -1035,6 +1068,7 @@ var ExtensionTestUtils = {
1035
1068
{
1036
1069
extension = undefined ,
1037
1070
remote = undefined ,
1071
+ remoteSubframes = undefined ,
1038
1072
redirectUrl = undefined ,
1039
1073
privateBrowsing = false ,
1040
1074
userContextId = undefined ,
@@ -1044,6 +1078,7 @@ var ExtensionTestUtils = {
1044
1078
1045
1079
let contentPage = new ContentPage (
1046
1080
remote ,
1081
+ remoteSubframes ,
1047
1082
extension && extension . extension ,
1048
1083
privateBrowsing ,
1049
1084
userContextId
0 commit comments