Ignore the keypress event if DOMEventToNativeKeyEvent() fails. b=456273 r=Olli.Pettay sr=jonas

This commit is contained in:
Mats Palmgren 2008-10-15 12:50:42 +02:00
parent be6e2ff3ec
commit 0abae51687
6 changed files with 86 additions and 34 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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)

View 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>

View File

@ -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)

View File

@ -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();
}
}