Bug 512059 - Accessibility focus event never fired for designMode document after the first focus. r=surkov,MarcoZ a=blocking1.9.2

This commit is contained in:
David Bolter 2009-11-08 13:36:02 -05:00
Родитель 2db2b36002
Коммит f3bee836c7
4 изменённых файлов: 130 добавлений и 7 удалений

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

@ -279,6 +279,19 @@ public:
return state; return state;
} }
/**
* Return the extended state for the given accessible.
*/
static PRUint32 ExtendedState(nsIAccessible *aAcc)
{
PRUint32 state = 0;
PRUint32 extstate = 0;
if (aAcc)
aAcc->GetState(&state, &extstate);
return extstate;
}
/** /**
* Get the ARIA attribute characteristics for a given ARIA attribute. * Get the ARIA attribute characteristics for a given ARIA attribute.
* *

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

@ -401,7 +401,8 @@ void nsRootAccessible::TryFireEarlyLoadEvent(nsIDOMNode *aDocNode)
} }
} }
PRBool nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible, PRBool
nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible,
nsIDOMNode *aNode, nsIDOMNode *aNode,
nsIDOMEvent *aFocusEvent, nsIDOMEvent *aFocusEvent,
PRBool aForceEvent, PRBool aForceEvent,
@ -531,10 +532,16 @@ PRBool nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible,
if (docAccessible) { if (docAccessible) {
// Doc is gaining focus, but actual focus may be on an element within document // Doc is gaining focus, but actual focus may be on an element within document
nsCOMPtr<nsIDOMNode> realFocusedNode = GetCurrentFocus(); nsCOMPtr<nsIDOMNode> realFocusedNode = GetCurrentFocus();
if (realFocusedNode != aNode || realFocusedNode == mDOMNode) { if ((realFocusedNode != aNode || realFocusedNode == mDOMNode) &&
!(nsAccUtils::ExtendedState(finalFocusAccessible) &
nsIAccessibleStates::EXT_STATE_EDITABLE)) {
// Suppress document focus, because real DOM focus will be fired next, // Suppress document focus, because real DOM focus will be fired next,
// and that's what we care about // except in the case of editable documents because we can't rely on a
// followup focus event for an element in an editable document.
// Make sure we never fire focus for the nsRootAccessible (mDOMNode) // Make sure we never fire focus for the nsRootAccessible (mDOMNode)
// XXX todo dig deeper on editor focus inconsistency in bug 526313
return PR_FALSE; return PR_FALSE;
} }
} }

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

@ -102,6 +102,7 @@ _TEST_FILES =\
test_events_flush.html \ test_events_flush.html \
test_events_focus.html \ test_events_focus.html \
test_events_focus.xul \ test_events_focus.xul \
test_events_focusdoc.html \
test_events_mutation.html \ test_events_mutation.html \
test_events_scroll.xul \ test_events_scroll.xul \
test_events_tree.xul \ test_events_tree.xul \

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

@ -0,0 +1,102 @@
<html>
<head>
<title>Accessible document focus event testing</title>
<link rel="stylesheet" type="text/css"
href="chrome://mochikit/content/tests/SimpleTest/test.css" />
<script type="application/javascript"
src="chrome://mochikit/content/MochiKit/packed.js"></script>
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript"
src="chrome://mochikit/content/a11y/accessible/common.js"></script>
<script type="application/javascript"
src="chrome://mochikit/content/a11y/accessible/events.js"></script>
<script type="application/javascript"
src="chrome://mochikit/content/a11y/accessible/states.js"></script>
<script type="application/javascript">
/**
* Focus invoker.
*/
function takeFocus(aAcc)
{
this.DOMNode = aAcc; // xxx rename this expected property in events.js
this.invoke = function takeFocus_invoke()
{
this.DOMNode.takeFocus();
};
this.check = function takeFocus_check()
{
testStates(this.DOMNode, STATE_FOCUSABLE | STATE_FOCUSED);
};
this.getID = function takeFocus_getID() { return aAcc.name + " focus"; };
}
/**
* Do tests.
*/
var gQueue = null;
//var gA11yEventDumpID = "eventdump";
function doTests()
{
// setup
var frameDoc = document.getElementById("iframe").contentDocument;
frameDoc.designMode = "on";
var frameDocAcc = getAccessible(frameDoc, [nsIAccessibleDocument]);
var buttonAcc = getAccessible("b1");
// Test focus events.
gQueue = new eventQueue(nsIAccessibleEvent.EVENT_FOCUS);
// try to give focus to contentEditable frame twice to cover bug 512059
gQueue.push(new takeFocus(buttonAcc));
gQueue.push(new takeFocus(frameDocAcc));
gQueue.push(new takeFocus(buttonAcc));
gQueue.push(new takeFocus(frameDocAcc));
gQueue.invoke(); // Will call SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addA11yLoadEvent(doTests);
</script>
</head>
<body>
<a target="_blank"
href="https://bugzilla.mozilla.org/show_bug.cgi?id=512058"
title="Can't set focus to designMode document via accessibility APIs">
Mozilla Bug 512058
</a>
<a target="_blank"
href="https://bugzilla.mozilla.org/show_bug.cgi?id=512059"
title="Accessibility focus event never fired for designMode document after the first focus">
Mozilla Bug 512059
</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test">
</pre>
<div id="eventdump"></div>
<div id="testContainer">
<button id="b1">a button</button>
<iframe id="iframe" src="about:blank"></iframe>
<button id="b2">a button</button>
</div>
</body>
</html>