From 43832aebf407aaa029a1c5ccb6326cb2d1c83676 Mon Sep 17 00:00:00 2001 From: Wesley Mao Date: Thu, 27 Oct 2016 12:06:37 -0400 Subject: [PATCH 1/8] Data: Support object as second argument jQuery.data supports passing an object as a second argument and sets data for each entry in that object. This warns the user about each violating non-camelCase key in the object. This also adds a type check to avoid a current bug where jQuery.camelCase throws an error because a non-string is passed to it. --- src/data.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/data.js b/src/data.js index 5656f9ac..f91fa18f 100644 --- a/src/data.js +++ b/src/data.js @@ -2,9 +2,21 @@ var oldData = jQuery.data; jQuery.data = function( elem, name, value ) { var curData; + + //name can be an object, and each entry in the object is meant to be set as data + if ( name && typeof name === 'object' && arguments.length === 2 ) { + for ( var key in name ) { + if ( key !== jQuery.camelCase( key ) ){ + migrateWarn( "jQuery.data() always sets/gets camelCased names: " + key ); + } + } + + //jQuery.data will convert keys to camelCase, and this is a setter. + return oldData.apply( this, arguments ); + } // If the name is transformed, look for the un-transformed name in the data object - if ( name && name !== jQuery.camelCase( name ) ) { + if ( name && typeof name === 'string' && name !== jQuery.camelCase( name ) ) { curData = jQuery.hasData( elem ) && oldData.call( this, elem ); if ( curData && name in curData ) { migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name ); From 73ffd584e1a7bb52109631c2e98dae23d329ed6c Mon Sep 17 00:00:00 2001 From: Wesley Mao Date: Thu, 27 Oct 2016 12:11:48 -0400 Subject: [PATCH 2/8] Fix single quote to double quote --- src/data.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/data.js b/src/data.js index f91fa18f..68109abd 100644 --- a/src/data.js +++ b/src/data.js @@ -4,7 +4,7 @@ jQuery.data = function( elem, name, value ) { var curData; //name can be an object, and each entry in the object is meant to be set as data - if ( name && typeof name === 'object' && arguments.length === 2 ) { + if ( name && typeof name === "object" && arguments.length === 2 ) { for ( var key in name ) { if ( key !== jQuery.camelCase( key ) ){ migrateWarn( "jQuery.data() always sets/gets camelCased names: " + key ); @@ -16,7 +16,7 @@ jQuery.data = function( elem, name, value ) { } // If the name is transformed, look for the un-transformed name in the data object - if ( name && typeof name === 'string' && name !== jQuery.camelCase( name ) ) { + if ( name && typeof name === "string" && name !== jQuery.camelCase( name ) ) { curData = jQuery.hasData( elem ) && oldData.call( this, elem ); if ( curData && name in curData ) { migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name ); From 19a2516714d680031f819e6a2f8343e4d34466dc Mon Sep 17 00:00:00 2001 From: Wesley Mao Date: Thu, 27 Oct 2016 12:37:45 -0400 Subject: [PATCH 3/8] Fix white space --- src/data.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/data.js b/src/data.js index 68109abd..64dc7cab 100644 --- a/src/data.js +++ b/src/data.js @@ -2,16 +2,16 @@ var oldData = jQuery.data; jQuery.data = function( elem, name, value ) { var curData; - - //name can be an object, and each entry in the object is meant to be set as data + + //Name can be an object, and each entry in the object is meant to be set as data if ( name && typeof name === "object" && arguments.length === 2 ) { for ( var key in name ) { - if ( key !== jQuery.camelCase( key ) ){ + if ( key !== jQuery.camelCase( key ) ) { migrateWarn( "jQuery.data() always sets/gets camelCased names: " + key ); } } - - //jQuery.data will convert keys to camelCase, and this is a setter. + + //Original jQuery.data will convert keys to camelCase, and this is a setter. return oldData.apply( this, arguments ); } From 96c5817adbf7acffb312b5f80c33fe4559b925bc Mon Sep 17 00:00:00 2001 From: Wesley Mao Date: Thu, 27 Oct 2016 12:53:45 -0400 Subject: [PATCH 4/8] Data: Add test case for setting entire object --- test/data.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/data.js b/test/data.js index 2dd834b7..1219609d 100644 --- a/test/data.js +++ b/test/data.js @@ -37,6 +37,23 @@ test( "jQuery.data() camelCased names", function( assert ) { } ); } ); + div = document.createElement( "div" ); + + // = sames.length + diffs.length + noWarning + expectNoWarning( "Data set as an object and get without warning via API", function() { + var testData = {}; + + sames.concat( diffs ).forEach( function( name, index ) { + testData[ name ] = index; + } ); + + jQuery.data( div, testData ); + + sames.concat( diffs ).forEach( function( name, index ) { + assert.equal( jQuery.data( div, name ), index, name + "=" + index ); + } ); + } ); + // Camelized values set for all names above, get the data object curData = jQuery.data( div ); From b29c94fff7557321169a5ae1c676288a870a09d1 Mon Sep 17 00:00:00 2001 From: Wesley Mao Date: Thu, 27 Oct 2016 13:17:54 -0400 Subject: [PATCH 5/8] Data: Store non-camel data separately with its non-camel key --- src/data.js | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/data.js b/src/data.js index 64dc7cab..833a0586 100644 --- a/src/data.js +++ b/src/data.js @@ -5,14 +5,20 @@ jQuery.data = function( elem, name, value ) { //Name can be an object, and each entry in the object is meant to be set as data if ( name && typeof name === "object" && arguments.length === 2 ) { + curData = jQuery.hasData( elem ) && oldData.call( this, elem ); + var sameKeys = {}; for ( var key in name ) { if ( key !== jQuery.camelCase( key ) ) { migrateWarn( "jQuery.data() always sets/gets camelCased names: " + key ); + curData[ key ] = name[ key ]; + } else { + sameKeys[ key ] = name[ key ]; } } - //Original jQuery.data will convert keys to camelCase, and this is a setter. - return oldData.apply( this, arguments ); + oldData.call( this, elem, sameKeys ); + + return name; } // If the name is transformed, look for the un-transformed name in the data object From 4151a22e1fcfa8f8eebf6be71b9b42ad3ef2ce00 Mon Sep 17 00:00:00 2001 From: Wesley Mao Date: Thu, 27 Oct 2016 13:18:52 -0400 Subject: [PATCH 6/8] Data: use two separate test cases for sames and diffs --- test/data.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/test/data.js b/test/data.js index 1219609d..7ca68e0d 100644 --- a/test/data.js +++ b/test/data.js @@ -39,17 +39,32 @@ test( "jQuery.data() camelCased names", function( assert ) { div = document.createElement( "div" ); - // = sames.length + diffs.length + noWarning + // = sames.length + noWarning expectNoWarning( "Data set as an object and get without warning via API", function() { var testData = {}; - sames.concat( diffs ).forEach( function( name, index ) { + sames.forEach( function( name, index ) { testData[ name ] = index; } ); jQuery.data( div, testData ); - sames.concat( diffs ).forEach( function( name, index ) { + sames.forEach( function( name, index ) { + assert.equal( jQuery.data( div, name ), index, name + "=" + index ); + } ); + } ); + + // = diffs.length + noWarning + expectWarning( "Data set as an object and get without warning via API", function() { + var testData = {}; + + diffs.forEach( function( name, index ) { + testData[ name ] = index; + } ); + + jQuery.data( div, testData ); + + diffs.forEach( function( name, index ) { assert.equal( jQuery.data( div, name ), index, name + "=" + index ); } ); } ); From 6a4df76875fb631d77d0f58b7fddae72281ce122 Mon Sep 17 00:00:00 2001 From: Wesley Mao Date: Thu, 27 Oct 2016 13:40:02 -0400 Subject: [PATCH 7/8] Data: update test metadata --- test/data.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/data.js b/test/data.js index 7ca68e0d..6dbd39b0 100644 --- a/test/data.js +++ b/test/data.js @@ -16,7 +16,7 @@ test( "jQuery.data() camelCased names", function( assert ) { "-dashy-hanger" ]; - assert.expect( 16 ); + assert.expect( 27 ); var curData, div = document.createElement( "div" ); @@ -54,7 +54,7 @@ test( "jQuery.data() camelCased names", function( assert ) { } ); } ); - // = diffs.length + noWarning + // = diffs.length + warning expectWarning( "Data set as an object and get without warning via API", function() { var testData = {}; From 5fa5460f7e26a1ae60a24d72b2bba5c7c337b78d Mon Sep 17 00:00:00 2001 From: git Date: Thu, 17 Nov 2016 20:16:30 -0500 Subject: [PATCH 8/8] Data: update format and separte single and mass set test --- src/data.js | 2 +- test/data.js | 48 ++++++++++++++++++++++++++++++++++-------------- 2 files changed, 35 insertions(+), 15 deletions(-) diff --git a/src/data.js b/src/data.js index 833a0586..177af6ac 100644 --- a/src/data.js +++ b/src/data.js @@ -3,7 +3,7 @@ var oldData = jQuery.data; jQuery.data = function( elem, name, value ) { var curData; - //Name can be an object, and each entry in the object is meant to be set as data + // Name can be an object, and each entry in the object is meant to be set as data if ( name && typeof name === "object" && arguments.length === 2 ) { curData = jQuery.hasData( elem ) && oldData.call( this, elem ); var sameKeys = {}; diff --git a/test/data.js b/test/data.js index 6dbd39b0..45f7a03f 100644 --- a/test/data.js +++ b/test/data.js @@ -16,7 +16,7 @@ test( "jQuery.data() camelCased names", function( assert ) { "-dashy-hanger" ]; - assert.expect( 27 ); + assert.expect( 16 ); var curData, div = document.createElement( "div" ); @@ -37,7 +37,38 @@ test( "jQuery.data() camelCased names", function( assert ) { } ); } ); - div = document.createElement( "div" ); + // Camelized values set for all names above, get the data object + curData = jQuery.data( div ); + + // = diffs.length + warning + expectWarning( "Dashed name conflicts", diffs.length, function() { + diffs.forEach( function( name, index ) { + curData[ name ] = index; + assert.equal( jQuery.data( div, name ), curData[ name ], + name + " respects data object" ); + } ); + } ); + +} ); + +test( "jQuery.data() camelCased names (mass setter)", function( assert ) { + var sames = [ + "datum", + "ropeAdope", + "Олег\u0007Michał", + "already-Big", + "number-2", + "unidash-" + ], + diffs = [ + "dat-data", + "hangy-dasher-", + "-dashy-hanger" + ]; + + assert.expect( 11 ); + + var div = document.createElement( "div" ); // = sames.length + noWarning expectNoWarning( "Data set as an object and get without warning via API", function() { @@ -69,16 +100,5 @@ test( "jQuery.data() camelCased names", function( assert ) { } ); } ); - // Camelized values set for all names above, get the data object - curData = jQuery.data( div ); - - // = diffs.length + warning - expectWarning( "Dashed name conflicts", diffs.length, function() { - diffs.forEach( function( name, index ) { - curData[ name ] = index; - assert.equal( jQuery.data( div, name ), curData[ name ], - name + " respects data object" ); - } ); - } ); - } ); +