test: Node integration in web workers
This commit is contained in:
parent
ab83aa0bfd
commit
033aa16e04
8 changed files with 77 additions and 1 deletions
|
@ -441,6 +441,7 @@ void AtomRendererClient::AddSupportedKeySystems(
|
||||||
|
|
||||||
void AtomRendererClient::DidInitializeWorkerContextOnWorkerThread(
|
void AtomRendererClient::DidInitializeWorkerContextOnWorkerThread(
|
||||||
v8::Local<v8::Context> context) {
|
v8::Local<v8::Context> context) {
|
||||||
|
LOG(ERROR) << "DidInitializeWorkerContextOnWorkerThread";
|
||||||
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
||||||
switches::kNodeIntegrationInWorker)) {
|
switches::kNodeIntegrationInWorker)) {
|
||||||
WebWorkerObserver::GetCurrent()->ContextCreated(context);
|
WebWorkerObserver::GetCurrent()->ContextCreated(context);
|
||||||
|
|
|
@ -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
|
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
|
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.
|
lead to crashes and memory corruptions.
|
||||||
|
|
||||||
Even when using a thread-safe native Node.js module, it should be noticed that
|
Even when using a thread-safe native Node.js module, it should be noticed that
|
||||||
|
|
|
@ -590,6 +590,27 @@ describe('chromium feature', function () {
|
||||||
worker.postMessage(message)
|
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) {
|
it('SharedWorker can work', function (done) {
|
||||||
var worker = new SharedWorker('../fixtures/workers/shared_worker.js')
|
var worker = new SharedWorker('../fixtures/workers/shared_worker.js')
|
||||||
var message = 'ping'
|
var message = 'ping'
|
||||||
|
@ -599,6 +620,29 @@ describe('chromium feature', function () {
|
||||||
}
|
}
|
||||||
worker.port.postMessage(message)
|
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 () {
|
describe('iframe', function () {
|
||||||
|
|
1
spec/fixtures/api/unload
vendored
Normal file
1
spec/fixtures/api/unload
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
unload
|
12
spec/fixtures/pages/shared_worker.html
vendored
Normal file
12
spec/fixtures/pages/shared_worker.html
vendored
Normal 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
12
spec/fixtures/pages/worker.html
vendored
Normal 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>
|
5
spec/fixtures/workers/shared_worker_node.js
vendored
Normal file
5
spec/fixtures/workers/shared_worker_node.js
vendored
Normal 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
1
spec/fixtures/workers/worker_node.js
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
self.postMessage([typeof process, typeof setImmediate, typeof global, typeof Buffer].join(' '))
|
Loading…
Add table
Reference in a new issue