test: Node integration in web workers

This commit is contained in:
Cheng Zhao 2017-03-15 20:07:28 +09:00
parent ab83aa0bfd
commit 033aa16e04
8 changed files with 77 additions and 1 deletions

View file

@ -441,6 +441,7 @@ void AtomRendererClient::AddSupportedKeySystems(
void AtomRendererClient::DidInitializeWorkerContextOnWorkerThread(
v8::Local<v8::Context> context) {
LOG(ERROR) << "DidInitializeWorkerContextOnWorkerThread";
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kNodeIntegrationInWorker)) {
WebWorkerObserver::GetCurrent()->ContextCreated(context);

View file

@ -30,7 +30,7 @@ modules can be used in multi-threaded environment.
Any native Node.js module can be loaded directly in Web Workers, but it is
strongly recommended not to do so. Most existing native modules have been
written assuming single-thread environment, using them in a Web Workers will
written assuming single-thread environment, using them in Web Workers will
lead to crashes and memory corruptions.
Even when using a thread-safe native Node.js module, it should be noticed that

View file

@ -590,6 +590,27 @@ describe('chromium feature', function () {
worker.postMessage(message)
})
it('Worker has no node integration by default', function (done) {
let worker = new Worker('../fixtures/workers/worker_node.js')
worker.onmessage = function (event) {
assert.equal(event.data, 'undefined undefined undefined undefined')
worker.terminate()
done()
}
})
it('Worker has node integration with nodeIntegrationInWorker', function (done) {
let webview = new WebView
webview.addEventListener('ipc-message', function (e) {
assert.equal(e.channel, 'object function object function')
webview.remove()
done()
})
webview.src = 'file://' + fixtures + '/pages/worker.html'
webview.setAttribute('webpreferences', 'nodeIntegration, nodeIntegrationInWorker')
document.body.appendChild(webview)
})
it('SharedWorker can work', function (done) {
var worker = new SharedWorker('../fixtures/workers/shared_worker.js')
var message = 'ping'
@ -599,6 +620,29 @@ describe('chromium feature', function () {
}
worker.port.postMessage(message)
})
it('SharedWorker has no node integration by default', function (done) {
let worker = new SharedWorker('../fixtures/workers/shared_worker_node.js')
worker.port.onmessage = function (event) {
assert.equal(event.data, 'undefined undefined undefined undefined')
done()
}
})
it('SharedWorker has node integration with nodeIntegrationInWorker', function (done) {
let webview = new WebView
webview.addEventListener('console-message', function (e) {
console.log(e)
})
webview.addEventListener('ipc-message', function (e) {
assert.equal(e.channel, 'object function object function')
webview.remove()
done()
})
webview.src = 'file://' + fixtures + '/pages/shared_worker.html'
webview.setAttribute('webpreferences', 'nodeIntegration, nodeIntegrationInWorker')
document.body.appendChild(webview)
})
})
describe('iframe', function () {

1
spec/fixtures/api/unload vendored Normal file
View file

@ -0,0 +1 @@
unload

12
spec/fixtures/pages/shared_worker.html vendored Normal file
View file

@ -0,0 +1,12 @@
<html>
<body>
<script type="text/javascript" charset="utf-8">
const {ipcRenderer} = require('electron')
// Pass a random parameter to create independent worker.
let worker = new SharedWorker(`../workers/shared_worker_node.js?a={Math.random()}`)
worker.port.onmessage = function (event) {
ipcRenderer.sendToHost(event.data)
}
</script>
</body>
</html>

12
spec/fixtures/pages/worker.html vendored Normal file
View file

@ -0,0 +1,12 @@
<html>
<body>
<script type="text/javascript" charset="utf-8">
const {ipcRenderer} = require('electron')
let worker = new Worker(`../workers/worker_node.js`)
worker.onmessage = function (event) {
ipcRenderer.sendToHost(event.data)
worker.terminate()
}
</script>
</body>
</html>

View file

@ -0,0 +1,5 @@
self.onconnect = function (event) {
let port = event.ports[0]
port.start()
port.postMessage([typeof process, typeof setImmediate, typeof global, typeof Buffer].join(' '))
}

1
spec/fixtures/workers/worker_node.js vendored Normal file
View file

@ -0,0 +1 @@
self.postMessage([typeof process, typeof setImmediate, typeof global, typeof Buffer].join(' '))