fix event removal in diff

fix CI
This commit is contained in:
Leo Horie 2016-08-12 22:08:02 -04:00
parent fc9d4f2ee4
commit 6c3036e5c6
10 changed files with 37 additions and 67 deletions

View file

@ -30,7 +30,7 @@ Mithril's virtual DOM engine is around 500 lines of well organized code and it i
## Robustness ## 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 ## Modularity

View file

@ -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(/(?: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]){2,}/g, "$1") // remove multiple consecutive line breaks
.replace(/\}[\r\n]+\(/g, "}(") // remove space from iife .replace(/\}[\r\n]+\(/g, "}(") // remove space from iife
.replace(/(window\.){2}/g, "") // collapse window references
} }
function exportCode(file, def, variable, eq) { function exportCode(file, def, variable, eq) {

View file

@ -1,9 +1,10 @@
"use strict" "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 m = require("./render/hyperscript")
var renderService = require("./render/render")(window) var renderService = require("./render/render")(window)
var requestService = require("./request/request")(window) var requestService = require("./request/request")(window, log)
var redrawService = require("./api/pubsub")() var redrawService = require("./api/pubsub")()
requestService.setCompletionCallback(redrawService.publish) requestService.setCompletionCallback(redrawService.publish)

View file

@ -1,4 +1,5 @@
new function() { new function() {
var Stream = function(log) { var Stream = function(log) {
var guid = 0, noop = function() {}, HALT = {} var guid = 0, noop = function() {}, HALT = {}
function createStream() { function createStream() {

View file

@ -421,7 +421,8 @@ module.exports = function($window) {
if (old != null) { if (old != null) {
for (var key in old) { for (var key in old) {
if (attrs == null || !(key in attrs)) { 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,10 +471,12 @@ module.exports = function($window) {
var eventName = key.slice(2) var eventName = key.slice(2)
if (vnode.events === undefined) vnode.events = {} if (vnode.events === undefined) vnode.events = {}
if (vnode.events[key] != null) element.removeEventListener(eventName, vnode.events[key], false) if (vnode.events[key] != null) element.removeEventListener(eventName, vnode.events[key], false)
if (typeof value === "function") {
vnode.events[key] = callback vnode.events[key] = callback
element.addEventListener(eventName, vnode.events[key], false) element.addEventListener(eventName, vnode.events[key], false)
} }
} }
}
//lifecycle //lifecycle
function initLifecycle(source, vnode, hooks) { function initLifecycle(source, vnode, hooks) {

View file

@ -34,6 +34,21 @@ o.spec("event", function() {
o(onevent.args[0].target).equals(div.dom) 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() { o("fires onclick only once after redraw", function() {
var spy = o.spy() var spy = o.spy()
var div = {tag: "div", attrs: {id: "a", onclick: spy}} var div = {tag: "div", attrs: {id: "a", onclick: spy}}

View file

@ -1,9 +1,10 @@
"use strict" "use strict"
var buildQueryString = require("../querystring/build") 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 callbackCount = 0
var oncompletion var oncompletion

View file

@ -6,10 +6,11 @@ var Request = require("../../request/request")
var parseQueryString = require("../../querystring/parse") var parseQueryString = require("../../querystring/parse")
o.spec("jsonp", function() { o.spec("jsonp", function() {
var mock, jsonp var mock, jsonp, spy
o.beforeEach(function() { o.beforeEach(function() {
mock = xhrMock() mock = xhrMock()
jsonp = new Request(mock).jsonp spy = o.spy()
jsonp = new Request(mock, spy).jsonp
}) })
o("works", function(done) { o("works", function(done) {

View file

@ -5,10 +5,11 @@ var xhrMock = require("../../test-utils/xhrMock")
var Request = require("../../request/request") var Request = require("../../request/request")
o.spec("xhr", function() { o.spec("xhr", function() {
var mock, xhr var mock, xhr, spy
o.beforeEach(function() { o.beforeEach(function() {
mock = xhrMock() mock = xhrMock()
xhr = new Request(mock).xhr spy = o.spy()
xhr = new Request(mock, spy).xhr
}) })
o.spec("success", function() { o.spec("success", function() {

View file

@ -1,57 +1,3 @@
"use strict" "use strict"
/** module.exports = typeof setImmediate === "function" ? setImmediate : setTimeout
* 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
})()