From df5b641bf70d2aa0d6f32aef1ee759b89d69e86c Mon Sep 17 00:00:00 2001 From: Diego Nascimento Date: Wed, 29 Nov 2017 18:13:28 -0300 Subject: [PATCH 1/7] Adding set function --- packages/metal-dom/src/domData.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/metal-dom/src/domData.js b/packages/metal-dom/src/domData.js index f2cac29e..d13c614a 100644 --- a/packages/metal-dom/src/domData.js +++ b/packages/metal-dom/src/domData.js @@ -35,6 +35,27 @@ class domData { static has(element) { return !!element[METAL_DATA]; } + + /** + * Sets Metal.js's data for the given element. + * @param {!Element} element + * @param {string=} name Optional Property from the data to be returned. + * @param {*=} value Optional value to the set the requested property + * to if it doesn't exist yet in the data. + * @return {!Object} + */ + static set(element, name, value) { + if (!element[METAL_DATA]) { + element[METAL_DATA] = {}; + } + if (!name || !value) { + return element[METAL_DATA]; + } + if (!element[METAL_DATA][name] && value) { + element[METAL_DATA][name] = value; + } + return element[METAL_DATA][name]; + } } export default domData; From 5ff1df010d20112caaf1749c9f5ad0fd7c3880fa Mon Sep 17 00:00:00 2001 From: Diego Nascimento Date: Wed, 29 Nov 2017 18:16:38 -0300 Subject: [PATCH 2/7] Refactoring domData tests --- packages/metal-dom/test/domData.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/metal-dom/test/domData.js b/packages/metal-dom/test/domData.js index 2886e41b..22d1af62 100644 --- a/packages/metal-dom/test/domData.js +++ b/packages/metal-dom/test/domData.js @@ -3,8 +3,8 @@ import domData from '../src/domData'; describe('domData', function() { - it('should get data object from element', function() { - let data = domData.get(document.createElement('div')); + it('should set data object from element', function() { + let data = domData.set(document.createElement('div')); assert.ok(data); }); @@ -16,6 +16,6 @@ describe('domData', function() { it('should return different data objects for the different elements', function() { let element1 = document.createElement('div'); let element2 = document.createElement('div'); - assert.notStrictEqual(domData.get(element1), domData.get(element2)); + assert.notStrictEqual(domData.set(element1), domData.set(element2)); }); }); From 2466d463d9a8d470d65cec8a8b830e33e2953afc Mon Sep 17 00:00:00 2001 From: Diego Nascimento Date: Fri, 1 Dec 2017 13:44:58 -0300 Subject: [PATCH 3/7] Now domData.set can overwrite a data object --- packages/metal-dom/src/domData.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/metal-dom/src/domData.js b/packages/metal-dom/src/domData.js index d13c614a..089e7ec5 100644 --- a/packages/metal-dom/src/domData.js +++ b/packages/metal-dom/src/domData.js @@ -53,6 +53,8 @@ class domData { } if (!element[METAL_DATA][name] && value) { element[METAL_DATA][name] = value; + } else if (element[METAL_DATA][name] && value) { + element[METAL_DATA][name] = value; } return element[METAL_DATA][name]; } From f5467cb4d634fe9ed218c5491a7629e847c2ad75 Mon Sep 17 00:00:00 2001 From: Diego Nascimento Date: Fri, 1 Dec 2017 13:45:49 -0300 Subject: [PATCH 4/7] Enhancing some domData tests --- packages/metal-dom/test/domData.js | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/packages/metal-dom/test/domData.js b/packages/metal-dom/test/domData.js index 22d1af62..84bf35bb 100644 --- a/packages/metal-dom/test/domData.js +++ b/packages/metal-dom/test/domData.js @@ -8,6 +8,35 @@ describe('domData', function() { assert.ok(data); }); + it('should get data object from element', function() { + let element = document.createElement('div'); + domData.set(element, 'value', 20); + let data = domData.get(element); + assert.strictEqual(JSON.stringify(data), '{"value":20}'); + }); + + it('should get data value from element', function() { + let element = document.createElement('img'); + domData.set(element, 'value', true); + let data = domData.get(element, 'value'); + assert.strictEqual(data, true); + }); + + it('should set data without a value', function() { + let element = document.createElement('div'); + domData.set(element); + let data = domData.get(element); + assert.strictEqual(JSON.stringify(data), '{}'); + }); + + it('should overwrite a data object using set', function() { + let element = document.createElement('div'); + domData.set(element, 'value', true); + domData.set(element, 'value', 20); + let data = domData.get(element); + assert.strictEqual(data.value, 20); + }); + it('should return same data object for the same element', function() { let element = document.createElement('div'); assert.strictEqual(domData.get(element), domData.get(element)); From b7a89626ef5d89d5dc710485ec91cc8059f1fc43 Mon Sep 17 00:00:00 2001 From: Robert-Frampton Date: Fri, 1 Dec 2017 09:15:51 -0800 Subject: [PATCH 5/7] Do not modify pre-existing tests for get method --- packages/metal-dom/test/domData.js | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/metal-dom/test/domData.js b/packages/metal-dom/test/domData.js index 84bf35bb..ace108ff 100644 --- a/packages/metal-dom/test/domData.js +++ b/packages/metal-dom/test/domData.js @@ -3,11 +3,22 @@ import domData from '../src/domData'; describe('domData', function() { - it('should set data object from element', function() { - let data = domData.set(document.createElement('div')); + it('should get data object from element', function() { + let data = domData.get(document.createElement('div')); assert.ok(data); }); + it('should return same data object for the same element', function() { + let element = document.createElement('div'); + assert.strictEqual(domData.get(element), domData.get(element)); + }); + + it('should return different data objects for the different elements', function() { + let element1 = document.createElement('div'); + let element2 = document.createElement('div'); + assert.notStrictEqual(domData.get(element1), domData.get(element2)); + }); + it('should get data object from element', function() { let element = document.createElement('div'); domData.set(element, 'value', 20); @@ -36,15 +47,4 @@ describe('domData', function() { let data = domData.get(element); assert.strictEqual(data.value, 20); }); - - it('should return same data object for the same element', function() { - let element = document.createElement('div'); - assert.strictEqual(domData.get(element), domData.get(element)); - }); - - it('should return different data objects for the different elements', function() { - let element1 = document.createElement('div'); - let element2 = document.createElement('div'); - assert.notStrictEqual(domData.set(element1), domData.set(element2)); - }); }); From ffc5598bc89217f6a4e114f827e80f6a85f9866f Mon Sep 17 00:00:00 2001 From: Robert-Frampton Date: Fri, 1 Dec 2017 09:55:15 -0800 Subject: [PATCH 6/7] Make domData tests more robust --- packages/metal-dom/test/domData.js | 124 +++++++++++++++++++++-------- 1 file changed, 89 insertions(+), 35 deletions(-) diff --git a/packages/metal-dom/test/domData.js b/packages/metal-dom/test/domData.js index ace108ff..ec11e865 100644 --- a/packages/metal-dom/test/domData.js +++ b/packages/metal-dom/test/domData.js @@ -3,48 +3,102 @@ import domData from '../src/domData'; describe('domData', function() { - it('should get data object from element', function() { - let data = domData.get(document.createElement('div')); - assert.ok(data); - }); + describe('get', function() { + it('should get data object from element', function() { + let data = domData.get(document.createElement('div')); + assert.ok(data); + }); - it('should return same data object for the same element', function() { - let element = document.createElement('div'); - assert.strictEqual(domData.get(element), domData.get(element)); - }); + it('should return same data object for the same element', function() { + let element = document.createElement('div'); + assert.strictEqual(domData.get(element), domData.get(element)); + }); - it('should return different data objects for the different elements', function() { - let element1 = document.createElement('div'); - let element2 = document.createElement('div'); - assert.notStrictEqual(domData.get(element1), domData.get(element2)); - }); + it('should return different data objects for the different elements', function() { + let element1 = document.createElement('div'); + let element2 = document.createElement('div'); + assert.notStrictEqual(domData.get(element1), domData.get(element2)); + }); - it('should get data object from element', function() { - let element = document.createElement('div'); - domData.set(element, 'value', 20); - let data = domData.get(element); - assert.strictEqual(JSON.stringify(data), '{"value":20}'); - }); + it('should set initialValue only if value does not exist', function() { + let element = document.createElement('div'); + let key = domData.get(element, 'key', 'foo'); + assert.strictEqual(key, 'foo'); + + key = domData.get(element, 'key', 'bar'); + assert.strictEqual(key, 'foo'); + }); + + it('should allow initialValue to be falsy', function() { + let element = document.createElement('div'); + let key = domData.get(element, 'key', 0); + assert.strictEqual(key, 0); + + key = domData.get(element, 'key', 1); + assert.strictEqual(key, 0); + }); - it('should get data value from element', function() { - let element = document.createElement('img'); - domData.set(element, 'value', true); - let data = domData.get(element, 'value'); - assert.strictEqual(data, true); + it('should not overwrite initialValue with undefined', function() { + let element = document.createElement('div'); + let key = domData.get(element, 'key', 'foo'); + assert.strictEqual(key, 'foo'); + + key = domData.get(element, 'key'); + assert.strictEqual(key, 'foo'); + }); }); - it('should set data without a value', function() { - let element = document.createElement('div'); - domData.set(element); - let data = domData.get(element); - assert.strictEqual(JSON.stringify(data), '{}'); + describe('has', function() { + it('should return false if no data object exists', function() { + let element = document.createElement('div'); + assert.strictEqual(domData.has(element), false); + }); + + it('should return true if data object exists', function() { + let element = document.createElement('div'); + domData.get(element); + assert.strictEqual(domData.has(element), true); + }); }); - it('should overwrite a data object using set', function() { - let element = document.createElement('div'); - domData.set(element, 'value', true); - domData.set(element, 'value', 20); - let data = domData.get(element); - assert.strictEqual(data.value, 20); + describe('set', function() { + it('should get data object from element', function() { + let element = document.createElement('div'); + domData.set(element, 'value', 20); + let data = domData.get(element); + assert.deepEqual(data, { + value: 20, + }); + }); + + it('should get data value from element', function() { + let element = document.createElement('img'); + domData.set(element, 'value', true); + let data = domData.get(element, 'value'); + assert.strictEqual(data, true); + }); + + it('should create data object without a value', function() { + let element = document.createElement('div'); + domData.set(element); + let data = domData.get(element); + assert.deepEqual(data, {}); + }); + + it('should overwrite a data value using set', function() { + let element = document.createElement('div'); + domData.set(element, 'value', true); + assert.strictEqual(domData.get(element, 'value'), true); + domData.set(element, 'value', 20); + assert.strictEqual(domData.get(element, 'value'), 20); + }); + + it('should set falsy value', function() { + let element = document.createElement('div'); + domData.set(element, 'value', false); + assert.strictEqual(domData.get(element, 'value'), false); + domData.set(element, 'value', 0); + assert.strictEqual(domData.get(element, 'value'), 0); + }); }); }); From 402a12eb1c7df3a0f7b53eb378ff9eae493bd363 Mon Sep 17 00:00:00 2001 From: Robert-Frampton Date: Fri, 1 Dec 2017 09:57:14 -0800 Subject: [PATCH 7/7] Allow falsy values for domData.get --- packages/metal-dom/src/domData.js | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/packages/metal-dom/src/domData.js b/packages/metal-dom/src/domData.js index 089e7ec5..c25800ca 100644 --- a/packages/metal-dom/src/domData.js +++ b/packages/metal-dom/src/domData.js @@ -1,5 +1,7 @@ 'use strict'; +import {isDef} from 'metal'; + const METAL_DATA = '__metal_data__'; /** @@ -21,7 +23,7 @@ class domData { if (!name) { return element[METAL_DATA]; } - if (!element[METAL_DATA][name] && initialValue) { + if (!isDef(element[METAL_DATA][name]) && isDef(initialValue)) { element[METAL_DATA][name] = initialValue; } return element[METAL_DATA][name]; @@ -39,23 +41,18 @@ class domData { /** * Sets Metal.js's data for the given element. * @param {!Element} element - * @param {string=} name Optional Property from the data to be returned. - * @param {*=} value Optional value to the set the requested property - * to if it doesn't exist yet in the data. - * @return {!Object} + * @param {string=} name Property from the data to be set. + * @param {*=} value Value to be set on the element. + * @return {!Object|*} */ static set(element, name, value) { if (!element[METAL_DATA]) { element[METAL_DATA] = {}; } - if (!name || !value) { + if (!name || !isDef(value)) { return element[METAL_DATA]; } - if (!element[METAL_DATA][name] && value) { - element[METAL_DATA][name] = value; - } else if (element[METAL_DATA][name] && value) { - element[METAL_DATA][name] = value; - } + element[METAL_DATA][name] = value; return element[METAL_DATA][name]; } }