fix event removal in diff
fix CI
This commit is contained in:
parent
fc9d4f2ee4
commit
6c3036e5c6
10 changed files with 37 additions and 67 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
5
index.js
5
index.js
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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}}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
|
|
@ -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
|
|
||||||
})()
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue