aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRick Waldron <waldron.rick@gmail.com>2013-03-03 19:40:33 -0500
committerRick Waldron <waldron.rick@gmail.com>2013-03-03 19:40:33 -0500
commit692afbcc5f719392c729997eacb234c07d2a6c78 (patch)
treefe06fe3e0fe6b75a06097d3007446701300272b4
parent91824bd2923b99b03fd1a9c4447b46fd7cc96615 (diff)
downloadjquery-692afbcc5f719392c729997eacb234c07d2a6c78.tar.gz
jquery-692afbcc5f719392c729997eacb234c07d2a6c78.zip
Fixes #13551. Guard against illegal data access by undefined elem-owner
Signed-off-by: Rick Waldron <waldron.rick@gmail.com>
-rw-r--r--src/data.js11
-rw-r--r--test/unit/data.js11
2 files changed, 18 insertions, 4 deletions
diff --git a/src/data.js b/src/data.js
index 63796c5ba..dfd8555a0 100644
--- a/src/data.js
+++ b/src/data.js
@@ -85,7 +85,7 @@ Data.prototype = {
// Either a valid cache is found, or will be created.
// New caches will be created and the unlock returned,
// allowing direct access to the newly created
- // empty data object.
+ // empty data object. A valid owner object must be provided.
var cache = this.cache[ this.key( owner ) ];
return key === undefined ?
@@ -255,9 +255,12 @@ jQuery.fn.extend({
var data,
camelKey = jQuery.camelCase( key );
- // Get the Data...
- if ( value === undefined ) {
-
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[0]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[0] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if ( elem && value === undefined ) {
// Attempt to get data from the cache
// with the key as-is
data = data_user.get( elem, key );
diff --git a/test/unit/data.js b/test/unit/data.js
index d6f979984..72e55e15e 100644
--- a/test/unit/data.js
+++ b/test/unit/data.js
@@ -670,3 +670,14 @@ test( "JSON data- attributes can have newlines", function() {
equal( x.data("some").foo, "bar", "got a JSON data- attribute with spaces" );
x.remove();
});
+
+test(".data doesn't throw when calling selection is empty. #13551", function() {
+ expect(1);
+
+ try {
+ jQuery( null ).data( "prop" );
+ ok( true, "jQuery(null).data('prop') does not throw" );
+ } catch ( e ) {
+ ok( false, e.message );
+ }
+});