michael@0: function test() michael@0: { michael@0: const kPrefName_AutoScroll = "general.autoScroll"; michael@0: Services.prefs.setBoolPref(kPrefName_AutoScroll, true); michael@0: michael@0: gBrowser.selectedTab = gBrowser.addTab(); michael@0: michael@0: const kNoKeyEvents = 0; michael@0: const kKeyDownEvent = 1; michael@0: const kKeyPressEvent = 2; michael@0: const kKeyUpEvent = 4; michael@0: const kAllKeyEvents = 7; michael@0: michael@0: var expectedKeyEvents; michael@0: var dispatchedKeyEvents; michael@0: var key; michael@0: var root; michael@0: michael@0: /** michael@0: * Encapsulates EventUtils.sendChar(). michael@0: */ michael@0: function sendChar(aChar) michael@0: { michael@0: key = aChar; michael@0: dispatchedKeyEvents = kNoKeyEvents; michael@0: EventUtils.sendChar(key, gBrowser.contentWindow); michael@0: is(dispatchedKeyEvents, expectedKeyEvents, michael@0: "unexpected key events were dispatched or not dispatched: " + key); michael@0: } michael@0: michael@0: /** michael@0: * Encapsulates EventUtils.sendKey(). michael@0: */ michael@0: function sendKey(aKey) michael@0: { michael@0: key = aKey; michael@0: dispatchedKeyEvents = kNoKeyEvents; michael@0: EventUtils.sendKey(key, gBrowser.contentWindow); michael@0: is(dispatchedKeyEvents, expectedKeyEvents, michael@0: "unexpected key events were dispatched or not dispatched: " + key); michael@0: } michael@0: michael@0: function onKey(aEvent) michael@0: { michael@0: if (aEvent.target != root && aEvent.target != root.ownerDocument.body) { michael@0: ok(false, "unknown target: " + aEvent.target.tagName); michael@0: return; michael@0: } michael@0: michael@0: var keyFlag; michael@0: switch (aEvent.type) { michael@0: case "keydown": michael@0: keyFlag = kKeyDownEvent; michael@0: break; michael@0: case "keypress": michael@0: keyFlag = kKeyPressEvent; michael@0: break; michael@0: case "keyup": michael@0: keyFlag = kKeyUpEvent; michael@0: break; michael@0: default: michael@0: ok(false, "Unknown events: " + aEvent.type); michael@0: return; michael@0: } michael@0: dispatchedKeyEvents |= keyFlag; michael@0: is(keyFlag, expectedKeyEvents & keyFlag, aEvent.type + " fired: " + key); michael@0: } michael@0: michael@0: waitForExplicitFinish(); michael@0: gBrowser.selectedBrowser.addEventListener("pageshow", onLoad, false); michael@0: var dataUri = 'data:text/html,'; michael@0: gBrowser.loadURI(dataUri); michael@0: michael@0: function onLoad() { michael@0: gBrowser.selectedBrowser.removeEventListener("pageshow", onLoad, false); michael@0: waitForFocus(onFocus, content); michael@0: } michael@0: michael@0: function onFocus() { michael@0: var doc = gBrowser.contentDocument; michael@0: michael@0: root = doc.documentElement; michael@0: root.addEventListener("keydown", onKey, true); michael@0: root.addEventListener("keypress", onKey, true); michael@0: root.addEventListener("keyup", onKey, true); michael@0: michael@0: // Test whether the key events are handled correctly under normal condition michael@0: expectedKeyEvents = kAllKeyEvents; michael@0: sendChar("A"); michael@0: michael@0: // Start autoscrolling by middle button lick on the page michael@0: EventUtils.synthesizeMouse(root, 10, 10, { button: 1 }, michael@0: gBrowser.contentWindow); michael@0: michael@0: // Before continuing the test, we need to ensure that the IPC michael@0: // message that starts autoscrolling has had time to arrive. michael@0: executeSoon(continueTest); michael@0: } michael@0: michael@0: function continueTest() { michael@0: // Most key events should be eaten by the browser. michael@0: expectedKeyEvents = kNoKeyEvents; michael@0: sendChar("A"); michael@0: sendKey("DOWN"); michael@0: sendKey("RETURN"); michael@0: sendKey("RETURN"); michael@0: sendKey("HOME"); michael@0: sendKey("END"); michael@0: sendKey("TAB"); michael@0: sendKey("RETURN"); michael@0: michael@0: // Finish autoscrolling by ESC key. Note that only keydown and keypress michael@0: // events are eaten because keyup event is fired *after* the autoscrolling michael@0: // is finished. michael@0: expectedKeyEvents = kKeyUpEvent; michael@0: sendKey("ESCAPE"); michael@0: michael@0: // Test whether the key events are handled correctly under normal condition michael@0: expectedKeyEvents = kAllKeyEvents; michael@0: sendChar("A"); michael@0: michael@0: root.removeEventListener("keydown", onKey, true); michael@0: root.removeEventListener("keypress", onKey, true); michael@0: root.removeEventListener("keyup", onKey, true); michael@0: michael@0: // restore the changed prefs michael@0: if (Services.prefs.prefHasUserValue(kPrefName_AutoScroll)) michael@0: Services.prefs.clearUserPref(kPrefName_AutoScroll); michael@0: michael@0: // cleaning-up michael@0: gBrowser.removeCurrentTab(); michael@0: michael@0: finish(); michael@0: } michael@0: }