montagejs/montage

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.