mutation-summary
Version:
Makes observing the DOM fast and easy
112 lines • 4.76 kB
JavaScript
"use strict";
var __extends = (this && this.__extends) || (function () {
var extendStatics = function (d, b) {
extendStatics = Object.setPrototypeOf ||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
return extendStatics(d, b);
};
return function (d, b) {
if (typeof b !== "function" && b !== null)
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
extendStatics(d, b);
function __() { this.constructor = d; }
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.TreeChanges = void 0;
var NodeMap_1 = require("./NodeMap");
var NodeChange_1 = require("./NodeChange");
var Movement_1 = require("./Movement");
var TreeChanges = /** @class */ (function (_super) {
__extends(TreeChanges, _super);
function TreeChanges(rootNode, mutations) {
var _this = _super.call(this) || this;
_this.rootNode = rootNode;
_this.reachableCache = undefined;
_this.wasReachableCache = undefined;
_this.anyParentsChanged = false;
_this.anyAttributesChanged = false;
_this.anyCharacterDataChanged = false;
for (var m = 0; m < mutations.length; m++) {
var mutation = mutations[m];
switch (mutation.type) {
case 'childList':
_this.anyParentsChanged = true;
for (var i = 0; i < mutation.removedNodes.length; i++) {
var node = mutation.removedNodes[i];
_this.getChange(node).removedFromParent(mutation.target);
}
for (var i = 0; i < mutation.addedNodes.length; i++) {
var node = mutation.addedNodes[i];
_this.getChange(node).insertedIntoParent();
}
break;
case 'attributes': {
_this.anyAttributesChanged = true;
var change = _this.getChange(mutation.target);
change.attributeMutated(mutation.attributeName, mutation.oldValue);
break;
}
case 'characterData': {
_this.anyCharacterDataChanged = true;
var change = _this.getChange(mutation.target);
change.characterDataMutated(mutation.oldValue);
break;
}
}
}
return _this;
}
TreeChanges.prototype.getChange = function (node) {
var change = this.get(node);
if (!change) {
change = new NodeChange_1.NodeChange(node);
this.set(node, change);
}
return change;
};
TreeChanges.prototype.getOldParent = function (node) {
var change = this.get(node);
return change ? change.getOldParent() : node.parentNode;
};
TreeChanges.prototype.getIsReachable = function (node) {
if (node === this.rootNode)
return true;
if (!node)
return false;
this.reachableCache = this.reachableCache || new NodeMap_1.NodeMap();
var isReachable = this.reachableCache.get(node);
if (isReachable === undefined) {
isReachable = this.getIsReachable(node.parentNode);
this.reachableCache.set(node, isReachable);
}
return isReachable;
};
// A node wasReachable if its oldParent wasReachable.
TreeChanges.prototype.getWasReachable = function (node) {
if (node === this.rootNode)
return true;
if (!node)
return false;
this.wasReachableCache = this.wasReachableCache || new NodeMap_1.NodeMap();
var wasReachable = this.wasReachableCache.get(node);
if (wasReachable === undefined) {
wasReachable = this.getWasReachable(this.getOldParent(node));
this.wasReachableCache.set(node, wasReachable);
}
return wasReachable;
};
TreeChanges.prototype.reachabilityChange = function (node) {
if (this.getIsReachable(node)) {
return this.getWasReachable(node) ?
Movement_1.Movement.STAYED_IN : Movement_1.Movement.ENTERED;
}
return this.getWasReachable(node) ?
Movement_1.Movement.EXITED : Movement_1.Movement.STAYED_OUT;
};
return TreeChanges;
}(NodeMap_1.NodeMap));
exports.TreeChanges = TreeChanges;
//# sourceMappingURL=TreeChanges.js.map