зеркало из https://github.com/mozilla/gecko-dev.git
Backed out changeset b92904ec121f (bug 1627520) for browser_searchbar_keyboard_navigation.js failures CLOSED TREE
This commit is contained in:
Родитель
e2defa3249
Коммит
52f29c9810
|
@ -807,11 +807,11 @@ class SearchOneOffs {
|
|||
* to pass anything for this parameter. (Pass undefined or null.)
|
||||
* @returns {boolean} True if the one-offs handled the key press.
|
||||
*/
|
||||
handleKeyDown(event, numListItems, allowEmptySelection, textboxUserValue) {
|
||||
handleKeyPress(event, numListItems, allowEmptySelection, textboxUserValue) {
|
||||
if (!this.popup && !this._view) {
|
||||
return false;
|
||||
}
|
||||
let handled = this._handleKeyDown(
|
||||
let handled = this._handleKeyPress(
|
||||
event,
|
||||
numListItems,
|
||||
allowEmptySelection,
|
||||
|
@ -824,7 +824,7 @@ class SearchOneOffs {
|
|||
return handled;
|
||||
}
|
||||
|
||||
_handleKeyDown(event, numListItems, allowEmptySelection, textboxUserValue) {
|
||||
_handleKeyPress(event, numListItems, allowEmptySelection, textboxUserValue) {
|
||||
if (this.compact && this.container.hidden) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -574,40 +574,74 @@
|
|||
this.textbox.popup.removeAttribute("showonlysettings");
|
||||
});
|
||||
|
||||
this.textbox.addEventListener("keydown", event => {
|
||||
if (
|
||||
event.keyCode == KeyEvent.DOM_VK_UP &&
|
||||
event.getModifierState("Accel")
|
||||
) {
|
||||
this.selectEngine(event, false);
|
||||
}
|
||||
});
|
||||
this.textbox.addEventListener(
|
||||
"keypress",
|
||||
event => {
|
||||
// accel + up/down changes the default engine and shouldn't affect
|
||||
// the selection on the one-off buttons.
|
||||
let popup = this.textbox.popup;
|
||||
if (!popup.popupOpen || event.getModifierState("Accel")) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.textbox.addEventListener("keydown", event => {
|
||||
if (
|
||||
event.keyCode == KeyEvent.DOM_VK_DOWN &&
|
||||
event.getModifierState("Accel")
|
||||
) {
|
||||
this.selectEngine(event, true);
|
||||
}
|
||||
});
|
||||
let suggestionsHidden =
|
||||
popup.richlistbox.getAttribute("collapsed") == "true";
|
||||
let numItems = suggestionsHidden ? 0 : popup.matchCount;
|
||||
popup.oneOffButtons.handleKeyPress(event, numItems, true);
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
this.textbox.addEventListener("keydown", event => {
|
||||
if (
|
||||
event.getModifierState("Alt") &&
|
||||
(event.keyCode == KeyEvent.DOM_VK_DOWN ||
|
||||
event.keyCode == KeyEvent.DOM_VK_UP)
|
||||
) {
|
||||
this.textbox.openSearch();
|
||||
}
|
||||
});
|
||||
this.textbox.addEventListener(
|
||||
"keypress",
|
||||
event => {
|
||||
if (
|
||||
event.keyCode == KeyEvent.DOM_VK_UP &&
|
||||
event.getModifierState("Accel")
|
||||
) {
|
||||
this.selectEngine(event, false);
|
||||
}
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
if (AppConstants.platform == "macosx") {
|
||||
this.textbox.addEventListener("keydown", event => {
|
||||
if (event.keyCode == KeyEvent.DOM_VK_F4) {
|
||||
this.textbox.addEventListener(
|
||||
"keypress",
|
||||
event => {
|
||||
if (
|
||||
event.keyCode == KeyEvent.DOM_VK_DOWN &&
|
||||
event.getModifierState("Accel")
|
||||
) {
|
||||
this.selectEngine(event, true);
|
||||
}
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
this.textbox.addEventListener(
|
||||
"keypress",
|
||||
event => {
|
||||
if (
|
||||
event.getModifierState("Alt") &&
|
||||
(event.keyCode == KeyEvent.DOM_VK_DOWN ||
|
||||
event.keyCode == KeyEvent.DOM_VK_UP)
|
||||
) {
|
||||
this.textbox.openSearch();
|
||||
}
|
||||
});
|
||||
},
|
||||
true
|
||||
);
|
||||
|
||||
if (AppConstants.platform == "macosx") {
|
||||
this.textbox.addEventListener(
|
||||
"keypress",
|
||||
event => {
|
||||
if (event.keyCode == KeyEvent.DOM_VK_F4) {
|
||||
this.textbox.openSearch();
|
||||
}
|
||||
},
|
||||
true
|
||||
);
|
||||
}
|
||||
|
||||
this.textbox.addEventListener("dragover", event => {
|
||||
|
@ -707,18 +741,6 @@
|
|||
return aValue;
|
||||
};
|
||||
|
||||
this.textbox.onBeforeHandleKeyDown = aEvent => {
|
||||
let popup = this.textbox.popup;
|
||||
if (!popup.popupOpen || aEvent.getModifierState("Accel")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
let suggestionsHidden =
|
||||
popup.richlistbox.getAttribute("collapsed") == "true";
|
||||
let numItems = suggestionsHidden ? 0 : popup.matchCount;
|
||||
return popup.oneOffButtons.handleKeyDown(aEvent, numItems, true);
|
||||
};
|
||||
|
||||
// This method overrides the autocomplete binding's openPopup (essentially
|
||||
// duplicating the logic from the autocomplete popup binding's
|
||||
// openAutocompletePopup method), modifying it so that the popup is aligned with
|
||||
|
|
|
@ -285,7 +285,7 @@ class UrlbarController {
|
|||
|
||||
if (this.view.isOpen && executeAction && this._lastQueryContextWrapper) {
|
||||
let { queryContext } = this._lastQueryContextWrapper;
|
||||
let handled = this.view.oneOffSearchButtons.handleKeyDown(
|
||||
let handled = this.view.oneOffSearchButtons.handleKeyPress(
|
||||
event,
|
||||
this.view.visibleElementCount,
|
||||
this.view.allowEmptySelection,
|
||||
|
|
|
@ -427,9 +427,13 @@ nsAutoCompleteController::HandleKeyNavigation(uint32_t aKey, bool* _retval) {
|
|||
// the cursor to home/end on some systems
|
||||
*_retval = true;
|
||||
bool reverse = aKey == dom::KeyboardEvent_Binding::DOM_VK_UP ||
|
||||
aKey == dom::KeyboardEvent_Binding::DOM_VK_PAGE_UP;
|
||||
aKey == dom::KeyboardEvent_Binding::DOM_VK_PAGE_UP
|
||||
? true
|
||||
: false;
|
||||
bool page = aKey == dom::KeyboardEvent_Binding::DOM_VK_PAGE_UP ||
|
||||
aKey == dom::KeyboardEvent_Binding::DOM_VK_PAGE_DOWN;
|
||||
aKey == dom::KeyboardEvent_Binding::DOM_VK_PAGE_DOWN
|
||||
? true
|
||||
: false;
|
||||
|
||||
// Fill in the value of the textbox with whatever is selected in the popup
|
||||
// if the completeSelectedIndex attribute is set. We check this before
|
||||
|
|
|
@ -823,6 +823,8 @@ nsFormFillController::HandleFormEvent(Event* aEvent) {
|
|||
return MouseDown(aEvent);
|
||||
case eKeyDown:
|
||||
return KeyDown(aEvent);
|
||||
case eKeyPress:
|
||||
return KeyPress(aEvent);
|
||||
case eEditorInput: {
|
||||
nsCOMPtr<nsINode> input = do_QueryInterface(aEvent->GetComposedTarget());
|
||||
if (!IsTextControl(input)) {
|
||||
|
@ -1017,8 +1019,6 @@ nsresult nsFormFillController::KeyDown(Event* aEvent) {
|
|||
}
|
||||
|
||||
bool cancel = false;
|
||||
bool unused = false;
|
||||
|
||||
uint32_t k = keyEvent->KeyCode();
|
||||
switch (k) {
|
||||
case KeyboardEvent_Binding::DOM_VK_RETURN: {
|
||||
|
@ -1026,6 +1026,40 @@ nsresult nsFormFillController::KeyDown(Event* aEvent) {
|
|||
controller->HandleEnter(false, aEvent, &cancel);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cancel) {
|
||||
aEvent->PreventDefault();
|
||||
// Don't let the page see the RETURN event when the popup is open
|
||||
// (indicated by cancel=true) so sites don't manually submit forms
|
||||
// (e.g. via submit.click()) without the autocompleted value being filled.
|
||||
// Bug 286933 will fix this for other key events.
|
||||
if (k == KeyboardEvent_Binding::DOM_VK_RETURN) {
|
||||
aEvent->StopPropagation();
|
||||
}
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult nsFormFillController::KeyPress(Event* aEvent) {
|
||||
NS_ASSERTION(mController, "should have a controller!");
|
||||
|
||||
mPasswordPopupAutomaticallyOpened = false;
|
||||
|
||||
if (!IsFocusedInputControlled()) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
RefPtr<KeyboardEvent> keyEvent = aEvent->AsKeyboardEvent();
|
||||
if (!keyEvent) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
bool cancel = false;
|
||||
bool unused = false;
|
||||
|
||||
uint32_t k = keyEvent->KeyCode();
|
||||
switch (k) {
|
||||
case KeyboardEvent_Binding::DOM_VK_DELETE:
|
||||
#ifndef XP_MACOSX
|
||||
{
|
||||
|
@ -1107,13 +1141,6 @@ nsresult nsFormFillController::KeyDown(Event* aEvent) {
|
|||
|
||||
if (cancel) {
|
||||
aEvent->PreventDefault();
|
||||
// Don't let the page see the RETURN event when the popup is open
|
||||
// (indicated by cancel=true) so sites don't manually submit forms
|
||||
// (e.g. via submit.click()) without the autocompleted value being filled.
|
||||
// Bug 286933 will fix this for other key events.
|
||||
if (k == KeyboardEvent_Binding::DOM_VK_RETURN) {
|
||||
aEvent->StopPropagation();
|
||||
}
|
||||
}
|
||||
|
||||
return NS_OK;
|
||||
|
|
|
@ -22,6 +22,11 @@
|
|||
#include "nsCycleCollectionParticipant.h"
|
||||
#include "nsILoginReputation.h"
|
||||
|
||||
// X.h defines KeyPress
|
||||
#ifdef KeyPress
|
||||
# undef KeyPress
|
||||
#endif
|
||||
|
||||
class nsFormHistory;
|
||||
class nsINode;
|
||||
class nsPIDOMWindowOuter;
|
||||
|
@ -50,6 +55,7 @@ class nsFormFillController final : public nsIFormFillController,
|
|||
|
||||
MOZ_CAN_RUN_SCRIPT nsresult Focus(mozilla::dom::Event* aEvent);
|
||||
MOZ_CAN_RUN_SCRIPT nsresult KeyDown(mozilla::dom::Event* aKeyEvent);
|
||||
MOZ_CAN_RUN_SCRIPT nsresult KeyPress(mozilla::dom::Event* aKeyEvent);
|
||||
MOZ_CAN_RUN_SCRIPT nsresult MouseDown(mozilla::dom::Event* aMouseEvent);
|
||||
|
||||
nsFormFillController();
|
||||
|
@ -60,6 +66,9 @@ class nsFormFillController final : public nsIFormFillController,
|
|||
void AddWindowListeners(nsPIDOMWindowOuter* aWindow);
|
||||
MOZ_CAN_RUN_SCRIPT void RemoveWindowListeners(nsPIDOMWindowOuter* aWindow);
|
||||
|
||||
void AddKeyListener(nsINode* aInput);
|
||||
void RemoveKeyListener();
|
||||
|
||||
MOZ_CAN_RUN_SCRIPT
|
||||
void StartControllingInput(mozilla::dom::HTMLInputElement* aInput);
|
||||
MOZ_CAN_RUN_SCRIPT void StopControllingInput();
|
||||
|
|
|
@ -835,6 +835,17 @@
|
|||
"chrome://global/content/elements/toolbarbutton.js",
|
||||
"chrome://global/content/elements/tree.js",
|
||||
"chrome://global/content/elements/wizard.js",
|
||||
// We load autocomplete-input eagerly, because we use system event
|
||||
// listeners to be able to see keypress events for non-printable keys
|
||||
// (see bug 1434837), and in the capture phase, for some reason.
|
||||
//
|
||||
// That means that they can run after the actual internal <input> element
|
||||
// event listeners if custom element construction is not synchronous, and
|
||||
// thus be default-prevented by them.
|
||||
//
|
||||
// This all seems pretty fishy, ideally we'd stop using keypress for
|
||||
// these events, but for now this preserves behavior.
|
||||
"chrome://global/content/elements/autocomplete-input.js",
|
||||
]) {
|
||||
Services.scriptloader.loadSubScript(script, window);
|
||||
}
|
||||
|
@ -848,10 +859,6 @@
|
|||
"printpreview-toolbar",
|
||||
"chrome://global/content/printPreviewToolbar.js",
|
||||
],
|
||||
[
|
||||
"autocomplete-input",
|
||||
"chrome://global/content/elements/autocomplete-input.js",
|
||||
],
|
||||
["editor", "chrome://global/content/elements/editor.js"],
|
||||
]) {
|
||||
customElements.setElementCreationCallback(tag, () => {
|
||||
|
|
|
@ -35,7 +35,10 @@
|
|||
this.onInput(event);
|
||||
});
|
||||
|
||||
this.addEventListener("keydown", event => this.handleKeyDown(event));
|
||||
this.addEventListener("keypress", event => this.handleKeyPress(event), {
|
||||
capture: true,
|
||||
mozSystemGroup: true,
|
||||
});
|
||||
|
||||
this.addEventListener(
|
||||
"compositionstart",
|
||||
|
@ -476,19 +479,12 @@
|
|||
}
|
||||
}
|
||||
|
||||
handleKeyDown(aEvent) {
|
||||
handleKeyPress(aEvent) {
|
||||
// Re: urlbarDeferred, see the comment in urlbarBindings.xml.
|
||||
if (aEvent.defaultPrevented && !aEvent.urlbarDeferred) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (
|
||||
typeof this.onBeforeHandleKeyDown == "function" &&
|
||||
this.onBeforeHandleKeyDown(aEvent)
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const isMac = AppConstants.platform == "macosx";
|
||||
var cancel = false;
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче