Krinkle has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/56762


Change subject: Implement mw.hook framework.
......................................................................

Implement mw.hook framework.

Bug: 23580
Bug: 30713
Change-Id: Ic73a3efe53d6fb731e7f1e531d5f51530cd7e4fe
---
M maintenance/jsduck/categories.json
M resources/mediawiki/mediawiki.js
M resources/mediawiki/mediawiki.util.js
3 files changed, 58 insertions(+), 2 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/62/56762/1

diff --git a/maintenance/jsduck/categories.json 
b/maintenance/jsduck/categories.json
index c29c91c..f20289e 100644
--- a/maintenance/jsduck/categories.json
+++ b/maintenance/jsduck/categories.json
@@ -11,7 +11,8 @@
                                        "mw.loader",
                                        "mw.html",
                                        "mw.html.Cdata",
-                                       "mw.html.Raw"
+                                       "mw.html.Raw",
+                                       "mw.hook"
                                ]
                        },
                        {
diff --git a/resources/mediawiki/mediawiki.js b/resources/mediawiki/mediawiki.js
index d1cb41d..9ee1a25 100644
--- a/resources/mediawiki/mediawiki.js
+++ b/resources/mediawiki/mediawiki.js
@@ -1688,7 +1688,60 @@
                user: {
                        options: new Map(),
                        tokens: new Map()
-               }
+               },
+
+               /**
+                * Registry and firing of events.
+                *
+                * Example usage:
+                *
+                *     mw.hook.on( 'wikipage.content', fn );
+                *     mw.hook.off( 'wikipage.content', fn );
+                *     mw.hook.emit( 'wikipage.content', $content );
+                *
+                * Handlers can be bound and triggered for arbitrary event 
names at any time. The same event
+                * can be triggered multiple times. The last trigger of an 
event is memorized
+                * (similar to `$(document).ready` and `$.Deferred().done`).
+                * This means if an event is emitted, and a handler registered 
afterwards, it'll be
+                * fired right away with the last given event data.
+                *
+                * @class mw.hook
+                * @singleton
+                */
+               hook: ( function () {
+                       var lists = {};
+                       return {
+                               /**
+                                * Register a hook handler
+                                * @param {string} name Name of hook.
+                                * @param {Function} handler Function to bind.
+                                */
+                               on: function ( name, handler ) {
+                                       var list = lists[name] || ( lists[name] 
= $.Callback( 'memory') );
+                                       list.add( handler );
+                               },
+                               /**
+                                * Unregister a hook handler
+                                * @param {string} name Name of hook.
+                                * @param {Function} handler Function to unbind.
+                                */
+                               off: function ( name, handler ) {
+                                       var list = lists[name];
+                                       if ( list ) {
+                                               list.remove( handler );
+                                       }
+                               },
+                               /**
+                                * Run a hook.
+                                * @param {string} name Name of hook.
+                                * @param {Mixed...} data
+                                */
+                               emit: function ( name ) {
+                                       var list = lists[name] || ( lists[name] 
= $.Callback( 'memory') );
+                                       list.fireWith( null, slice.call( 
arguments, 1 ) );
+                               }
+                       };
+               }() )
        };
 
 }( jQuery ) );
diff --git a/resources/mediawiki/mediawiki.util.js 
b/resources/mediawiki/mediawiki.util.js
index 5211b0d..a23cc60 100644
--- a/resources/mediawiki/mediawiki.util.js
+++ b/resources/mediawiki/mediawiki.util.js
@@ -104,6 +104,8 @@
                                return util.$content;
                        } )();
 
+                       mw.hook.emit( 'wikipage.content', util.$content );
+
                        // Table of contents toggle
                        $tocTitle = $( '#toctitle' );
                        $tocToggleLink = $( '#togglelink' );

-- 
To view, visit https://gerrit.wikimedia.org/r/56762
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ic73a3efe53d6fb731e7f1e531d5f51530cd7e4fe
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Krinkle <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to