|
@@ -1,13 +1,14 @@
|
|
|
import * as chai from 'chai'
|
|
|
import * as chaiAsPromised from 'chai-as-promised'
|
|
|
import { BrowserWindow, WebContents, session, ipcMain } from 'electron'
|
|
|
-import { emittedOnce } from './events-helpers';
|
|
|
-import { closeAllWindows } from './window-helpers';
|
|
|
-import * as https from 'https';
|
|
|
-import * as http from 'http';
|
|
|
-import * as path from 'path';
|
|
|
-import * as fs from 'fs';
|
|
|
-import { EventEmitter } from 'events';
|
|
|
+import { emittedOnce } from './events-helpers'
|
|
|
+import { closeAllWindows } from './window-helpers'
|
|
|
+import * as https from 'https'
|
|
|
+import * as http from 'http'
|
|
|
+import * as path from 'path'
|
|
|
+import * as fs from 'fs'
|
|
|
+import { EventEmitter } from 'events'
|
|
|
+import { promisify } from 'util'
|
|
|
|
|
|
const { expect } = chai
|
|
|
|
|
@@ -242,3 +243,81 @@ describe('web security', () => {
|
|
|
await p
|
|
|
})
|
|
|
})
|
|
|
+
|
|
|
+describe('iframe using HTML fullscreen API while window is OS-fullscreened', () => {
|
|
|
+ const fullscreenChildHtml = promisify(fs.readFile)(
|
|
|
+ path.join(fixturesPath, 'pages', 'fullscreen-oopif.html')
|
|
|
+ )
|
|
|
+ let w: BrowserWindow, server: http.Server
|
|
|
+
|
|
|
+ before(() => {
|
|
|
+ server = http.createServer(async (_req, res) => {
|
|
|
+ res.writeHead(200, { 'Content-Type': 'text/html' })
|
|
|
+ res.write(await fullscreenChildHtml)
|
|
|
+ res.end()
|
|
|
+ })
|
|
|
+
|
|
|
+ server.listen(8989, '127.0.0.1')
|
|
|
+ })
|
|
|
+
|
|
|
+ beforeEach(() => {
|
|
|
+ w = new BrowserWindow({
|
|
|
+ show: true,
|
|
|
+ fullscreen: true,
|
|
|
+ webPreferences: {
|
|
|
+ nodeIntegration: true,
|
|
|
+ nodeIntegrationInSubFrames: true
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ afterEach(async () => {
|
|
|
+ await closeAllWindows()
|
|
|
+ ;(w as any) = null
|
|
|
+ server.close()
|
|
|
+ })
|
|
|
+
|
|
|
+ it('can fullscreen from out-of-process iframes (OOPIFs)', done => {
|
|
|
+ ipcMain.once('fullscreenChange', async () => {
|
|
|
+ const fullscreenWidth = await w.webContents.executeJavaScript(
|
|
|
+ "document.querySelector('iframe').offsetWidth"
|
|
|
+ )
|
|
|
+ expect(fullscreenWidth > 0).to.be.true
|
|
|
+
|
|
|
+ await w.webContents.executeJavaScript(
|
|
|
+ "document.querySelector('iframe').contentWindow.postMessage('exitFullscreen', '*')"
|
|
|
+ )
|
|
|
+
|
|
|
+ await new Promise(resolve => setTimeout(resolve, 500))
|
|
|
+
|
|
|
+ const width = await w.webContents.executeJavaScript(
|
|
|
+ "document.querySelector('iframe').offsetWidth"
|
|
|
+ )
|
|
|
+ expect(width).to.equal(0)
|
|
|
+
|
|
|
+ done()
|
|
|
+ })
|
|
|
+
|
|
|
+ const html =
|
|
|
+ '<iframe style="width: 0" frameborder=0 src="http://localhost:8989" allowfullscreen></iframe>'
|
|
|
+ w.loadURL(`data:text/html,${html}`)
|
|
|
+ })
|
|
|
+
|
|
|
+ it('can fullscreen from in-process iframes', done => {
|
|
|
+ ipcMain.once('fullscreenChange', async () => {
|
|
|
+ const fullscreenWidth = await w.webContents.executeJavaScript(
|
|
|
+ "document.querySelector('iframe').offsetWidth"
|
|
|
+ )
|
|
|
+ expect(fullscreenWidth > 0).to.true
|
|
|
+
|
|
|
+ await w.webContents.executeJavaScript('document.exitFullscreen()')
|
|
|
+ const width = await w.webContents.executeJavaScript(
|
|
|
+ "document.querySelector('iframe').offsetWidth"
|
|
|
+ )
|
|
|
+ expect(width).to.equal(0)
|
|
|
+ done()
|
|
|
+ })
|
|
|
+
|
|
|
+ w.loadFile(path.join(fixturesPath, 'pages', 'fullscreen-ipif.html'))
|
|
|
+ })
|
|
|
+})
|