Merge "Support rate-limiting thumbnail generation"
[lhc/web/wiklou.git] / resources / mediawiki / mediawiki.inspect.js
1 /*!
2 * Tools for inspecting page composition and performance.
3 *
4 * @author Ori Livneh
5 * @since 1.22
6 */
7 ( function ( mw, $ ) {
8
9 /**
10 * @class mw.inspect
11 * @singleton
12 */
13 var inspect = {
14
15 /**
16 * Calculate the byte size of a ResourceLoader module.
17 *
18 * @param {string} moduleName The name of the module
19 * @return {number|null} Module size in bytes or null
20 */
21 getModuleSize: function ( moduleName ) {
22 var module = mw.loader.moduleRegistry[ moduleName ],
23 payload = 0;
24
25 if ( mw.loader.getState( moduleName ) !== 'ready' ) {
26 return null;
27 }
28
29 if ( !module.style && !module.script ) {
30 return null;
31 }
32
33 // Tally CSS
34 if ( module.style && $.isArray( module.style.css ) ) {
35 $.each( module.style.css, function ( i, stylesheet ) {
36 payload += $.byteLength( stylesheet );
37 } );
38 }
39
40 // Tally JavaScript
41 if ( $.isFunction( module.script ) ) {
42 payload += $.byteLength( module.script.toString() );
43 }
44
45 return payload;
46 },
47
48 /**
49 * Get a list of all loaded ResourceLoader modules.
50 *
51 * @return {Array} List of module names
52 */
53 getLoadedModules: function () {
54 return $.grep( mw.loader.getModuleNames(), function ( module ) {
55 return mw.loader.getState( module ) === 'ready';
56 } );
57 },
58
59 /**
60 * Print a breakdown of all loaded modules and their size in kilobytes
61 * to the debug console. Modules are ordered from largest to smallest.
62 */
63 inspectModules: function () {
64 var console = window.console;
65
66 $( function () {
67 // Map each module to a descriptor object.
68 var modules = $.map( inspect.getLoadedModules(), function ( module ) {
69 return {
70 name: module,
71 size: inspect.getModuleSize( module )
72 };
73 } );
74
75 // Sort module descriptors by size, largest first.
76 modules.sort( function ( a, b ) {
77 return b.size - a.size;
78 } );
79
80 // Convert size to human-readable string.
81 $.each( modules, function ( i, module ) {
82 module.size = module.size > 1024 ?
83 ( module.size / 1024 ).toFixed( 2 ) + ' KB' :
84 ( module.size !== null ? module.size + ' B' : null );
85 } );
86
87 if ( console ) {
88 if ( console.table ) {
89 console.table( modules );
90 } else {
91 $.each( modules, function ( i, module ) {
92 console.log( [ module.name, module.size ].join( '\t' ) );
93 } );
94 }
95 }
96 } );
97 }
98 };
99
100 if ( mw.config.get( 'debug' ) ) {
101 inspect.getModuleSize = function () { return null; };
102 mw.log( 'mw.inspect: Module sizes are not available in debug mode.' );
103 }
104
105 mw.inspect = inspect;
106
107 }( mediaWiki, jQuery ) );