Bug 1008772 part.1 tabs should handle non-printable keys with keydown event handlers in the system group rather than keypress event handlers in the normal group r=smaug+enndeakin

This commit is contained in:
Masayuki Nakano 2014-06-05 11:57:53 +09:00
Родитель 2ad17a72df
Коммит c29c2b90ca
2 изменённых файлов: 66 добавлений и 33 удалений

Просмотреть файл

@ -2885,7 +2885,7 @@
onget="return this.mCurrentBrowser.isSyntheticDocument;"
readonly="true"/>
<method name="_handleKeyEvent">
<method name="_handleKeyDownEvent">
<parameter name="aEvent"/>
<body><![CDATA[
if (!aEvent.isTrusted) {
@ -2896,21 +2896,44 @@
if (aEvent.altKey)
return;
// Don't check if the event was already consumed because tab
// navigation should always work for better user experience.
if (aEvent.ctrlKey && aEvent.shiftKey && !aEvent.metaKey) {
switch (aEvent.keyCode) {
case aEvent.DOM_VK_PAGE_UP:
this.moveTabBackward();
aEvent.stopPropagation();
aEvent.preventDefault();
return;
case aEvent.DOM_VK_PAGE_DOWN:
this.moveTabForward();
aEvent.stopPropagation();
aEvent.preventDefault();
return;
}
}
#ifndef XP_MACOSX
if (aEvent.ctrlKey && !aEvent.shiftKey && !aEvent.metaKey &&
aEvent.keyCode == KeyEvent.DOM_VK_F4 &&
!this.mCurrentTab.pinned) {
this.removeCurrentTab({animate: true});
aEvent.preventDefault();
}
#endif
]]></body>
</method>
<method name="_handleKeyPressEvent">
<parameter name="aEvent"/>
<body><![CDATA[
if (!aEvent.isTrusted) {
// Don't let untrusted events mess with tabs.
return;
}
if (aEvent.altKey)
return;
// We need to take care of FAYT-watching as long as the findbar
// isn't initialized. The checks on aEvent are copied from
// _shouldFastFind (see findbar.xml).
@ -2940,17 +2963,8 @@
if (window.getComputedStyle(this, null).direction == "ltr")
offset *= -1;
this.tabContainer.advanceSelectedTab(offset, true);
aEvent.stopPropagation();
aEvent.preventDefault();
}
#else
if (aEvent.ctrlKey && !aEvent.shiftKey && !aEvent.metaKey &&
aEvent.keyCode == KeyEvent.DOM_VK_F4 &&
!this.mCurrentTab.pinned) {
this.removeCurrentTab({animate: true});
aEvent.stopPropagation();
aEvent.preventDefault();
}
#endif
]]></body>
</method>
@ -2982,8 +2996,11 @@
<parameter name="aEvent"/>
<body><![CDATA[
switch (aEvent.type) {
case "keydown":
this._handleKeyDownEvent(aEvent);
break;
case "keypress":
this._handleKeyEvent(aEvent);
this._handleKeyPressEvent(aEvent);
break;
case "sizemodechange":
if (aEvent.target == window) {
@ -3050,7 +3067,9 @@
this.mCurrentBrowser = document.getAnonymousElementByAttribute(this, "anonid", "initialBrowser");
this.mCurrentTab = this.tabContainer.firstChild;
document.addEventListener("keypress", this, false);
let els = Cc["@mozilla.org/eventlistenerservice;1"].getService(Ci.nsIEventListenerService);
els.addSystemEventListener(document, "keydown", this, false);
els.addSystemEventListener(document, "keypress", this, false);
window.addEventListener("sizemodechange", this, false);
var uniqueId = this._generateUniquePanelID();
@ -3128,7 +3147,9 @@
this.mTabListeners[i].destroy();
this.mTabListeners[i] = null;
}
document.removeEventListener("keypress", this, false);
let els = Cc["@mozilla.org/eventlistenerservice;1"].getService(Ci.nsIEventListenerService);
els.removeSystemEventListener(document, "keydown", this, false);
els.removeSystemEventListener(document, "keypress", this, false);
window.removeEventListener("sizemodechange", this, false);
if (gMultiProcessBrowser) {
@ -4247,7 +4268,7 @@
event.stopPropagation();
]]></handler>
<handler event="keypress"><![CDATA[
<handler event="keydown" group="system"><![CDATA[
if (event.altKey || event.shiftKey ||
#ifdef XP_MACOSX
!event.metaKey)
@ -4256,6 +4277,9 @@
#endif
return;
// Don't check if the event was already consumed because tab navigation
// should work always for better user experience.
switch (event.keyCode) {
case KeyEvent.DOM_VK_UP:
this.tabbrowser.moveTabBackward();
@ -4274,11 +4298,10 @@
this.tabbrowser.moveTabToEnd();
break;
default:
// Stop the keypress event for the above keyboard
// Consume the keydown event for the above keyboard
// shortcuts only.
return;
}
event.stopPropagation();
event.preventDefault();
]]></handler>

Просмотреть файл

@ -147,12 +147,14 @@
return;
}
// Don't check if the event was already consumed because tab
// navigation should always work for better user experience.
switch (event.keyCode) {
case event.DOM_VK_TAB:
if (event.ctrlKey && !event.altKey && !event.metaKey)
if (this.tabs && this.handleCtrlTab) {
this.tabs.advanceSelectedTab(event.shiftKey ? -1 : 1, true);
event.stopPropagation();
event.preventDefault();
}
break;
@ -160,7 +162,6 @@
if (event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey)
if (this.tabs && this.handleCtrlPageUpDown) {
this.tabs.advanceSelectedTab(-1, true);
event.stopPropagation();
event.preventDefault();
}
break;
@ -168,7 +169,6 @@
if (event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey)
if (this.tabs && this.handleCtrlPageUpDown) {
this.tabs.advanceSelectedTab(1, true);
event.stopPropagation();
event.preventDefault();
}
break;
@ -178,7 +178,6 @@
var offset = window.getComputedStyle(this, "")
.direction == "ltr" ? -1 : 1;
this.tabs.advanceSelectedTab(offset, true);
event.stopPropagation();
event.preventDefault();
}
break;
@ -188,7 +187,6 @@
var offset = window.getComputedStyle(this, "")
.direction == "ltr" ? 1 : -1;
this.tabs.advanceSelectedTab(offset, true);
event.stopPropagation();
event.preventDefault();
}
break;
@ -203,8 +201,12 @@
<setter>
<![CDATA[
if (val != this._eventNode) {
val.addEventListener("keypress", this, false);
this._eventNode.removeEventListener("keypress", this, false);
const nsIEventListenerService =
Components.interfaces.nsIEventListenerService;
let els = Components.classes["@mozilla.org/eventlistenerservice;1"]
.getService(nsIEventListenerService);
els.addSystemEventListener(val, "keydown", this, false);
els.removeSystemEventListener(this._eventNode, "keydown", this, false);
this._eventNode = val;
}
return val;
@ -218,11 +220,19 @@
case "window": this._eventNode = window; break;
case "document": this._eventNode = document; break;
}
this._eventNode.addEventListener("keypress", this, false);
const nsIEventListenerService =
Components.interfaces.nsIEventListenerService;
let els = Components.classes["@mozilla.org/eventlistenerservice;1"]
.getService(nsIEventListenerService);
els.addSystemEventListener(this._eventNode, "keydown", this, false);
</constructor>
<destructor>
this._eventNode.removeEventListener("keypress", this, false);
const nsIEventListenerService =
Components.interfaces.nsIEventListenerService;
let els = Components.classes["@mozilla.org/eventlistenerservice;1"]
.getService(nsIEventListenerService);
els.removeSystemEventListener(this._eventNode, "keydown", this, false);
</destructor>
</implementation>
</binding>
@ -806,39 +816,39 @@
]]>
</handler>
<handler event="keypress" keycode="VK_LEFT">
<handler event="keydown" keycode="VK_LEFT" group="system" preventdefault="true">
<![CDATA[
var direction = window.getComputedStyle(this.parentNode, null).direction;
this.parentNode.advanceSelectedTab(direction == 'ltr' ? -1 : 1, this.arrowKeysShouldWrap);
]]>
</handler>
<handler event="keypress" keycode="VK_RIGHT">
<handler event="keydown" keycode="VK_RIGHT" group="system" preventdefault="true">
<![CDATA[
var direction = window.getComputedStyle(this.parentNode, null).direction;
this.parentNode.advanceSelectedTab(direction == 'ltr' ? 1 : -1, this.arrowKeysShouldWrap);
]]>
</handler>
<handler event="keypress" keycode="VK_UP">
<handler event="keydown" keycode="VK_UP" group="system" preventdefault="true">
<![CDATA[
this.parentNode.advanceSelectedTab(-1, this.arrowKeysShouldWrap);
]]>
</handler>
<handler event="keypress" keycode="VK_DOWN">
<handler event="keydown" keycode="VK_DOWN" group="system" preventdefault="true">
<![CDATA[
this.parentNode.advanceSelectedTab(1, this.arrowKeysShouldWrap);
]]>
</handler>
<handler event="keypress" keycode="VK_HOME">
<handler event="keydown" keycode="VK_HOME" group="system" preventdefault="true">
<![CDATA[
this.parentNode._selectNewTab(this.parentNode.childNodes[0]);
]]>
</handler>
<handler event="keypress" keycode="VK_END">
<handler event="keydown" keycode="VK_END" group="system" preventdefault="true">
<![CDATA[
var tabs = this.parentNode.childNodes;
this.parentNode._selectNewTab(tabs[tabs.length - 1], -1);