mediawiki.Uri: Support names of Object prototypes as keys in query
authorFomafix <fomafix@googlemail.com>
Thu, 1 Oct 2015 18:28:45 +0000 (18:28 +0000)
committerTimo Tijhof <krinklemail@gmail.com>
Thu, 1 Oct 2015 22:39:57 +0000 (15:39 -0700)
JSHint W001 has to be disabled to avoid warnings about a key named 'hasOwnProperty'.

Bug: T114344
Change-Id: I7a58204c98d7a490906c6a23620e9f24ebb3db0a

resources/src/mediawiki/mediawiki.Uri.js
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js

index 29b224e..9d29b4c 100644 (file)
                         */
                        parse: function ( str, options ) {
                                var q, matches,
-                                       uri = this;
+                                       uri = this,
+                                       hasOwn = Object.prototype.hasOwnProperty;
 
                                // Apply parser regex and set all properties based on the result
                                matches = parser[ options.strictMode ? 'strict' : 'loose' ].exec( str );
 
                                                        // If overrideKeys, always (re)set top level value.
                                                        // If not overrideKeys but this key wasn't set before, then we set it as well.
-                                                       if ( options.overrideKeys || q[ k ] === undefined ) {
+                                                       if ( options.overrideKeys || !hasOwn.call( q, k ) ) {
                                                                q[ k ] = v;
 
                                                        // Use arrays if overrideKeys is false and key was already seen before
index 51374bd..63de2fd 100644 (file)
@@ -60,7 +60,7 @@
                } );
        } );
 
-       QUnit.test( 'Constructor( String[, Object ] )', 10, function ( assert ) {
+       QUnit.test( 'Constructor( String[, Object ] )', 11, function ( assert ) {
                var uri;
 
                uri = new mw.Uri( 'http://www.example.com/dir/?m=foo&m=bar&n=1', {
                        strictMode: false
                } );
                assert.equal( uri.toString(), 'http://example.com/bar/baz', 'normalize URI without protocol or // in loose mode' );
+
+               /*jshint -W001 */
+               uri = new mw.Uri( 'http://example.com/index.php?key=key&hasOwnProperty=hasOwnProperty&constructor=constructor&watch=watch' );
+               assert.deepEqual(
+                       uri.query,
+                       {
+                               key: 'key',
+                               constructor: 'constructor',
+                               hasOwnProperty: 'hasOwnProperty',
+                               watch: 'watch'
+                       },
+                       'Keys in query strings support names of Object prototypes (bug T114344)'
+               );
+               /*jshint +W001 */
        } );
 
        QUnit.test( 'Constructor( Object )', 3, function ( assert ) {