diff --git a/packages/projector/spec/projector.spec.js b/packages/projector/spec/projector.spec.js index d3cb453..0b1ccc6 100644 --- a/packages/projector/spec/projector.spec.js +++ b/packages/projector/spec/projector.spec.js @@ -51,11 +51,11 @@ describe('Projector', () => { } describe('getElement', () => { - it('getElement(null) method should to return the container.', () => { + it('should to return the container from a null id.', () => { expect(projector.getElement(null)).toBe(container); }); - it('getElement(id) method should to return the patched node.', () => { + it('should to return the patched node from an integer id.', () => { const id = add(h('div', { className: 'first' })); expect(projector.getElement(id)._id).toBe(id); }); @@ -245,10 +245,14 @@ describe('Projector', () => { it('do not propagate a removed sibling event', done => { let callCount = 1; function eventHandler(evt) { - expect(evt.target._id).toBe(Bid); - patch(Bid, { onclick: null }); - if (0 === callCount--) { - fail('Should not be called twice.'); + if (evt.target._id === Bid) { + patch(Bid, { onclick: null }); + if (0 === callCount--) { + fail('Should not be called twice.'); + } + } else { + expect(evt.target._id).toBe(Aid); + expect(callCount).toBe(0); } } projector.subscribe(eventHandler); @@ -261,7 +265,10 @@ describe('Projector', () => { return waitForNextFrame(); }) .then(() => { - // debugger; + projector.getElement(Aid).click(); + return waitForNextFrame(); + }) + .then(() => { projector.getElement(Bid).click(); return waitForNextFrame(); }) @@ -269,4 +276,49 @@ describe('Projector', () => { .catch(console.error.bind(console)); }); }); + + describe('setElementProperty', () => { + it('Can set element properties', () => { + const id = add(h('div', { className: 'first' })); + const el = projector.getElement(id); + expect(el.className).toBe('first'); + projector.setElementProperty(id, 'className', 'second'); + expect(el.className).toBe('second'); + }); + + it('Can set pathed element properties', () => { + const id = add(h('div', { className: 'first' })); + const el = projector.getElement(id); + expect(el.className).toBe('first'); + projector.setElementProperty(id, 'style.backgroundColor', 'blue'); + expect(el.style.backgroundColor).toBe('blue'); + }); + + it('Cannot set innerHTML', () => { + const id = add(h('div', { className: 'first' })); + const el = projector.getElement(id); + expect(el.className).toBe('first'); + try { + projector.setElementProperty(id, 'innerHTML', '
'); + } catch (e) { + expect(el.innerHTML).not.toBe('
'); + expect(e.message).toBe('Access Denied'); + return; + } + fail('Setting innerHTML should fail.'); + }); + }); + + describe('runElementMethod', () => { + it('Can click', done => { + function eventHandler(evt) { + expect(evt.target._id).toBe(id); + done(); + } + projector.subscribe(eventHandler); + + const id = add(h('input', { type: 'text', value: 'test', onclick: true })); + projector.runElementMethod(id, 'click'); + }); + }); }); diff --git a/packages/projector/src/history.js b/packages/projector/src/history.js index 6d83692..9abc3fe 100644 --- a/packages/projector/src/history.js +++ b/packages/projector/src/history.js @@ -9,7 +9,7 @@ export function history(onChange) { return (...args) => onChange([6, 'history', name, args]); } // return undefined; - } + }, set(target, name, value) { throw new Error(`Cannot set ${name} on history.`); diff --git a/packages/projector/src/index.js b/packages/projector/src/index.js index 3037f86..dbbdca6 100644 --- a/packages/projector/src/index.js +++ b/packages/projector/src/index.js @@ -1,2 +1,2 @@ export { Projector } from './projector.js'; -export { Scanner } from './scanner.js'; +// export { Scanner } from './scanner.js'; diff --git a/packages/projector/src/projector.js b/packages/projector/src/projector.js index 06d5a41..2485576 100644 --- a/packages/projector/src/projector.js +++ b/packages/projector/src/projector.js @@ -166,9 +166,9 @@ export function Projector(domRoot) { throw new Error('Access Denied'); } - do { - ptr = ptr[path.pop()]; - } while (path.length > 1); + while (path.length > 1) { + ptr = ptr[path.shift()]; + } return (ptr[path[0]] = value); }