aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVojta Jina2011-08-30 13:14:55 +0200
committerVojta Jina2011-09-08 23:00:59 +0200
commit66dec7755573a1c07a1fe8e0dd9bc5fc51dbaac9 (patch)
treedcdefd40fc34251dbc704808ce20396b1453b371
parent8fa79066e2cea470086769aa59e7cc9d3aa30d81 (diff)
downloadangular.js-66dec7755573a1c07a1fe8e0dd9bc5fc51dbaac9.tar.bz2
fix(scenario): do not navigate if click event was cancelled
This is jQuery incompatible hack. But we were doing monkey patching there anyway... `$(...).trigger('click')` returns an array of return values, so that scenario runner knows, whether the event default action was cancelled. Without this fix, scenario runner was doing navigation even if JS code called `event.preventDefault()`. Note, this does not work in FF6
-rw-r--r--src/scenario/Scenario.js9
-rw-r--r--src/scenario/dsl.js5
-rw-r--r--test/scenario/dslSpec.js14
3 files changed, 24 insertions, 4 deletions
diff --git a/src/scenario/Scenario.js b/src/scenario/Scenario.js
index 149a0f09..420345f6 100644
--- a/src/scenario/Scenario.js
+++ b/src/scenario/Scenario.js
@@ -298,9 +298,14 @@ function browserTrigger(element, type) {
var parentTrigger = fn.trigger;
fn.trigger = function(type) {
if (/(click|change|keydown)/.test(type)) {
- return this.each(function(index, node) {
- browserTrigger(node, type);
+ var processDefaults = [];
+ this.each(function(index, node) {
+ processDefaults.push(browserTrigger(node, type));
});
+
+ // this is not compatible with jQuery - we return an array of returned values,
+ // so that scenario runner know whether JS code has preventDefault() of the event or not...
+ return processDefaults;
}
return parentTrigger.apply(this, arguments);
};
diff --git a/src/scenario/dsl.js b/src/scenario/dsl.js
index 2190f7f7..946f56d3 100644
--- a/src/scenario/dsl.js
+++ b/src/scenario/dsl.js
@@ -323,8 +323,9 @@ angular.scenario.dsl('element', function() {
return this.addFutureAction("element '" + this.label + "' click", function($window, $document, done) {
var elements = $document.elements();
var href = elements.attr('href');
- elements.trigger('click');
- if (href && elements[0].nodeName.toUpperCase() === 'A') {
+ var eventProcessDefault = elements.trigger('click')[0];
+
+ if (href && elements[0].nodeName.toUpperCase() === 'A' && eventProcessDefault) {
this.application.navigateTo(href, function() {
done();
}, done);
diff --git a/test/scenario/dslSpec.js b/test/scenario/dslSpec.js
index 5485fe52..8e22e469 100644
--- a/test/scenario/dslSpec.js
+++ b/test/scenario/dslSpec.js
@@ -250,6 +250,20 @@ describe("angular.scenario.dsl", function() {
expect($window.location).toMatch(/#foo$/);
});
+ it('should not navigate if click event was cancelled', function() {
+ var initLocation = $window.location,
+ elm = jqLite('<a href="#foo"></a>');
+
+ doc.append(elm);
+ elm.bind('click', function(event) {
+ event.preventDefault();
+ });
+
+ $root.dsl.element('a').click();
+ expect($window.location).toBe(initLocation);
+ dealoc(elm);
+ });
+
it('should count matching elements', function() {
doc.append('<span></span><span></span>');
$root.dsl.element('span').count();