зеркало из https://github.com/mozilla/pjs.git
Bug 512058 - Can't set focus to designMode document via accessibility APIs (also b=512059). r=MarcoZ,surkov
This commit is contained in:
Родитель
ce1bd3cdb0
Коммит
ce90fee230
|
@ -401,11 +401,12 @@ void nsRootAccessible::TryFireEarlyLoadEvent(nsIDOMNode *aDocNode)
|
|||
}
|
||||
}
|
||||
|
||||
PRBool nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible,
|
||||
nsIDOMNode *aNode,
|
||||
nsIDOMEvent *aFocusEvent,
|
||||
PRBool aForceEvent,
|
||||
PRBool aIsAsynch)
|
||||
PRBool
|
||||
nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible,
|
||||
nsIDOMNode *aNode,
|
||||
nsIDOMEvent *aFocusEvent,
|
||||
PRBool aForceEvent,
|
||||
PRBool aIsAsynch)
|
||||
{
|
||||
if (mCaretAccessible) {
|
||||
nsCOMPtr<nsIDOMNSEvent> nsevent(do_QueryInterface(aFocusEvent));
|
||||
|
@ -535,7 +536,15 @@ PRBool nsRootAccessible::FireAccessibleFocusEvent(nsIAccessible *aAccessible,
|
|||
// Suppress document focus, because real DOM focus will be fired next,
|
||||
// and that's what we care about
|
||||
// Make sure we never fire focus for the nsRootAccessible (mDOMNode)
|
||||
return PR_FALSE;
|
||||
|
||||
// XXX todo dig deeper on this in bug 526313
|
||||
// Editor is funky: e.g. for editable iframes the real focus can be on the
|
||||
// nsHTMLHtmlElement and there won't be a follow up dom focus event for
|
||||
// this node. In this case we don't want to bail after all. We can catch
|
||||
// this because the finalFocusNode won't have a frame.
|
||||
if (focusFrame) {
|
||||
return PR_FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -102,6 +102,7 @@ _TEST_FILES =\
|
|||
test_events_flush.html \
|
||||
test_events_focus.html \
|
||||
test_events_focus.xul \
|
||||
test_events_focusdoc.html \
|
||||
test_events_mutation.html \
|
||||
test_events_scroll.xul \
|
||||
test_events_tree.xul \
|
||||
|
|
|
@ -0,0 +1,139 @@
|
|||
<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">
|
||||
|
||||
/**
|
||||
* open a new window
|
||||
*/
|
||||
function tryToFocusRoot()
|
||||
{
|
||||
var w = window.open("", "", "width=200,height=100");
|
||||
this.DOMNode = w.document; // expected focus
|
||||
|
||||
// start with focus on original default window.
|
||||
window.focus();
|
||||
|
||||
this.invoke = function openWin_invoke()
|
||||
{
|
||||
w.focus();
|
||||
};
|
||||
|
||||
this.check = function openWin_check()
|
||||
{
|
||||
var root = getRootAccessible(this.DOMNode);
|
||||
testStates(root, 0, 0, STATE_FOCUSABLE | STATE_FOCUSED);
|
||||
w.close();
|
||||
};
|
||||
|
||||
this.getID = function openWin_getID()
|
||||
{
|
||||
return "root should not get focus... document focus";
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Focus invoker.
|
||||
*/
|
||||
function takeFocus(aAcc)
|
||||
{
|
||||
this.DOMNode = aAcc; // xxx rename this 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);
|
||||
|
||||
// Ensure focus doesn't go to root accessible (bug 375747)
|
||||
gQueue.push(new tryToFocusRoot());
|
||||
|
||||
// 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=375747"
|
||||
title="nsRootAccessible has state focusable, fires focus events in ATK">
|
||||
Mozilla Bug 375747
|
||||
</a>
|
||||
<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>
|
Загрузка…
Ссылка в новой задаче