Browse Source

test: Node integration in web workers

Cheng Zhao 8 years ago
parent
commit
033aa16e04

+ 1 - 0
atom/renderer/atom_renderer_client.cc

@@ -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);

+ 1 - 1
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

+ 44 - 0
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 () {

+ 1 - 0
spec/fixtures/api/unload

@@ -0,0 +1 @@
+unload

+ 12 - 0
spec/fixtures/pages/shared_worker.html

@@ -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 - 0
spec/fixtures/pages/worker.html

@@ -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 - 0
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(' '))
+}

+ 1 - 0
spec/fixtures/workers/worker_node.js

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