spec "should deserialize an element reference and add event listeners" fails
marchant opened this issue · 1 comments
it("should deserialize an element reference and add event listeners", function (done) {
var serialization = {
"rootEl": {
"value": {"#": "id"},
"listeners": [
{
"type": "click",
"listener": {"@": "rootEl"}
}
]
}
},
serializationString = JSON.stringify(serialization);
rootEl.innerHTML = '<div data-montage-id="id">content</div>';
deserializer.init(serializationString, require);
deserializer.deserialize(null, rootEl).then(function (objects) {
var registeredEventListeners = defaultEventManager._registeredBubbleEventListeners.get("click");
expect(registeredEventListeners.get(rootEl.firstElementChild) === objects.rootEl).toBe(true);
}).finally(function () {
done();
});
});
The problem is that registeredEventListeners is undefined, because the listener structure is not transformed as expected into the object it represents before being sent to the addEventListener() in event-manager.js:270.
Problem starts in montage-reviver.js: reviveRootObject. context.setUnitsToDeserialize is done for (valueType === "object") but not for (valueType === "Element"), but essentially, unit-deserializer's getObjectByLabel() isn't called as it should
Spec will still fail with fix #1935, even though the logic will be correct.
The expectation expect(registeredEventListeners.get(rootEl.firstElementChild) === objects.rootEl).toBe(true);
will fail because the keys of registeredEventListeners
are element Proxies, whereas rootEl.firstElementChild
is an actual element. The deserializer doesn't expose the Proxies back to the caller, just the real element.