mediawiki.inspect: Fix exception when calling mw.inspect() a second time
authorTimo Tijhof <krinklemail@gmail.com>
Tue, 26 Jun 2018 17:22:26 +0000 (18:22 +0100)
committerTimo Tijhof <krinklemail@gmail.com>
Tue, 26 Jun 2018 17:22:26 +0000 (18:22 +0100)
In mediawiki.js, the mw.inspect() method is defined to lazy-load the
'mediawiki.inspect' module, and then call mw.inspect.runReports().

The problem is that, mediawiki.inspect.js, re-creates mw.inspect as a plain
object, which blows away the mw.inspect() function that was there.

Calling it a second time threw "TypeError: inspect is not a function".

Fix this by making mediawiki.inspect.js extend the function object,
instead of re-defining it.

Bug: T197810
Change-Id: I61aa965f3e1fd0a1c9f9d98310632b4a8d5e1683

resources/src/mediawiki.inspect.js

index cf94083..e2030c9 100644 (file)
@@ -1,5 +1,5 @@
 /*!
- * Tools for inspecting page composition and performance.
+ * The mediawiki.inspect module.
  *
  * @author Ori Livneh
  * @since 1.22
@@ -9,7 +9,19 @@
 
 ( function ( mw, $ ) {
 
-       var inspect,
+       // mw.inspect is a singleton class with static methods
+       // that itself can also be invoked as a function (mediawiki.base/mw#inspect).
+       // In JavaScript, that is implemented by starting with a function,
+       // and subsequently setting additional properties on the function object.
+
+       /**
+        * Tools for inspecting page composition and performance.
+        *
+        * @class mw.inspect
+        * @singleton
+        */
+
+       var inspect = mw.inspect,
                byteLength = require( 'mediawiki.String' ).byteLength,
                hasOwn = Object.prototype.hasOwnProperty;
 
                return bytes.toFixed( i > 0 ? 1 : 0 ) + units[ i ];
        }
 
-       /**
-        * @class mw.inspect
-        * @singleton
-        */
-       inspect = {};
-
        /**
         * Return a map of all dependency relationships between loaded modules.
         *
                mw.log( 'mw.inspect: reports are not available in debug mode.' );
        }
 
-       mw.inspect = inspect;
-
 }( mediaWiki, jQuery ) );