WICKET-5381 Add Wicket.Event.unsubscribe method Additionally update Grunt configs (copy from master branch) to be able to run the tests
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/a75b8a95 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/a75b8a95 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/a75b8a95 Branch: refs/heads/wicket-6.x Commit: a75b8a95b49fede5a8dc2077a205b68e724e868e Parents: 9a85319 Author: Martin Tzvetanov Grigorov <[email protected]> Authored: Mon Sep 30 14:59:30 2013 +0200 Committer: Martin Tzvetanov Grigorov <[email protected]> Committed: Mon Sep 30 14:59:30 2013 +0200 ---------------------------------------------------------------------- Gruntfile.js | 137 +++++++++++++++++++ grunt.js | 108 --------------- package.json | 11 ++ .../wicket/ajax/res/js/wicket-event-jquery.js | 19 +++ wicket-core/src/test/js/ajax.js | 14 +- wicket-core/src/test/js/event.js | 67 +++++++++ 6 files changed, 241 insertions(+), 115 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/a75b8a95/Gruntfile.js ---------------------------------------------------------------------- diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 0000000..127d429 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,137 @@ +/* + * Grunt.js is a tool for automated JavaScript development + * https://github.com/cowboy/grunt + * + * To use it: + * 1) install node.js - http://nodejs.org/#download. This will install 'npm' (Node Package Manager) too + * 2) install grunt - 'npm -g install grunt-cli' + * 3) run: npm install (This will use package.json and install all dependencies) + * 4.1) grunt jshint - checks all JavaScript files with JSHint + * 4.2) grunt jshint:core - checks only the files in wicket-core + * 4.3) grunt test - starts a web server and runs all tests (Ajax, non-Ajax and AMD) + */ + + /*global module: true */ + +module.exports = function(grunt) { + "use strict"; + + var + coreJs = [ + 'wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-event-jquery.js', + 'wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js', + 'wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js', + "wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckSelector.js", + "wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.js", + "wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormChoiceComponentUpdatingBehavior.js" + ], + extensionsJs = [ + "wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js", + "wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/palette/palette.js", + "wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/tree/res/tree.js", + "wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js", + "wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/res/modal.js", + "wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/repeater/data/table/filter/wicket-filterform.js" + ], + datetimeJs = [ + "wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/wicket-date.js" + ], + nativeWebSocketJs = [ + "wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-jquery.js" + ], + atmosphereJs = [ + "wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/jquery.wicketatmosphere.js" + ], + testsJs = [ + "./wicket-core/src/test/js/ajax.js", + "./wicket-core/src/test/js/head.js", + "./wicket-core/src/test/js/form.js", + "./wicket-core/src/test/js/dom.js", + "./wicket-core/src/test/js/channels.js", + "./wicket-core/src/test/js/event.js", + "./wicket-core/src/test/js/amd.js" + ], + gruntJs = [ + "Gruntfile.js" + ]; + + // Project configuration. + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + + jshint: { + core: coreJs, + extensions: extensionsJs, + datetime: datetimeJs, + nativeWebSocket: nativeWebSocketJs, + atmosphere: atmosphereJs, + testsJs: testsJs, + grunt: gruntJs, + + options: { + "boss": true, + "browser": true, + "curly": true, + "eqnull": true, + "eqeqeq": true, + "expr": true, + "evil": true, + "jquery": true, + "latedef": true, + "noarg": true, + "onevar": false, + "smarttabs": true, + "trailing": true, + "undef": true, + "strict": true, + "predef": [ + "Wicket" + ] + } + }, + + qunit: { + /* + * Runs all tests (w/ ajax). + * See ajax.js header for details how to setup it. + */ + all: { + options: { + urls: ['http://localhost:38888/test/js/all.html'] + } + }, + + /** + * Run Asynchronous module definition tests + */ + amd: { + options: { + urls: ['http://localhost:38888/test/js/amd.html'] + } + }, + + /* + * Runs only local tests (w/o ajax ones). + */ + local: ['wicket-core/src/test/js/all.html'] + }, + + connect: { + server: { + options: { + port: 38888, + base: './wicket-core/src' + } + } + } + }); + + grunt.loadNpmTasks('grunt-contrib-qunit'); + grunt.loadNpmTasks('grunt-contrib-jshint'); + + // This plugin provides the "connect" task - starts a web server for the Ajax tests. + grunt.loadNpmTasks('grunt-contrib-connect'); + + // A convenient task alias. + grunt.registerTask('test', ['connect', 'qunit']); +}; http://git-wip-us.apache.org/repos/asf/wicket/blob/a75b8a95/grunt.js ---------------------------------------------------------------------- diff --git a/grunt.js b/grunt.js deleted file mode 100644 index 0fea7d0..0000000 --- a/grunt.js +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Grunt.js is a tool for automated JavaScript development - * https://github.com/cowboy/grunt - * - * To use it: - * 1) install node.js - http://nodejs.org/#download. This will install 'npm' (Node Package Manager) too - * 2) install phantomjs - http://code.google.com/p/phantomjs/downloads/list - * 3) install grunt - 'npm -g install grunt' - * 4) run it: grunt lint, grunt lint:core, grunt qunit, grunt qunit:local - */ - - /*global module: true */ -module.exports = function(grunt) { - "use strict"; - - var - coreJs = [ - 'wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-event-jquery.js', - 'wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery-debug.js', - 'wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-ajax-jquery.js', - "wicket-core/src/main/java/org/apache/wicket/markup/html/form/CheckSelector.js", - "wicket-core/src/main/java/org/apache/wicket/markup/html/form/upload/MultiFileUploadField.js", - "wicket-core/src/main/java/org/apache/wicket/ajax/form/AjaxFormChoiceComponentUpdatingBehavior.js" - ], - extensionsJs = [ - "wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/form/upload/progressbar.js", - "wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/palette/palette.js", - "wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/tree/res/tree.js", - "wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/autocomplete/wicket-autocomplete.js", - "wicket-extensions/src/main/java/org/apache/wicket/extensions/ajax/markup/html/modal/res/modal.js", - "wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/repeater/data/table/filter/wicket-filterform.js" - ], - datetimeJs = [ - "wicket-datetime/src/main/java/org/apache/wicket/extensions/yui/calendar/wicket-date.js" - ], - nativeWebSocketJs = [ - "wicket-experimental/wicket-native-websocket/wicket-native-websocket-core/src/main/java/org/apache/wicket/protocol/ws/api/res/js/wicket-websocket-jquery.js" - ], - atmosphereJs = [ - "wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/jquery.wicketatmosphere.js" - ], - testsJs = [ - "./wicket-core/src/test/js/ajax.js", - "./wicket-core/src/test/js/head.js", - "./wicket-core/src/test/js/form.js", - "./wicket-core/src/test/js/dom.js", - "./wicket-core/src/test/js/channels.js", - "./wicket-core/src/test/js/event.js", - "./wicket-core/src/test/js/amd.js" - ], - gruntJs = [ - "grunt.js" - ]; - - // Project configuration. - grunt.initConfig({ - lint: { - core: coreJs, - extensions: extensionsJs, - datetime: datetimeJs, - nativeWebSocket: nativeWebSocketJs, - atmosphere: atmosphereJs, - testsJs: testsJs, - grunt: gruntJs - }, - - jshint: { - options: { - "boss": true, - "browser": true, - "curly": true, - "eqnull": true, - "eqeqeq": true, - "expr": true, - "evil": true, - "jquery": true, - "latedef": true, - "noarg": true, - "onevar": false, - "smarttabs": true, - "trailing": true, - "undef": true, - "strict": true, - "predef": [ - "Wicket" - ] - } - }, - - qunit: { - /* - * Runs all tests (w/ ajax). - * See ajax.js header for details how to setup it. - */ - index: ['http://localhost/ajax-tests/test/js/all.html'], - - /** - * Run Asynchronous module definition tests - */ - amd: ['http://localhost/ajax-tests/test/js/amd.html'], - - /* - * Runs only local tests (w/o ajax ones). - */ - local: ['wicket-core/src/test/js/all.html'] - } - }); -}; http://git-wip-us.apache.org/repos/asf/wicket/blob/a75b8a95/package.json ---------------------------------------------------------------------- diff --git a/package.json b/package.json new file mode 100644 index 0000000..e934c12 --- /dev/null +++ b/package.json @@ -0,0 +1,11 @@ +{ + "name": "wicket-js-unit-tests", + "version": "0.1.0", + "devDependencies": { + "grunt": "~0.4.1", + "grunt-contrib-jshint": "~0.6.4", + "grunt-contrib-qunit": "~0.3.0", + "grunt-contrib-connect": "~0.5.0", + "grunt-contrib-nodeunit": "~0.2.1" + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/a75b8a95/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-event-jquery.js ---------------------------------------------------------------------- diff --git a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-event-jquery.js b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-event-jquery.js index 12cb75e..bfe9c28 100644 --- a/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-event-jquery.js +++ b/wicket-core/src/main/java/org/apache/wicket/ajax/res/js/wicket-event-jquery.js @@ -177,6 +177,25 @@ }, /** + * Un-subscribes a subscriber from a topic. + * @param topic {String} - the topic name. If omitted un-subscribes all + * subscribers from all topics + * @param subscriber {Function} - the handler to un-subscribe. If omitted then + * all subscribers are removed from this topic + */ + unsubscribe: function(topic, subscriber) { + if (topic) { + if (subscriber) { + jQuery(document).off(topic, subscriber); + } else { + jQuery(document).off(topic); + } + } else { + jQuery(document).off(); + } + }, + + /** * Sends a notification to all subscribers for the given topic. * Subscribers for topic '*' receive the actual topic as first parameter, * otherwise the topic is not passed to subscribers which listen for specific http://git-wip-us.apache.org/repos/asf/wicket/blob/a75b8a95/wicket-core/src/test/js/ajax.js ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/js/ajax.js b/wicket-core/src/test/js/ajax.js index 26bc90f..204b170 100644 --- a/wicket-core/src/test/js/ajax.js +++ b/wicket-core/src/test/js/ajax.js @@ -69,7 +69,7 @@ jQuery(document).ready(function() { module('Wicket.Ajax', { setup: function() { // unsubscribe all global listeners - jQuery(document).off(); + Wicket.Event.unsubscribe(); } }); @@ -512,7 +512,7 @@ jQuery(document).ready(function() { equal(attrs.u, attributes.u, 'Complete: attrs'); // unregister all subscribers - jQuery(document).off(); + Wicket.Event.unsubscribe(); }); Wicket.Ajax.ajax(attrs); @@ -561,7 +561,7 @@ jQuery(document).ready(function() { equal(attrs.u, attributes.u, 'Complete: attrs'); // unregister all subscribers - jQuery(document).off(); + Wicket.Event.unsubscribe(); }); Wicket.Ajax.ajax(attrs); @@ -661,7 +661,7 @@ jQuery(document).ready(function() { ok(settings.url.indexOf('two=2') > 0, 'Parameter "two" with value "2" is found'); start(); - jQuery(document).off(); + Wicket.Event.unsubscribe(); }); Wicket.Ajax.ajax(attrs); @@ -698,7 +698,7 @@ jQuery(document).ready(function() { ok(settings.data.indexOf('one=dynamic2') > -1, 'Parameter "one" with value "dynamic2" is found'); start(); - jQuery(document).off(); + Wicket.Event.unsubscribe(); }); Wicket.Ajax.ajax(attrs); @@ -836,7 +836,7 @@ jQuery(document).ready(function() { if (attrs.event.extraData.round === 2) { // unregister all global subscribers - jQuery(document).off(); + Wicket.Event.unsubscribe(); jQuery(window).off("event1"); start(); @@ -943,7 +943,7 @@ jQuery(document).ready(function() { if (attrs.event.extraData.round === 2) { // unregister all global subscribers - jQuery(document).off(); + Wicket.Event.unsubscribe(); jQuery(window).off("event1"); http://git-wip-us.apache.org/repos/asf/wicket/blob/a75b8a95/wicket-core/src/test/js/event.js ---------------------------------------------------------------------- diff --git a/wicket-core/src/test/js/event.js b/wicket-core/src/test/js/event.js index 84b9a74..17dc9ca 100644 --- a/wicket-core/src/test/js/event.js +++ b/wicket-core/src/test/js/event.js @@ -218,6 +218,73 @@ jQuery(document).ready(function() { Wicket.Event.publish('topicName'); }); + test('unsubscribe a signle subscriber', function() { + expect(2); + + var topic = "someTopicName"; + + var subscriber = function() { + ok(true, "The subscriber is notified"); + }; + + Wicket.Event.subscribe(topic, subscriber); + + Wicket.Event.publish(topic); + + Wicket.Event.unsubscribe(topic, subscriber); + ok(true, "The subscriber is un-subscribed") + + Wicket.Event.publish(topic); + }); + + test('unsubscribe all subscribers per topic', function() { + expect(3); + + var topic = "someTopicName"; + + var subscriber1 = function() { + ok(true, "Subscriber 1 is notified"); + }; + + var subscriber2 = function() { + ok(true, "Subscriber 2 is notified"); + }; + + Wicket.Event.subscribe(topic, subscriber1); + Wicket.Event.subscribe(topic, subscriber2); + + Wicket.Event.publish(topic); + + Wicket.Event.unsubscribe(topic); + ok(true, "The subscribers are un-subscribed") + + Wicket.Event.publish(topic); + }); + + test('unsubscribe all subscribers (for all topics)', function() { + expect(3); + + var topic = "someTopicName"; + + var subscriber1 = function() { + ok(true, "Subscriber 1 is notified"); + }; + + var subscriber2 = function() { + ok(true, "Subscriber 2 is notified"); + }; + + Wicket.Event.subscribe(topic, subscriber1); + Wicket.Event.subscribe(topic, subscriber2); + + Wicket.Event.publish(topic); + + Wicket.Event.unsubscribe(); + ok(true, "The subscribers are un-subscribed") + + Wicket.Event.publish(topic); + }); + test('all topics', function() { expect(8);
