Skip to content

Commit 933d4c4

Browse files
committed
re-implement nextTick with MutationObserver
1 parent 19e0223 commit 933d4c4

File tree

4 files changed

+48
-9
lines changed

4 files changed

+48
-9
lines changed

.jshintrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"proto": true,
1515
"globals": {
1616
"console": true,
17-
"DocumentFragment": true
17+
"DocumentFragment": true,
18+
"WebkitMutationObserver": true
1819
}
1920
}

src/util/env.js

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,43 @@ var inBrowser = exports.inBrowser =
2424
* @param {Object} ctx
2525
*/
2626

27-
var defer = inBrowser
28-
? (window.requestAnimationFrame ||
29-
window.webkitRequestAnimationFrame ||
30-
setTimeout)
31-
: setTimeout
27+
var defer
28+
/* istanbul ignore if */
29+
if (typeof MutationObserver !== 'undefined') {
30+
defer = deferFromMutationObserver(MutationObserver)
31+
} else
32+
/* istanbul ignore if */
33+
if (typeof WebkitMutationObserver !== 'undefined') {
34+
defer = deferFromMutationObserver(WebkitMutationObserver)
35+
} else
36+
/* istanbul ignore if */
37+
if (typeof setImmediate !== 'undefined') {
38+
defer = setImmediate
39+
} else {
40+
defer = inBrowser
41+
? (window.requestAnimationFrame ||
42+
window.webkitRequestAnimationFrame ||
43+
setTimeout)
44+
: setTimeout
45+
}
46+
47+
/* istanbul ignore next */
48+
function deferFromMutationObserver (Observer) {
49+
var queue = []
50+
var node = document.createTextNode('0')
51+
var i = 0
52+
new Observer(function () {
53+
var l = queue.length
54+
for (var i = 0; i < l; i++) {
55+
queue[i]()
56+
}
57+
queue = queue.slice(l)
58+
}).observe(node, { characterData: true })
59+
return function mutationObserverDefer (cb) {
60+
queue.push(cb)
61+
node.nodeValue = (i = ++i % 2)
62+
}
63+
}
3264

3365
exports.nextTick = function (cb, ctx) {
3466
if (ctx) {

test/unit/specs/directives/style_spec.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@ if (_.inBrowser) {
5757
expect(el.style.color).toBe('')
5858
})
5959

60+
it('ignore unsupported property', function () {
61+
dir.arg = 'unsupported'
62+
dir.update('test')
63+
expect(el.style.unsupported).not.toBe('test')
64+
})
65+
6066
it('auto prefixing', function () {
6167
var prop = checkPrefixedProp('transform')
6268
dir.arg = 'transform'

test/unit/specs/transition/transition_spec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,10 +210,10 @@ if (_.inBrowser && !_.isIE9) {
210210
el.__v_trans.id = 'test'
211211
// cascaded class style
212212
el.classList.add('test')
213-
// wait a tick before applying the transition
213+
// wait a frame before applying the transition
214214
// because doing so in the same frame won't trigger
215215
// transition
216-
_.nextTick(function () {
216+
setTimeout(function () {
217217
transition.apply(el, -1, op, vm, cb)
218218
_.nextTick(function () {
219219
expect(op).not.toHaveBeenCalled()
@@ -226,7 +226,7 @@ if (_.inBrowser && !_.isIE9) {
226226
done()
227227
})
228228
})
229-
})
229+
}, 0)
230230
})
231231

232232
it('animation enter', function (done) {

0 commit comments

Comments
 (0)