mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-03-03 23:30:46 +00:00
Ignore the keypress event if DOMEventToNativeKeyEvent() fails. b=456273 r=Olli.Pettay sr=jonas
This commit is contained in:
parent
be6e2ff3ec
commit
0abae51687
@ -1189,12 +1189,12 @@ public:
|
||||
static const nsDependentString GetLocalizedEllipsis();
|
||||
|
||||
/**
|
||||
* The routine GetNativeEvent is used to fill nsNativeKeyEvent
|
||||
* nsNativeKeyEvent. It's also used in DOMEventToNativeKeyEvent.
|
||||
* The routine GetNativeEvent is used to fill nsNativeKeyEvent.
|
||||
* It's also used in DOMEventToNativeKeyEvent.
|
||||
* See bug 406407 for details.
|
||||
*/
|
||||
static nsEvent* GetNativeEvent(nsIDOMEvent* aDOMEvent);
|
||||
static PRBool DOMEventToNativeKeyEvent(nsIDOMEvent* aDOMEvent,
|
||||
static PRBool DOMEventToNativeKeyEvent(nsIDOMKeyEvent* aKeyEvent,
|
||||
nsNativeKeyEvent* aNativeEvent,
|
||||
PRBool aGetCharCode);
|
||||
|
||||
|
@ -3953,36 +3953,34 @@ nsContentUtils::GetNativeEvent(nsIDOMEvent* aDOMEvent)
|
||||
|
||||
//static
|
||||
PRBool
|
||||
nsContentUtils::DOMEventToNativeKeyEvent(nsIDOMEvent* aDOMEvent,
|
||||
nsContentUtils::DOMEventToNativeKeyEvent(nsIDOMKeyEvent* aKeyEvent,
|
||||
nsNativeKeyEvent* aNativeEvent,
|
||||
PRBool aGetCharCode)
|
||||
{
|
||||
nsCOMPtr<nsIDOMNSUIEvent> uievent = do_QueryInterface(aDOMEvent);
|
||||
nsCOMPtr<nsIDOMNSUIEvent> uievent = do_QueryInterface(aKeyEvent);
|
||||
PRBool defaultPrevented;
|
||||
uievent->GetPreventDefault(&defaultPrevented);
|
||||
if (defaultPrevented)
|
||||
return PR_FALSE;
|
||||
|
||||
nsCOMPtr<nsIDOMNSEvent> nsevent = do_QueryInterface(aDOMEvent);
|
||||
nsCOMPtr<nsIDOMNSEvent> nsevent = do_QueryInterface(aKeyEvent);
|
||||
PRBool trusted = PR_FALSE;
|
||||
nsevent->GetIsTrusted(&trusted);
|
||||
if (!trusted)
|
||||
return PR_FALSE;
|
||||
|
||||
nsCOMPtr<nsIDOMKeyEvent> keyEvent = do_QueryInterface(aDOMEvent);
|
||||
|
||||
if (aGetCharCode) {
|
||||
keyEvent->GetCharCode(&aNativeEvent->charCode);
|
||||
aKeyEvent->GetCharCode(&aNativeEvent->charCode);
|
||||
} else {
|
||||
aNativeEvent->charCode = 0;
|
||||
}
|
||||
keyEvent->GetKeyCode(&aNativeEvent->keyCode);
|
||||
keyEvent->GetAltKey(&aNativeEvent->altKey);
|
||||
keyEvent->GetCtrlKey(&aNativeEvent->ctrlKey);
|
||||
keyEvent->GetShiftKey(&aNativeEvent->shiftKey);
|
||||
keyEvent->GetMetaKey(&aNativeEvent->metaKey);
|
||||
aKeyEvent->GetKeyCode(&aNativeEvent->keyCode);
|
||||
aKeyEvent->GetAltKey(&aNativeEvent->altKey);
|
||||
aKeyEvent->GetCtrlKey(&aNativeEvent->ctrlKey);
|
||||
aKeyEvent->GetShiftKey(&aNativeEvent->shiftKey);
|
||||
aKeyEvent->GetMetaKey(&aNativeEvent->metaKey);
|
||||
|
||||
aNativeEvent->nativeEvent = GetNativeEvent(aDOMEvent);
|
||||
aNativeEvent->nativeEvent = GetNativeEvent(aKeyEvent);
|
||||
|
||||
return PR_TRUE;
|
||||
}
|
||||
|
@ -62,6 +62,7 @@ _TEST_FILES = \
|
||||
test_bug412567.html \
|
||||
test_bug443985.html \
|
||||
test_bug447736.html \
|
||||
test_bug456273.html \
|
||||
test_draggableprop.html \
|
||||
test_dragstart.html \
|
||||
$(NULL)
|
||||
|
43
content/events/test/test_bug456273.html
Normal file
43
content/events/test/test_bug456273.html
Normal file
@ -0,0 +1,43 @@
|
||||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<!--
|
||||
https://bugzilla.mozilla.org/show_bug.cgi?id=456273
|
||||
-->
|
||||
<head>
|
||||
<title>Test for Bug 456273</title>
|
||||
<script type="application/javascript" src="/MochiKit/MochiKit.js"></script>
|
||||
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
|
||||
</head>
|
||||
<body>
|
||||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=456273">Mozilla Bug 456273</a>
|
||||
<p id="display">PASS if Firefox does not crash.</p>
|
||||
<div id="content" style="display: none">
|
||||
|
||||
</div>
|
||||
|
||||
<div id="edit456273" contenteditable="true">text</div>
|
||||
|
||||
<pre id="test">
|
||||
<script type="application/javascript">
|
||||
|
||||
/** Test for Bug 456273 **/
|
||||
|
||||
function doTest() {
|
||||
netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
|
||||
|
||||
var ev = document.createEvent('KeyEvents');
|
||||
ev.initKeyEvent("keypress", true, true, null, true, false,
|
||||
false, false, 0, "z".charCodeAt(0));
|
||||
document.getElementById('edit456273').dispatchEvent(ev);
|
||||
ok(true, "PASS");
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
addLoadEvent(doTest);
|
||||
|
||||
</script>
|
||||
</pre>
|
||||
</body>
|
||||
</html>
|
@ -374,19 +374,20 @@ nsXBLWindowKeyHandler::WalkHandlers(nsIDOMKeyEvent* aKeyEvent, nsIAtom* aEventTy
|
||||
}
|
||||
}
|
||||
|
||||
PRBool handled;
|
||||
PRBool handled = PR_FALSE;
|
||||
if (aEventType == nsGkAtoms::keypress) {
|
||||
nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_TRUE);
|
||||
handled = sNativeEditorBindings->KeyPress(nativeEvent,
|
||||
DoCommandCallback, controllers);
|
||||
if (nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_TRUE))
|
||||
handled = sNativeEditorBindings->KeyPress(nativeEvent,
|
||||
DoCommandCallback, controllers);
|
||||
} else if (aEventType == nsGkAtoms::keyup) {
|
||||
nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_FALSE);
|
||||
handled = sNativeEditorBindings->KeyUp(nativeEvent,
|
||||
DoCommandCallback, controllers);
|
||||
} else {
|
||||
nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_FALSE);
|
||||
handled = sNativeEditorBindings->KeyDown(nativeEvent,
|
||||
if (nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_FALSE))
|
||||
handled = sNativeEditorBindings->KeyUp(nativeEvent,
|
||||
DoCommandCallback, controllers);
|
||||
} else {
|
||||
NS_ASSERTION(aEventType == nsGkAtoms::keydown, "unknown key event type");
|
||||
if (nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_FALSE))
|
||||
handled = sNativeEditorBindings->KeyDown(nativeEvent,
|
||||
DoCommandCallback, controllers);
|
||||
}
|
||||
|
||||
if (handled)
|
||||
|
@ -430,14 +430,17 @@ DoCommandCallback(const char *aCommand, void *aData)
|
||||
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextInputListener::KeyDown(nsIDOMEvent *aKeyEvent)
|
||||
nsTextInputListener::KeyDown(nsIDOMEvent *aDOMEvent)
|
||||
{
|
||||
nsCOMPtr<nsIDOMKeyEvent> keyEvent(do_QueryInterface(aDOMEvent));
|
||||
NS_ENSURE_TRUE(keyEvent, NS_ERROR_INVALID_ARG);
|
||||
|
||||
nsNativeKeyEvent nativeEvent;
|
||||
nsINativeKeyBindings *bindings = GetKeyBindings();
|
||||
if (bindings &&
|
||||
nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_FALSE)) {
|
||||
nsContentUtils::DOMEventToNativeKeyEvent(keyEvent, &nativeEvent, PR_FALSE)) {
|
||||
if (bindings->KeyDown(nativeEvent, DoCommandCallback, mFrame)) {
|
||||
aKeyEvent->PreventDefault();
|
||||
aDOMEvent->PreventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
@ -445,14 +448,17 @@ nsTextInputListener::KeyDown(nsIDOMEvent *aKeyEvent)
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextInputListener::KeyPress(nsIDOMEvent *aKeyEvent)
|
||||
nsTextInputListener::KeyPress(nsIDOMEvent *aDOMEvent)
|
||||
{
|
||||
nsCOMPtr<nsIDOMKeyEvent> keyEvent(do_QueryInterface(aDOMEvent));
|
||||
NS_ENSURE_TRUE(keyEvent, NS_ERROR_INVALID_ARG);
|
||||
|
||||
nsNativeKeyEvent nativeEvent;
|
||||
nsINativeKeyBindings *bindings = GetKeyBindings();
|
||||
if (bindings &&
|
||||
nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_TRUE)) {
|
||||
nsContentUtils::DOMEventToNativeKeyEvent(keyEvent, &nativeEvent, PR_TRUE)) {
|
||||
if (bindings->KeyPress(nativeEvent, DoCommandCallback, mFrame)) {
|
||||
aKeyEvent->PreventDefault();
|
||||
aDOMEvent->PreventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
@ -460,14 +466,17 @@ nsTextInputListener::KeyPress(nsIDOMEvent *aKeyEvent)
|
||||
}
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsTextInputListener::KeyUp(nsIDOMEvent *aKeyEvent)
|
||||
nsTextInputListener::KeyUp(nsIDOMEvent *aDOMEvent)
|
||||
{
|
||||
nsCOMPtr<nsIDOMKeyEvent> keyEvent(do_QueryInterface(aDOMEvent));
|
||||
NS_ENSURE_TRUE(keyEvent, NS_ERROR_INVALID_ARG);
|
||||
|
||||
nsNativeKeyEvent nativeEvent;
|
||||
nsINativeKeyBindings *bindings = GetKeyBindings();
|
||||
if (bindings &&
|
||||
nsContentUtils::DOMEventToNativeKeyEvent(aKeyEvent, &nativeEvent, PR_FALSE)) {
|
||||
nsContentUtils::DOMEventToNativeKeyEvent(keyEvent, &nativeEvent, PR_FALSE)) {
|
||||
if (bindings->KeyUp(nativeEvent, DoCommandCallback, mFrame)) {
|
||||
aKeyEvent->PreventDefault();
|
||||
aDOMEvent->PreventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user