Skip to content

Commit

Permalink
Merge pull request #169 from canjs/fix-worker-error
Browse files Browse the repository at this point in the history
Allow can-zone to run in Worker contexts
  • Loading branch information
matthewp authored Apr 23, 2018
2 parents ecb4c08 + 8d784fe commit 2a57676
Show file tree
Hide file tree
Showing 10 changed files with 156 additions and 6 deletions.
4 changes: 4 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,7 @@
end_of_line = LF
indent_style = tab
indent_size = 4

[{*.json,*.yml,*.md}]
indent_style = space
indent_size = 2
4 changes: 3 additions & 1 deletion lib/env.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,13 @@ var isNW = isNode && (function(){
return false;
}
})();
var g = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope ?
var isWorker = typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope;
var g = isWorker ?
self :
isNW ? window :
isNode ? global : window;

exports.isNode = isNode;
exports.isNW = isNW;
exports.isWorker = isWorker;
exports.global = g;
6 changes: 5 additions & 1 deletion lib/tasks.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ var env = require("./env");
var util = require("./util");
var slice = Array.prototype.slice;

var isWorker = typeof WorkerGlobalScope !== "undefined" &&
typeof self !== "undefined" &&
self instanceof WorkerGlobalScope;

if(env.isNode) {
var globalTimeoutId = 1;
}
Expand Down Expand Up @@ -42,7 +46,7 @@ var removeTimer = function(timeoutId, callback, Zone){
var getGlobalEventHandlersNames = function getGlobalEventHandlersNames() {
var names = [];

if (!env.isNode) {
if (!env.isNode && !isWorker) {
names = Object.getOwnPropertyNames(HTMLElement.prototype).filter(
function isGlobalEventHandler(name) {
return name.substr(0, 2) === "on";
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"test:node": "mocha test/test.js && mocha test/test_register_node.js",
"test:browser": "testee test/test.html test/register.html --browsers firefox --reporter Spec",
"test:win": "testee test/test.html --browsers firefox --reporter Spec",
"test:worker": "testee test/test_worker.html --browsers firefox --report Spec",
"test:xss": "mocha test/xss/test.js",
"test": "npm run detect-cycle && npm run test:node && npm run test:browser && npm run test:xss",
"version": "git commit -am \"Update dist for release\" && git checkout -b release && git add -f dist/",
Expand Down
7 changes: 5 additions & 2 deletions register.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
"format cjs";
(function(){
var isNode = typeof process !== "undefined" && {}.toString.call(process) === "[object process]";
var isWorker = typeof WorkerGlobalScope !== "undefined" &&
typeof self !== "undefined" &&
self instanceof WorkerGlobalScope;
var g = typeof WorkerGlobalScope !== "undefined" && (self instanceof WorkerGlobalScope)
? self
: isNode
Expand Down Expand Up @@ -136,8 +139,8 @@
function getGlobalEventHandlersNames() {
var names = [];

if (!isNode) {
names = Object.getOwnPropertyNames(HTMLElement.prototype).filter(
if (!isNode && !isWorker) {
names = Object.getOwnPropertyNames(HTMLElement.prototype).filter(
isGlobalEventHandler
);
}
Expand Down
5 changes: 3 additions & 2 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ var Zone = require("../lib/zone");
var env = require("../lib/env");

var isNode = env.isNode;
var isWorker = env.isWorker;

if(!isNode) {
require("steal-mocha");
Expand Down Expand Up @@ -568,7 +569,7 @@ describe("nested setTimeouts", function(){

});

if(isBrowser) {
if(isBrowser && !isWorker) {
describe("requestAnimationFrame", function(){
it("setTimeout with requestAnimationFrame", function(done){
var results = [];
Expand Down Expand Up @@ -850,7 +851,7 @@ if(supportsMutationObservers) {
});
}

if(isBrowser) {
if(isBrowser && !isWorker) {
describe("addEventListener", function(){
it("is run within a zone", function(done){
this.timeout(2000);
Expand Down
5 changes: 5 additions & 0 deletions test/test_worker.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<!doctype html>
<title>can-zone tests</title>
<meta charset="UTF-8">
<script src="../node_modules/steal/steal.js" main="test/test_worker"
data-mocha="bdd" data-transpiler="babel"></script>
73 changes: 73 additions & 0 deletions test/test_worker.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
var steal = require("@steal");
var mocha = require("steal-mocha");
var assert = require("assert");


var workerUrl = steal.loader.stealURL + "?main=~/test/worker_main";
var worker = new Worker(workerUrl);

worker.addEventListener("message", function onMsg(ev){
var msg = ev.data;

switch(msg.type) {
case "suites":
defineSuites(ev.data.suites);
break;
case "test":
setTestResults(ev.data);
break;
}
});

var testMap = new Map();

function clearUI() {
var stats = document.getElementById("mocha-stats");
var report = document.getElementById("mocha-report");
stats.parentNode.removeChild(stats);
report.parentNode.removeChild(report);
}

function defineSuites(suites) {
clearUI();

suites.forEach(function(suite){
suite.tests.forEach(function(test){
var dfd = {};
dfd.promise = new Promise(function(resolve){
dfd.resolve = resolve;
});
var key = suite.title + " - " + test.title;
testMap.set(key, dfd);
});

describe(suite.title, function(){
suite.tests.forEach(function(test){
it(test.title, function(done) {
var key = suite.title + " - " + test.title;
testMap.get(key).resolve(done);
});
})
})
});

mocha.run();
}

function setTestResults(msg) {
var key = msg.suite + " - " + msg.title;
var dfd = testMap.get(key);

if(dfd) {
dfd.promise.then(function(done){
assert.equal(msg.state, "passed");

if(typeof done === "undefined") {
debugger;
}

done();
});
}

}
15 changes: 15 additions & 0 deletions test/worker_main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
var steal = require("@steal");

steal.config({
map: {
"steal-mocha": "node_modules/mocha/mocha"
},
meta: {
"node_modules/mocha/mocha": {
"format": "global",
"exports": "mocha"
}
}
});

steal.import("~/test/worker_test");
42 changes: 42 additions & 0 deletions test/worker_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
var mocha = require("steal-mocha");

mocha.setup({
ui: 'bdd',
reporter: null,
});

require("./test");

var runResults = mocha.run();

var suiteInfo = runResults.suite.suites.map(function(suite){
return {
title: suite.title,
tests: suite.tests.map(function(test){
return {
title: test.title
}
})
};
});

postMessage({
type: "suites",
suites: suiteInfo
});

runResults.on("test end", function(test) {
postMessage({
type: "test",
title: test.title,
state: test.state,
suite: test.parent.title
});
});

runResults.on("end", function() {
postMessage({
type: "run end"
});
//console.log(`${runResults.failures} out of ${runResults.total} failures.`);
});

0 comments on commit 2a57676

Please sign in to comment.