Bug 1440189 - part 2: Make test_assign_event_data.html aware of strict keypress event dispatching mode r?smaug draft
authorMasayuki Nakano <masayuki@d-toybox.com>
Mon, 26 Feb 2018 18:30:29 +0900
changeset 761034 6fd8d8644f7621569c12f64f01586f108197f904
parent 761033 b737a75d3299278757390ff830536652c33a4342
child 761049 dfea879a8d7ed2d875eff83f8cc141892f6a320e
push id100822
push usermasayuki@d-toybox.com
push dateWed, 28 Feb 2018 15:32:41 +0000
reviewerssmaug
bugs1440189, 1435180
milestone60.0a1
Bug 1440189 - part 2: Make test_assign_event_data.html aware of strict keypress event dispatching mode r?smaug This a remaining issue of bug 1435180. We need to skip keypress event check of non-printable key operation in the test. MozReview-Commit-ID: InobZCbrzWL
widget/tests/test_assign_event_data.html
--- a/widget/tests/test_assign_event_data.html
+++ b/widget/tests/test_assign_event_data.html
@@ -71,29 +71,34 @@
 <pre id="test">
 </pre>
 
 <script class="testbody" type="application/javascript">
 
 SimpleTest.waitForExplicitFinish();
 SimpleTest.expectAssertions(0, 34);
 
+const kStrictKeyPressEvents =
+  SpecialPowers.getBoolPref("dom.keyboardevent.keypress.dispatch_non_printable_keys_only_system_group_in_content");
+
 const kIsMac = (navigator.platform.indexOf("Mac") == 0);
 const kIsWin = (navigator.platform.indexOf("Win") == 0);
 
+var gDescription = "";
 var gEvent = null;
 var gCopiedEvent = [];
 var gCallback = null;
 var gCallPreventDefault = false;
 
 function onEvent(aEvent)
 {
   if (gCallPreventDefault) {
     aEvent.preventDefault();
   }
+  ok(gEvent === null, gDescription + `: We should receive only one event to check per test: already got: ${gEvent ? gEvent.type : "null"}, got: ${aEvent.type}`);
   gEvent = aEvent;
   for (var attr in aEvent) {
     if (!attr.match(/^[A-Z0-9_]+$/) && // ignore const attributes
         attr != "multipleActionsPrevented" && // multipleActionsPrevented isn't defined in any DOM event specs.
         typeof(aEvent[attr]) != "function") {
       gCopiedEvent.push({ name: attr, value: aEvent[attr]});
     }
   }
@@ -185,17 +190,22 @@ const kTests = [
   },
   { description: "WidgetKeyboardEvent (keypress of 'b' key with Shift)",
     targetID: "input-text", eventType: "keypress",
     dispatchEvent: function () {
       document.getElementById(this.targetID).value = "";
       document.getElementById(this.targetID).focus();
       synthesizeNativeKey(KEYBOARD_LAYOUT_EN_US, kIsWin ? WIN_VK_B : MAC_VK_ANSI_B,
                           { shiftKey: true }, "B", "B");
-      observeKeyUpOnContent(KeyboardEvent.DOM_VK_B, runNextTest);
+
+      // On Windows, synthesizeNativeKey will also fire keyup for shiftKey.
+      // We have to wait for it to prevent the key event break the next test case.
+      let waitKeyCode = _EU_isWin(window) ? KeyboardEvent.DOM_VK_SHIFT :
+                                            KeyboardEvent.DOM_VK_B;
+      observeKeyUpOnContent(waitKeyCode, runNextTest);
       return true;
     },
     canRun: function () {
       return (kIsMac || kIsWin);
     },
     todoMismatch: [],
   },
   { description: "WidgetKeyboardEvent (keypress of 'c' key with Accel)",
@@ -210,17 +220,17 @@ const kTests = [
       // (control key on Windows). We have to wait for it to prevent the key
       // event break the next test case.
       let waitKeyCode = _EU_isWin(window) ? KeyboardEvent.DOM_VK_CONTROL :
                                             KeyboardEvent.DOM_VK_C;
       observeKeyUpOnContent(waitKeyCode, runNextTest);
       return true;
     },
     canRun: function () {
-      return (kIsMac || kIsWin);
+      return !kStrictKeyPressEvents && (kIsMac || kIsWin);
     },
     todoMismatch: [],
   },
   { description: "WidgetKeyboardEvent (keyup during composition)",
     targetID: "input-text", eventType: "keyup",
     dispatchEvent: function () {
       setAndObserveCompositionPref(true, () => {
         document.getElementById(this.targetID).value = "";
@@ -671,38 +681,38 @@ function setAndObserveCompositionPref(aV
 function doTest(aTest)
 {
   if (!aTest.canRun()) {
     SimpleTest.executeSoon(runNextTest);
     return;
   }
   gEvent = null;
   gCopiedEvent = [];
+  gDescription = aTest.description + " (gCallPreventDefault=" + gCallPreventDefault + ")";
   var target = aTest.target ? aTest.target() : document.getElementById(aTest.targetID);
   target.addEventListener(aTest.eventType, onEvent, true);
   gCallback = function () {
-    var description = aTest.description + " (gCallPreventDefault=" + gCallPreventDefault + ")";
     target.removeEventListener(aTest.eventType, onEvent, true);
-    ok(gEvent !== null, description + ": failed to get duplicated event");
-    ok(gCopiedEvent.length > 0, description + ": count of attribute of the event must be larger than 0");
+    ok(gEvent !== null, gDescription + ": failed to get duplicated event");
+    ok(gCopiedEvent.length > 0, gDescription + ": count of attribute of the event must be larger than 0");
     for (var i = 0; i < gCopiedEvent.length; ++i) {
       var name = gCopiedEvent[i].name;
       if (name == "rangeOffset") {
-        todo(false, description + ": " + name + " attribute value is never reset (" + gEvent[name] + ")");
+        todo(false, gDescription + ": " + name + " attribute value is never reset (" + gEvent[name] + ")");
       } else if (name == "eventPhase") {
-        is(gEvent[name], 0, description + ": mismatch with fixed value (" + name + ")");
+        is(gEvent[name], 0, gDescription + ": mismatch with fixed value (" + name + ")");
       } else if (name == "rangeParent" || name == "currentTarget") {
-        is(gEvent[name], null, description + ": mismatch with fixed value (" + name + ")");
+        is(gEvent[name], null, gDescription + ": mismatch with fixed value (" + name + ")");
       } else if (aTest.todoMismatch.includes(name)) {
-        todo_is(gEvent[name], gCopiedEvent[i].value, description + ": mismatch (" + name + ")");
+        todo_is(gEvent[name], gCopiedEvent[i].value, gDescription + ": mismatch (" + name + ")");
       } else if (name == "offsetX" || name == "offsetY") {
         // do nothing; these are defined to return different values during event dispatch
         // vs not during event dispatch
       } else {
-        is(gEvent[name], gCopiedEvent[i].value, description + ": mismatch (" + name + ")");
+        is(gEvent[name], gCopiedEvent[i].value, gDescription + ": mismatch (" + name + ")");
       }
     }
     if (!testWillCallRunNextTest) {
       runNextTest();
     }
   };
   var testWillCallRunNextTest = aTest.dispatchEvent();
 }