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.


Reply via email to