From 6c3036e5c6675e397b059b2a013a2c952fc56692 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Fri, 12 Aug 2016 22:08:02 -0400 Subject: [PATCH] fix event removal in diff fix CI --- README.md | 2 +- bundler/bundle.js | 1 + index.js | 5 ++-- mithril.js | 1 + render/render.js | 9 ++++-- render/tests/test-event.js | 15 ++++++++++ request/request.js | 5 ++-- request/tests/test-jsonp.js | 5 ++-- request/tests/test-xhr.js | 5 ++-- test-utils/callAsync.js | 56 +------------------------------------ 10 files changed, 37 insertions(+), 67 deletions(-) diff --git a/README.md b/README.md index 669c479b..5bde6194 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ Mithril's virtual DOM engine is around 500 lines of well organized code and it i ## Robustness -There are over 3000 assertions in the test suite, and tests cover even difficult-to-test things like `location.href`, `element.innerHTML` and `XMLHttpRequest` usage. +There are over 4000 assertions in the test suite, and tests cover even difficult-to-test things like `location.href`, `element.innerHTML` and `XMLHttpRequest` usage. ## Modularity diff --git a/bundler/bundle.js b/bundler/bundle.js index f9a03181..4081de41 100644 --- a/bundler/bundle.js +++ b/bundler/bundle.js @@ -55,6 +55,7 @@ module.exports = function(input, output, options) { .replace(/(?:var|let|const)[\t ]([\w_$\.]+)(\s*=\s*)\1([\r\n;]+)/g, "$3") // remove assignments to itself .replace(/([\r\n]){2,}/g, "$1") // remove multiple consecutive line breaks .replace(/\}[\r\n]+\(/g, "}(") // remove space from iife + .replace(/(window\.){2}/g, "") // collapse window references } function exportCode(file, def, variable, eq) { diff --git a/index.js b/index.js index 2c63a54f..ccad707c 100644 --- a/index.js +++ b/index.js @@ -1,9 +1,10 @@ "use strict" -var Stream = require("./util/stream")(console.error.bind(console)) +var log = console.error.bind(console) +var Stream = require("./util/stream")(log) var m = require("./render/hyperscript") var renderService = require("./render/render")(window) -var requestService = require("./request/request")(window) +var requestService = require("./request/request")(window, log) var redrawService = require("./api/pubsub")() requestService.setCompletionCallback(redrawService.publish) diff --git a/mithril.js b/mithril.js index 930a359b..0fc8a434 100644 --- a/mithril.js +++ b/mithril.js @@ -1,4 +1,5 @@ new function() { + var Stream = function(log) { var guid = 0, noop = function() {}, HALT = {} function createStream() { diff --git a/render/render.js b/render/render.js index 42b1df41..e71ca0fe 100644 --- a/render/render.js +++ b/render/render.js @@ -421,7 +421,8 @@ module.exports = function($window) { if (old != null) { for (var key in old) { if (attrs == null || !(key in attrs)) { - if (key !== "key") vnode.dom.removeAttribute(key) + if (key[0] === "o" && key[1] === "n" && !isLifecycleMethod(key)) updateEvent(vnode, key, undefined) + else if (key !== "key") vnode.dom.removeAttribute(key) } } } @@ -470,8 +471,10 @@ module.exports = function($window) { var eventName = key.slice(2) if (vnode.events === undefined) vnode.events = {} if (vnode.events[key] != null) element.removeEventListener(eventName, vnode.events[key], false) - vnode.events[key] = callback - element.addEventListener(eventName, vnode.events[key], false) + if (typeof value === "function") { + vnode.events[key] = callback + element.addEventListener(eventName, vnode.events[key], false) + } } } diff --git a/render/tests/test-event.js b/render/tests/test-event.js index b22e9063..31d2d012 100644 --- a/render/tests/test-event.js +++ b/render/tests/test-event.js @@ -33,6 +33,21 @@ o.spec("event", function() { o(onevent.args[0].type).equals("click") o(onevent.args[0].target).equals(div.dom) }) + + o("removes event", function() { + var spy = o.spy() + var vnode = {tag: "a", attrs: {onclick: spy}} + var updated = {tag: "a", attrs: {}} + + render(root, [vnode]) + render(root, [updated]) + + var e = $window.document.createEvent("MouseEvents") + e.initEvent("click", true, true) + vnode.dom.dispatchEvent(e) + + o(spy.callCount).equals(0) + }) o("fires onclick only once after redraw", function() { var spy = o.spy() diff --git a/request/request.js b/request/request.js index 7447bb7e..5fc87dc4 100644 --- a/request/request.js +++ b/request/request.js @@ -1,9 +1,10 @@ "use strict" var buildQueryString = require("../querystring/build") -var Stream = require("../util/stream") +var StreamFactory = require("../util/stream") -module.exports = function($window) { +module.exports = function($window, log) { + var Stream = StreamFactory(log) var callbackCount = 0 var oncompletion diff --git a/request/tests/test-jsonp.js b/request/tests/test-jsonp.js index 80afdebd..994df034 100644 --- a/request/tests/test-jsonp.js +++ b/request/tests/test-jsonp.js @@ -6,10 +6,11 @@ var Request = require("../../request/request") var parseQueryString = require("../../querystring/parse") o.spec("jsonp", function() { - var mock, jsonp + var mock, jsonp, spy o.beforeEach(function() { mock = xhrMock() - jsonp = new Request(mock).jsonp + spy = o.spy() + jsonp = new Request(mock, spy).jsonp }) o("works", function(done) { diff --git a/request/tests/test-xhr.js b/request/tests/test-xhr.js index 3dc98902..9493b483 100644 --- a/request/tests/test-xhr.js +++ b/request/tests/test-xhr.js @@ -5,10 +5,11 @@ var xhrMock = require("../../test-utils/xhrMock") var Request = require("../../request/request") o.spec("xhr", function() { - var mock, xhr + var mock, xhr, spy o.beforeEach(function() { mock = xhrMock() - xhr = new Request(mock).xhr + spy = o.spy() + xhr = new Request(mock, spy).xhr }) o.spec("success", function() { diff --git a/test-utils/callAsync.js b/test-utils/callAsync.js index dd7c1c8f..426964c9 100644 --- a/test-utils/callAsync.js +++ b/test-utils/callAsync.js @@ -1,57 +1,3 @@ "use strict" -/** - * This is modeled after Bluebird's scheduler. It solves for quite a few edge - * cases, and should help alleviate most of the flakiness issues. It also speeds - * up the suite a bit. - */ - -module.exports = (function () { - // The scheduler for NodeJS/io.js is setImmediate for recent versions of - // node because of macrotask semantics (i.e. don't starve the event loop). - if (typeof process !== "undefined" && - /^\[object process\]/i.test({}.toString.call(process))) { - var version = process.versions.node.split(".").map(Number) - var isRecent = version[0] === 0 && version[1] > 10 || version[0] > 0 - - return isRecent ? setImmediate : process.nextTick - } - - if (typeof Promise === "function") { - var p = Promise.resolve() - - return function (fn) { - p.then(fn) - } - } - - if (typeof MutationObserver !== "undefined") { - // Using 2 mutation observers to batch multiple updates into one. - var div = document.createElement("div") - var opts = {attributes: true} - var toggleScheduled = false - var div2 = document.createElement("div") - var o2 = new MutationObserver(function() { - div.classList.toggle("foo") - toggleScheduled = false - }) - o2.observe(div2, opts) - - function scheduleToggle() { - if (toggleScheduled) return - toggleScheduled = true - div2.classList.toggle("foo") - } - - return function (fn) { - var o = new MutationObserver(function() { - o.disconnect() - fn() - }) - o.observe(div, opts) - scheduleToggle() - } - } - - return typeof setImmediate === "function" ? setImmediate : setTimeout -})() +module.exports = typeof setImmediate === "function" ? setImmediate : setTimeout