зеркало из https://github.com/mozilla/pjs.git
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:
Родитель
2db2b36002
Коммит
f3bee836c7
|
@ -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,11 +401,12 @@ void nsRootAccessible::TryFireEarlyLoadEvent(nsIDOMNode *aDocNode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PRBool nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible,
|
PRBool
|
||||||
nsIDOMNode *aNode,
|
nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible,
|
||||||
nsIDOMEvent *aFocusEvent,
|
nsIDOMNode *aNode,
|
||||||
PRBool aForceEvent,
|
nsIDOMEvent *aFocusEvent,
|
||||||
PRBool aIsAsynch)
|
PRBool aForceEvent,
|
||||||
|
PRBool aIsAsynch)
|
||||||
{
|
{
|
||||||
if (mCaretAccessible) {
|
if (mCaretAccessible) {
|
||||||
nsCOMPtr<nsIDOMNSEvent> nsevent(do_QueryInterface(aFocusEvent));
|
nsCOMPtr<nsIDOMNSEvent> nsevent(do_QueryInterface(aFocusEvent));
|
||||||
|
@ -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>
|
Загрузка…
Ссылка в новой задаче