Skip to content

Commit

Permalink
fix: focus event not emitted when <webview> is sandboxed
Browse files Browse the repository at this point in the history
  • Loading branch information
miniak committed Jan 20, 2019
1 parent dacf7f8 commit 4038053
Show file tree
Hide file tree
Showing 5 changed files with 68 additions and 44 deletions.
1 change: 1 addition & 0 deletions filenames.gni
Expand Up @@ -74,6 +74,7 @@ filenames = {
"lib/renderer/web-view/web-view-constants.js",
"lib/renderer/web-view/web-view-element.js",
"lib/renderer/web-view/web-view-impl.js",
"lib/renderer/web-view/web-view-init.js",
"lib/renderer/api/exports/electron.js",
"lib/renderer/api/crash-reporter.js",
"lib/renderer/api/ipc-renderer.js",
Expand Down
12 changes: 3 additions & 9 deletions lib/renderer/init.js
Expand Up @@ -164,14 +164,8 @@ for (const preloadScript of preloadScripts) {
// Warn about security issues
require('@electron/internal/renderer/security-warnings')(nodeIntegration)

// Report focus/blur events of webview to browser.
// Note that while Chromium content APIs have observer for focus/blur, they
// unfortunately do not work for webview.
if (guestInstanceId) {
window.addEventListener('focus', () => {
ipcRenderer.send('ELECTRON_GUEST_VIEW_MANAGER_FOCUS_CHANGE', true, guestInstanceId)
})
window.addEventListener('blur', () => {
ipcRenderer.send('ELECTRON_GUEST_VIEW_MANAGER_FOCUS_CHANGE', false, guestInstanceId)
})
// Report focus/blur events of webview to browser.
const { handleFocusBlur } = require('@electron/internal/renderer/web-view/web-view-init')
handleFocusBlur(guestInstanceId)
}
16 changes: 16 additions & 0 deletions lib/renderer/web-view/web-view-init.js
@@ -0,0 +1,16 @@
'use strict'

exports.handleFocusBlur = function (guestInstanceId) {
const ipcRenderer = require('@electron/internal/renderer/ipc-renderer-internal')

// Note that while Chromium content APIs have observer for focus/blur, they
// unfortunately do not work for webview.

window.addEventListener('focus', () => {
ipcRenderer.send('ELECTRON_GUEST_VIEW_MANAGER_FOCUS_CHANGE', true, guestInstanceId)
})

window.addEventListener('blur', () => {
ipcRenderer.send('ELECTRON_GUEST_VIEW_MANAGER_FOCUS_CHANGE', false, guestInstanceId)
})
}
12 changes: 8 additions & 4 deletions lib/sandboxed_renderer/init.js
Expand Up @@ -121,12 +121,10 @@ switch (window.location.protocol) {
}
}

if (binding.guestInstanceId) {
process.guestInstanceId = parseInt(binding.guestInstanceId)
}
const guestInstanceId = binding.guestInstanceId && parseInt(binding.guestInstanceId)

// Don't allow recursive `<webview>`.
if (!process.guestInstanceId && isWebViewTagEnabled) {
if (!guestInstanceId && isWebViewTagEnabled) {
const webViewImpl = require('@electron/internal/renderer/web-view/web-view-impl')
const { setupWebView } = require('@electron/internal/renderer/web-view/web-view-element')
setupWebView(v8Util, webViewImpl)
Expand Down Expand Up @@ -180,3 +178,9 @@ try {

// Warn about security issues
require('@electron/internal/renderer/security-warnings')()

if (guestInstanceId) {
// Report focus/blur events of webview to browser.
const { handleFocusBlur } = require('@electron/internal/renderer/web-view/web-view-init')
handleFocusBlur(guestInstanceId)
}
71 changes: 40 additions & 31 deletions spec/webview-spec.js
Expand Up @@ -1349,47 +1349,56 @@ describe('<webview> tag', function () {
if (div != null) div.remove()
})

it('emits resize events', async () => {
const firstResizeSignal = waitForEvent(webview, 'resize')
const domReadySignal = waitForEvent(webview, 'dom-ready')
const generateSpecs = (description, sandbox) => {
describe(description, () => {
it('emits resize events', async () => {
const firstResizeSignal = waitForEvent(webview, 'resize')
const domReadySignal = waitForEvent(webview, 'dom-ready')

webview.src = `file://${fixtures}/pages/a.html`
div.appendChild(webview)
document.body.appendChild(div)
webview.src = `file://${fixtures}/pages/a.html`
webview.webpreferences = `sandbox=${sandbox ? 'yes' : 'no'}`
div.appendChild(webview)
document.body.appendChild(div)

const firstResizeEvent = await firstResizeSignal
expect(firstResizeEvent.target).to.equal(webview)
expect(firstResizeEvent.newWidth).to.equal(100)
expect(firstResizeEvent.newHeight).to.equal(10)
const firstResizeEvent = await firstResizeSignal
expect(firstResizeEvent.target).to.equal(webview)
expect(firstResizeEvent.newWidth).to.equal(100)
expect(firstResizeEvent.newHeight).to.equal(10)

await domReadySignal
await domReadySignal

const secondResizeSignal = waitForEvent(webview, 'resize')
const secondResizeSignal = waitForEvent(webview, 'resize')

const newWidth = 1234
const newHeight = 789
div.style.width = `${newWidth}px`
div.style.height = `${newHeight}px`
const newWidth = 1234
const newHeight = 789
div.style.width = `${newWidth}px`
div.style.height = `${newHeight}px`

const secondResizeEvent = await secondResizeSignal
expect(secondResizeEvent.target).to.equal(webview)
expect(secondResizeEvent.newWidth).to.equal(newWidth)
expect(secondResizeEvent.newHeight).to.equal(newHeight)
})
const secondResizeEvent = await secondResizeSignal
expect(secondResizeEvent.target).to.equal(webview)
expect(secondResizeEvent.newWidth).to.equal(newWidth)
expect(secondResizeEvent.newHeight).to.equal(newHeight)
})

it('emits focus event', async () => {
const domReadySignal = waitForEvent(webview, 'dom-ready')
webview.src = `file://${fixtures}/pages/a.html`
document.body.appendChild(webview)
it('emits focus event', async () => {
const domReadySignal = waitForEvent(webview, 'dom-ready')
webview.src = `file://${fixtures}/pages/a.html`
webview.webpreferences = `sandbox=${sandbox ? 'yes' : 'no'}`
document.body.appendChild(webview)

await domReadySignal
await domReadySignal

// If this test fails, check if webview.focus() still works.
const focusSignal = waitForEvent(webview, 'focus')
webview.focus()
// If this test fails, check if webview.focus() still works.
const focusSignal = waitForEvent(webview, 'focus')
webview.focus()

await focusSignal
})
await focusSignal
})
})
}

generateSpecs('without sandbox', false)
generateSpecs('with sandbox', true)
})

describe('zoom behavior', () => {
Expand Down

0 comments on commit 4038053

Please sign in to comment.