tuiHoneyPot

front and back end of my TUI honeypot
Log | Files | Refs | README

Data.js (3956B)


      1 define( [
      2 	"../core",
      3 	"../core/camelCase",
      4 	"../var/rnothtmlwhite",
      5 	"./var/acceptData"
      6 ], function( jQuery, camelCase, rnothtmlwhite, acceptData ) {
      7 
      8 "use strict";
      9 
     10 function Data() {
     11 	this.expando = jQuery.expando + Data.uid++;
     12 }
     13 
     14 Data.uid = 1;
     15 
     16 Data.prototype = {
     17 
     18 	cache: function( owner ) {
     19 
     20 		// Check if the owner object already has a cache
     21 		var value = owner[ this.expando ];
     22 
     23 		// If not, create one
     24 		if ( !value ) {
     25 			value = {};
     26 
     27 			// We can accept data for non-element nodes in modern browsers,
     28 			// but we should not, see trac-8335.
     29 			// Always return an empty object.
     30 			if ( acceptData( owner ) ) {
     31 
     32 				// If it is a node unlikely to be stringify-ed or looped over
     33 				// use plain assignment
     34 				if ( owner.nodeType ) {
     35 					owner[ this.expando ] = value;
     36 
     37 				// Otherwise secure it in a non-enumerable property
     38 				// configurable must be true to allow the property to be
     39 				// deleted when data is removed
     40 				} else {
     41 					Object.defineProperty( owner, this.expando, {
     42 						value: value,
     43 						configurable: true
     44 					} );
     45 				}
     46 			}
     47 		}
     48 
     49 		return value;
     50 	},
     51 	set: function( owner, data, value ) {
     52 		var prop,
     53 			cache = this.cache( owner );
     54 
     55 		// Handle: [ owner, key, value ] args
     56 		// Always use camelCase key (gh-2257)
     57 		if ( typeof data === "string" ) {
     58 			cache[ camelCase( data ) ] = value;
     59 
     60 		// Handle: [ owner, { properties } ] args
     61 		} else {
     62 
     63 			// Copy the properties one-by-one to the cache object
     64 			for ( prop in data ) {
     65 				cache[ camelCase( prop ) ] = data[ prop ];
     66 			}
     67 		}
     68 		return cache;
     69 	},
     70 	get: function( owner, key ) {
     71 		return key === undefined ?
     72 			this.cache( owner ) :
     73 
     74 			// Always use camelCase key (gh-2257)
     75 			owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];
     76 	},
     77 	access: function( owner, key, value ) {
     78 
     79 		// In cases where either:
     80 		//
     81 		//   1. No key was specified
     82 		//   2. A string key was specified, but no value provided
     83 		//
     84 		// Take the "read" path and allow the get method to determine
     85 		// which value to return, respectively either:
     86 		//
     87 		//   1. The entire cache object
     88 		//   2. The data stored at the key
     89 		//
     90 		if ( key === undefined ||
     91 				( ( key && typeof key === "string" ) && value === undefined ) ) {
     92 
     93 			return this.get( owner, key );
     94 		}
     95 
     96 		// When the key is not a string, or both a key and value
     97 		// are specified, set or extend (existing objects) with either:
     98 		//
     99 		//   1. An object of properties
    100 		//   2. A key and value
    101 		//
    102 		this.set( owner, key, value );
    103 
    104 		// Since the "set" path can have two possible entry points
    105 		// return the expected data based on which path was taken[*]
    106 		return value !== undefined ? value : key;
    107 	},
    108 	remove: function( owner, key ) {
    109 		var i,
    110 			cache = owner[ this.expando ];
    111 
    112 		if ( cache === undefined ) {
    113 			return;
    114 		}
    115 
    116 		if ( key !== undefined ) {
    117 
    118 			// Support array or space separated string of keys
    119 			if ( Array.isArray( key ) ) {
    120 
    121 				// If key is an array of keys...
    122 				// We always set camelCase keys, so remove that.
    123 				key = key.map( camelCase );
    124 			} else {
    125 				key = camelCase( key );
    126 
    127 				// If a key with the spaces exists, use it.
    128 				// Otherwise, create an array by matching non-whitespace
    129 				key = key in cache ?
    130 					[ key ] :
    131 					( key.match( rnothtmlwhite ) || [] );
    132 			}
    133 
    134 			i = key.length;
    135 
    136 			while ( i-- ) {
    137 				delete cache[ key[ i ] ];
    138 			}
    139 		}
    140 
    141 		// Remove the expando if there's no more data
    142 		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {
    143 
    144 			// Support: Chrome <=35 - 45
    145 			// Webkit & Blink performance suffers when deleting properties
    146 			// from DOM nodes, so set to undefined instead
    147 			// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
    148 			if ( owner.nodeType ) {
    149 				owner[ this.expando ] = undefined;
    150 			} else {
    151 				delete owner[ this.expando ];
    152 			}
    153 		}
    154 	},
    155 	hasData: function( owner ) {
    156 		var cache = owner[ this.expando ];
    157 		return cache !== undefined && !jQuery.isEmptyObject( cache );
    158 	}
    159 };
    160 
    161 return Data;
    162 } );