From c81561b3fc918d6058d0de96ddc56819f8d05de8 Mon Sep 17 00:00:00 2001 From: "Amir E. Aharoni" Date: Sat, 14 Mar 2015 23:20:09 +0200 Subject: [PATCH] Refactor the object keys counter function --- src/jquery.uls.core.js | 45 +++++++++++++++++++++++++++-------------- src/jquery.uls.lcd.js | 17 ++-------------- test/jquery.uls.test.js | 21 +++++++++++++++++++ 3 files changed, 53 insertions(+), 30 deletions(-) diff --git a/src/jquery.uls.core.js b/src/jquery.uls.core.js index fba4859..c8e9bf0 100644 --- a/src/jquery.uls.core.js +++ b/src/jquery.uls.core.js @@ -53,6 +53,34 @@ '; /*jshint multistr:false */ + $.uls = $.uls || {}; + + $.uls.utils = {}; + + /** + * Count the number of keys in an object. + * Works in a cross-browser way. + * @param {Object} The object. + */ + $.uls.utils.objectLength = function ( obj ) { + var count, key; + + // Some old browsers don't support Object.keys + if ( Object.keys ) { + return Object.keys( obj ).length; + } + + count = 0; + + for ( key in obj ) { + if ( Object.prototype.hasOwnProperty.call( obj, key ) ) { + count++; + } + } + + return count; + }; + /** * ULS Public class definition */ @@ -354,26 +382,13 @@ * @return string */ getMenuWidth: function () { - var language, - languagesCount = 0; + var languagesCount; if ( this.options.menuWidth ) { return this.options.menuWidth; } - // IE8 does not support Object.keys - if ( Object.keys ) { - languagesCount = Object.keys( this.options.languages ).length; - } else { - for ( language in this.options.languages ) { - if ( Object.prototype.hasOwnProperty.call( - this.options.languages, - language - ) ) { - languagesCount++; - } - } - } + languagesCount = $.uls.utils.objectLength( this.options.languages ); if ( languagesCount < 12 ) { return 'narrow'; diff --git a/src/jquery.uls.lcd.js b/src/jquery.uls.lcd.js index 84e2f24..2ebefef 100644 --- a/src/jquery.uls.lcd.js +++ b/src/jquery.uls.lcd.js @@ -115,8 +115,7 @@ render: function () { var $section, - language, - languagesCount = 0, + languagesCount, lcd = this, regions = [], regionNames = { @@ -131,19 +130,7 @@ PA: 'Pacific' }; - // IE8 does not support Object.keys - if ( Object.keys ) { - languagesCount = Object.keys( this.options.languages ).length; - } else { - for ( language in this.options.languages ) { - if ( Object.prototype.hasOwnProperty.call( - this.options.languages, - language - ) ) { - languagesCount++; - } - } - } + languagesCount = $.uls.utils.objectLength( this.options.languages ); // Show the Common languages section, unless the list is very short if ( languagesCount > 12 ) { diff --git a/test/jquery.uls.test.js b/test/jquery.uls.test.js index c3bbf1c..8721cf9 100644 --- a/test/jquery.uls.test.js +++ b/test/jquery.uls.test.js @@ -272,4 +272,25 @@ assert.ok( !$.uls.data.deleteLanguage( 'qqr' ), 'Deleting language qqr, which was never added, returns false.' ); } ); + test( '-- $.uls.utils testing', 4, function ( assert ) { + var languages, saveObjectKeys; + + languages = { + mn: 'монгол', + sah: 'саха', + udm: 'удмурт' + }; + + assert.strictEqual( $.uls.utils.objectLength( {} ), 0 ); + assert.strictEqual( $.uls.utils.objectLength( languages ), 3 ); + + // Simulate a browser without Object.keys + saveObjectKeys = Object.keys; + Object.keys = undefined; + + assert.strictEqual( $.uls.utils.objectLength( {} ), 0 ); + assert.strictEqual( $.uls.utils.objectLength( languages ), 3 ); + + Object.keys = saveObjectKeys; + } ); }( jQuery ) );