Skip to content

Commit 6b72142

Browse files
committed
Merge branch 'magneto' into major
2 parents 8a17ef3 + e961f36 commit 6b72142

File tree

11 files changed

+707
-56
lines changed

11 files changed

+707
-56
lines changed

lib/attr.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
var attr = require('can-util/dom/attr/attr');
21
var live = require('./core');
32
var canReflect = require('can-reflect');
3+
var domMutateNode = require('can-dom-mutate/node');
4+
45
/**
56
* @function can-view-live.attr attr
67
* @parent can-view-live
@@ -28,7 +29,7 @@ var canReflect = require('can-reflect');
2829
*/
2930
live.attr = function(el, attributeName, compute) {
3031
function liveUpdateAttr(newVal) {
31-
attr.set(el, attributeName, newVal);
32+
domMutateNode.setAttribute.call(el, attributeName, newVal);
3233
}
3334
//!steal-remove-start
3435
Object.defineProperty(liveUpdateAttr, "name", {

lib/attrs.js

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// This provides live binding for stache attributes.
22
var live = require('./core');
33
var viewCallbacks = require('can-view-callbacks');
4-
var attr = require('can-util/dom/attr/attr');
5-
var domEvents = require('can-util/dom/events/events');
4+
var domMutate = require('can-dom-mutate');
5+
var domMutateNode = require('can-dom-mutate/node');
66
var canReflect = require('can-reflect');
77
var canReflectDeps = require('can-reflect-dependencies');
88

@@ -15,7 +15,7 @@ live.attrs = function(el, compute, scope, options) {
1515
// is not compute to bind on.
1616
var attrs = live.getAttributeParts(compute);
1717
for (var name in attrs) {
18-
attr.set(el, name, attrs[name]);
18+
domMutateNode.setAttribute.call(el, name, attrs[name]);
1919
}
2020
return;
2121
}
@@ -37,7 +37,7 @@ live.attrs = function(el, compute, scope, options) {
3737
// if the value of the attribute has changed
3838
if (newValue !== oldValue) {
3939
// set on DOM attributes (dispatches an "attributes" event as well)
40-
attr.set(el, name, newValue);
40+
domMutateNode.setAttribute.call(el, name, newValue);
4141
// get registered callback for attribute name and fire
4242
var callback = viewCallbacks.attr(name);
4343
if (callback) {
@@ -54,7 +54,7 @@ live.attrs = function(el, compute, scope, options) {
5454
// any attrs left at this point are not set on the element now,
5555
// so remove them.
5656
for (name in oldAttrs) {
57-
attr.remove(el, name);
57+
domMutateNode.removeAttribute.call(el, name);
5858
}
5959
oldAttrs = newAttrs;
6060
}
@@ -69,16 +69,24 @@ live.attrs = function(el, compute, scope, options) {
6969
// set attributes on any change to the compute
7070
canReflect.onValue(compute, liveAttrsUpdate);
7171

72+
var removalDisposal;
7273
var teardownHandler = function() {
7374
canReflect.offValue(compute, liveAttrsUpdate);
74-
domEvents.removeEventListener.call(el, 'removed', teardownHandler);
75+
if (removalDisposal) {
76+
removalDisposal();
77+
removalDisposal = undefined;
78+
}
7579

7680
//!steal-remove-start
7781
canReflectDeps.deleteMutatedBy(el, compute);
7882
//!steal-remove-end
7983
};
8084
// unbind on element removal
81-
domEvents.addEventListener.call(el, 'removed', teardownHandler);
85+
removalDisposal = domMutate.onNodeRemoval(el, function () {
86+
if (!el.ownerDocument.contains(el)) {
87+
teardownHandler();
88+
}
89+
});
8290

8391
// set up a current attribute set and assign to oldAttrs
8492
liveAttrsUpdate(canReflect.getValue(compute));

lib/core.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
var parser = require('can-view-parser');
2-
var domEvents = require('can-util/dom/events/events');
2+
var domMutate = require('can-dom-mutate');
33
var nodeLists = require('can-view-nodelist');
44
var makeFrag = require('can-util/dom/frag/frag');
55
var childNodes = require('can-util/dom/child-nodes/child-nodes');
66
var canReflect = require('can-reflect');
77
var canReflectDeps = require('can-reflect-dependencies');
88

9-
require('can-util/dom/events/removed/removed');
10-
119
/**
1210
* @module {{}} can-view-live can-view-live
1311
* @parent can-views
@@ -45,14 +43,18 @@ var live = {
4543
// Setup a live listener on an element that binds now,
4644
// but unbinds when an element is no longer in the DOM
4745
var tornDown = false,
46+
removalDisposal,
4847
data,
4948
teardown = function() {
5049
// Removing an element can call teardown which
5150
// unregister the nodeList which calls teardown
5251
if (!tornDown) {
5352
tornDown = true;
5453
unbind(data);
55-
domEvents.removeEventListener.call(el, 'removed', teardown);
54+
if (removalDisposal) {
55+
removalDisposal();
56+
removalDisposal = undefined;
57+
}
5658
}
5759
return true;
5860
};
@@ -61,7 +63,11 @@ var live = {
6163
return parent ? false : teardown();
6264
}
6365
};
64-
domEvents.addEventListener.call(el, 'removed', teardown);
66+
removalDisposal = domMutate.onNodeRemoval(el, function () {
67+
if (!el.ownerDocument.contains(el)) {
68+
teardown();
69+
}
70+
});
6571
bind(data);
6672
return data;
6773
},

lib/list.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ var live = require('./core');
33
var nodeLists = require('can-view-nodelist');
44

55
var frag = require('can-util/dom/frag/frag');
6-
var domMutate = require('can-util/dom/mutate/mutate');
76
var childNodes = require('can-util/dom/child-nodes/child-nodes');
7+
var domMutateNode = require('can-dom-mutate/node');
88

99
var makeArray = require('can-util/js/make-array/make-array');
1010
var each = require('can-util/js/each/each');
@@ -215,7 +215,7 @@ ListDOMPatcher.prototype = {
215215
} else {
216216
// Add elements before the next index's first element.
217217
var el = nodeLists.first(masterNodeList[masterListIndex]);
218-
domMutate.insertBefore.call(el.parentNode, frag, el);
218+
domMutateNode.insertBefore.call(el.parentNode, frag, el);
219219
}
220220
splice.apply(this.masterNodeList, [
221221
masterListIndex,

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,18 @@
4747
]
4848
},
4949
"dependencies": {
50+
"can-dom-mutate": "<2.0.0",
5051
"can-observation": "^4.0.0-pre.3",
5152
"can-queues": "<2.0.0",
5253
"can-reflect": "^1.10.2",
5354
"can-reflect-dependencies": "<2.0.0",
5455
"can-simple-observable": "^2.0.0-pre.3",
5556
"can-symbol": "^1.4.1",
5657
"can-util": "^3.9.6",
57-
"can-view-callbacks": "^4.0.0-pre.1",
58-
"can-view-nodelist": "^4.0.0-pre.1",
58+
"can-view-callbacks": "^4.0.0-pre.9",
59+
"can-view-nodelist": "^4.0.0-pre.5",
5960
"can-view-parser": "^4.0.0-pre.0",
60-
"can-view-target": "^3.1.0"
61+
"can-view-target": "^4.0.0-pre.1"
6162
},
6263
"devDependencies": {
6364
"can-define": "^2.0.0-pre.7",

test/attr-test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ var live = require('can-view-live');
22
var Observation = require("can-observation");
33
var QUnit = require('steal-qunit');
44
var domAttr = require("can-util/dom/attr/attr");
5+
var domMutate = require('can-dom-mutate');
56
var SimpleObservable = require("can-simple-observable");
6-
var domEvents = require('can-util/dom/events/events');
77
var testHelpers = require('can-test-helpers');
88
var canReflectDeps = require('can-reflect-dependencies');
99

@@ -79,8 +79,8 @@ testHelpers.dev.devOnlyTest('can-reflect-dependencies', function(assert) {
7979
'should return the two SimpleObservable as dependencies'
8080
);
8181

82-
domEvents.addEventListener.call(div, 'removed', function checkTeardown() {
83-
domEvents.removeEventListener.call(div, 'removed', checkTeardown);
82+
var undo = domMutate.onNodeRemoval(div, function checkTeardown () {
83+
undo();
8484

8585
assert.equal(
8686
typeof canReflectDeps.getDependencyDataOf(div),

test/attrs-test.js

Lines changed: 19 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ var Observation = require("can-observation");
33
var QUnit = require('steal-qunit');
44
var SimpleObservable = require("can-simple-observable");
55
var queues = require("can-queues");
6-
var domEvents = require('can-util/dom/events/events');
7-
var domMutate = require('can-util/dom/mutate/mutate');
6+
var domMutate = require('can-dom-mutate');
7+
var domMutateNode = require('can-dom-mutate/node');
88
var testHelpers = require('can-test-helpers');
99
var canReflectDeps = require('can-reflect-dependencies');
1010

@@ -37,30 +37,27 @@ QUnit.test('basics', function () {
3737
equal(div.getAttribute('foo'), 'bar');
3838
});
3939

40-
QUnit.test('should remove `removed` events listener', function () {
41-
QUnit.stop();
42-
var origAddEventListener = domEvents.addEventListener;
43-
var origRemoveEventListener = domEvents.removeEventListener;
44-
45-
domEvents.addEventListener = function () {
46-
QUnit.ok(true, 'addEventListener called');
47-
origAddEventListener.apply(this, arguments);
48-
domEvents.addEventListener = origAddEventListener;
49-
};
50-
51-
domEvents.removeEventListener = function () {
52-
QUnit.ok(true, 'addEventListener called');
53-
origRemoveEventListener.apply(this, arguments);
54-
domEvents.removeEventListener = origRemoveEventListener;
55-
QUnit.start();
40+
QUnit.test('should remove `removed` events listener', function (assert) {
41+
var done = assert.async();
42+
var onNodeRemoval = domMutate.onNodeRemoval;
43+
44+
domMutate.onNodeRemoval = function () {
45+
assert.ok(true, 'addEventListener called');
46+
var disposal = onNodeRemoval.apply(null, arguments);
47+
domMutate.onNodeRemoval = onNodeRemoval;
48+
return function () {
49+
assert.ok(true, 'disposal function was called');
50+
disposal();
51+
done();
52+
};
5653
};
5754

5855
var div = document.createElement('div');
5956
var text = new SimpleObservable('hello');
6057

61-
domMutate.appendChild.call(this.fixture, div);
58+
domMutateNode.appendChild.call(this.fixture, div);
6259
live.attrs(div, text);
63-
domMutate.removeChild.call(this.fixture, div);
60+
domMutateNode.removeChild.call(this.fixture, div);
6461
});
6562

6663
testHelpers.dev.devOnlyTest('can-reflect-dependencies', function(assert) {
@@ -92,8 +89,8 @@ testHelpers.dev.devOnlyTest('can-reflect-dependencies', function(assert) {
9289
new Set([text])
9390
);
9491

95-
domEvents.addEventListener.call(div, 'removed', function checkTeardown() {
96-
domEvents.removeEventListener.call(div, 'removed', checkTeardown);
92+
var undo = domMutate.onNodeRemoval(div, function checkTeardown () {
93+
undo();
9794

9895
assert.equal(
9996
typeof canReflectDeps.getDependencyDataOf(div),

test/list-test.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ var canReflect = require("can-reflect");
88
var queues = require("can-queues");
99
var fragment = require('can-util/dom/fragment/fragment');
1010
var NodeLists = require("can-view-nodelist");
11-
var domMutate = require('can-util/dom/mutate/mutate');
11+
var domMutate = require('can-dom-mutate');
12+
var domMutateNode = require('can-dom-mutate/node');
1213
var canSymbol = require("can-symbol");
13-
var domEvents = require('can-util/dom/events/events');
1414
var testHelpers = require('can-test-helpers');
1515
var canReflectDeps = require('can-reflect-dependencies');
1616

@@ -366,7 +366,7 @@ test("no memory leaks", function () {
366366

367367
QUnit.stop();
368368
setTimeout(function(){
369-
domMutate.removeChild.call(fixture,div);
369+
domMutateNode.removeChild.call(fixture,div);
370370
setTimeout(function () {
371371
var handlers = map[canSymbol.for("can.meta")].handlers.get([]);
372372
equal(handlers.length, 0, "there are no bindings");
@@ -400,8 +400,8 @@ testHelpers.dev.devOnlyTest('can-reflect-dependencies', function(assert) {
400400
new Set([list])
401401
);
402402

403-
domEvents.addEventListener.call(div, 'removed', function checkTeardown() {
404-
domEvents.removeEventListener.call(div, 'removed', checkTeardown);
403+
var undo = domMutate.onNodeRemoval(div, function checkTeardown () {
404+
undo();
405405

406406
assert.equal(
407407
typeof canReflectDeps.getDependencyDataOf(div),

0 commit comments

Comments
 (0)