Reviewers: kpreid2,
Description:
testRepeatedHandlers is occasionally flaky. I'm unable to reproduce the
flakiness, but I think it's a timing issue.
the test has a mouse event handler that uses setTimeout to call a
check function, but the test driver can click and trigger the
event handler multiple times before the setTimeout fires.
I found the existing logic pretty confusing, and I didn't see any
sensible way of fixing it as-is, so I rewrote the logic to
be more linear and avoid setTimeout.
Please review this at https://codereview.appspot.com/10572043/
Affected files:
M tests/com/google/caja/plugin/es53-test-domado-events-guest.html
Index: tests/com/google/caja/plugin/es53-test-domado-events-guest.html
===================================================================
--- tests/com/google/caja/plugin/es53-test-domado-events-guest.html
(revision 5460)
+++ tests/com/google/caja/plugin/es53-test-domado-events-guest.html
(working copy)
@@ -334,7 +334,7 @@
<p class="clickme testcontainer" id="testRepeatedHandlers">
<b id="testRepeatedHandlers-label">testRepeatedHandlers - click me
- <span id="testRepeatedHandlers-count"></span> times</b>
+ 2 times</b>
</p>
<script type="text/javascript">
jsunitRegister('testRepeatedHandlers',
@@ -342,45 +342,58 @@
// an element containing the one being clicked on
var container = document.getElementById('testRepeatedHandlers');
- // result gathering/scheduling
- var counter = document.getElementById('testRepeatedHandlers-count');
- var hits = [];
- var registeredToProceed = false;
- var listener = jsunitCallback(function listener(event) {
- hits.push([event.type, event.eventPhase]);
- if (!registeredToProceed && event.type === 'mouseup') {
- registeredToProceed = true;
- setTimeout(jsunitCallback(function() {
- registeredToProceed = false;
- fns.shift()();
- counter.textContent = fns.length;
- }), 0);
+ var events = [];
+ var record = jsunitCallback(function record(event) {
+ events.push([event.type, event.eventPhase]);
+ });
+
+ // multiple adds with identical args should be ignored
+
+ container.addEventListener('mousedown', function junk1() {}, true);
+ container.addEventListener('mousedown', record, true);
+ container.addEventListener('mousedown', function junk2() {}, true);
+ container.addEventListener('mousedown', record, true);
+
+ container.addEventListener('mousedown', record, false);
+ container.addEventListener('mousedown', function junk3() {}, false);
+ container.addEventListener('mousedown', record, false);
+ container.addEventListener('mousedown', function junk4() {}, false);
+
+ container.addEventListener('mouseup', record, true);
+ container.addEventListener('mouseup', function junk5() {}, true);
+ container.addEventListener('mouseup', record, true);
+
+ container.addEventListener('mouseup', function junk6() {}, false);
+ container.addEventListener('mouseup', record, false);
+ container.addEventListener('mouseup', record, false);
+ container.addEventListener('mouseup', function junk7() {}, false);
+
+ var clicks = 0;
+ var check = jsunitCallback(function check(event) {
+ switch (++clicks) {
+ case 1:
+ assertEquals(
+ 'first', 'mousedown,1,mousedown,3,mouseup,1,mouseup,3',
+ String(events));
+ events = [];
+ // remove one of the event listeners and check again
+ container.removeEventListener('mousedown', record, false);
+ break;
+ case 2:
+ assertEquals(
+ 'second', 'mousedown,1,mouseup,1,mouseup,3',
+ String(events));
+ events = [];
+ pass('testRepeatedHandlers');
+ container.removeEventListener('mouseup', check, false);
+ break;
+ default:
+ // ignore extra clicks
+ break;
}
});
+ container.addEventListener('mouseup', check, false);
- container.addEventListener('mousedown', function distraction() {},
true);
- container.addEventListener('mousedown', listener, true);
- container.addEventListener('mousedown', listener, true); // duplicate
noop
- container.addEventListener('mousedown', listener, false);
- container.addEventListener('mousedown', listener, false); //
duplicate noop
- container.addEventListener('mouseup', listener, true);
- container.addEventListener('mouseup', listener, false);
-
- var fns = [function() {
- // correct ordering, and no duplicates
- assertEquals('first',
- 'mousedown,1,mousedown,3,mouseup,1,mouseup,3', String(hits));
- hits = [];
- // This removeEventListener should remove only one of the four
listeners,
- // which matches the parameters exactly.
- container.removeEventListener('mousedown', listener, false);
- }, function() {
- assertEquals('second',
- 'mousedown,1,mouseup,1,mouseup,3', String(hits));
- hits = [];
- pass('testRepeatedHandlers');
- }];
- counter.textContent = fns.length;
});
</script>
--
---
You received this message because you are subscribed to the Google Groups "Google Caja Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.