diff --git a/atom/renderer/atom_renderer_client.cc b/atom/renderer/atom_renderer_client.cc index 2a5c0218aab1..1f96b1754b4c 100644 --- a/atom/renderer/atom_renderer_client.cc +++ b/atom/renderer/atom_renderer_client.cc @@ -441,6 +441,7 @@ void AtomRendererClient::AddSupportedKeySystems( void AtomRendererClient::DidInitializeWorkerContextOnWorkerThread( v8::Local context) { + LOG(ERROR) << "DidInitializeWorkerContextOnWorkerThread"; if (base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kNodeIntegrationInWorker)) { WebWorkerObserver::GetCurrent()->ContextCreated(context); diff --git a/docs/tutorial/multithreading.md b/docs/tutorial/multithreading.md index 38a45d5301d4..41b0235720f5 100644 --- a/docs/tutorial/multithreading.md +++ b/docs/tutorial/multithreading.md @@ -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 diff --git a/spec/chromium-spec.js b/spec/chromium-spec.js index dd06f4455e14..e0707ec536a1 100644 --- a/spec/chromium-spec.js +++ b/spec/chromium-spec.js @@ -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 () { diff --git a/spec/fixtures/api/unload b/spec/fixtures/api/unload new file mode 100644 index 000000000000..98974dbb9fa2 --- /dev/null +++ b/spec/fixtures/api/unload @@ -0,0 +1 @@ +unload \ No newline at end of file diff --git a/spec/fixtures/pages/shared_worker.html b/spec/fixtures/pages/shared_worker.html new file mode 100644 index 000000000000..7a0d0757ab26 --- /dev/null +++ b/spec/fixtures/pages/shared_worker.html @@ -0,0 +1,12 @@ + + + + + diff --git a/spec/fixtures/pages/worker.html b/spec/fixtures/pages/worker.html new file mode 100644 index 000000000000..c84ef52065e0 --- /dev/null +++ b/spec/fixtures/pages/worker.html @@ -0,0 +1,12 @@ + + + + + diff --git a/spec/fixtures/workers/shared_worker_node.js b/spec/fixtures/workers/shared_worker_node.js new file mode 100644 index 000000000000..0a52d60fbf50 --- /dev/null +++ b/spec/fixtures/workers/shared_worker_node.js @@ -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(' ')) +} diff --git a/spec/fixtures/workers/worker_node.js b/spec/fixtures/workers/worker_node.js new file mode 100644 index 000000000000..5d59d2d0c340 --- /dev/null +++ b/spec/fixtures/workers/worker_node.js @@ -0,0 +1 @@ +self.postMessage([typeof process, typeof setImmediate, typeof global, typeof Buffer].join(' '))