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