author | Alexander Surkov <surkov.alexander@gmail.com> |
Wed, 05 Sep 2012 20:03:39 +0900 | |
changeset 104285 | 4168b071661e636e1dffb2966457024237ece96a |
parent 104284 | df1a1a1cfaf49840942f554500873c4befe6d071 |
child 104286 | f2bc7b6958cd2c95032ae15177240cb05616c84e |
push id | 23417 |
push user | ryanvm@gmail.com |
push date | Thu, 06 Sep 2012 02:27:31 +0000 |
treeherder | mozilla-central@501f4e46a88c [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | tbsaunde |
bugs | 761102 |
milestone | 18.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- a/accessible/src/base/FocusManager.cpp +++ b/accessible/src/base/FocusManager.cpp @@ -55,17 +55,17 @@ FocusManager::IsFocused(const Accessible // accessible creation for temporary about:blank document. Without this // peculiarity we would end up with plain implementation based on // FocusedAccessible() method call. Make sure this issue is fixed in // bug 638465. if (focusedNode->OwnerDoc() == aAccessible->GetNode()->OwnerDoc()) { DocAccessible* doc = GetAccService()->GetDocAccessible(focusedNode->OwnerDoc()); return aAccessible == - (doc ? doc->GetAccessibleOrContainer(focusedNode) : nullptr); + (doc ? doc->GetAccessibleOrContainer(focusedNode) : nullptr); } } return false; } bool FocusManager::IsFocusWithin(const Accessible* aContainer) const {
--- a/accessible/src/generic/Accessible.cpp +++ b/accessible/src/generic/Accessible.cpp @@ -2841,17 +2841,31 @@ bool Accessible::IsWidget() const { return false; } bool Accessible::IsActiveWidget() const { - return FocusMgr()->IsFocused(this); + if (FocusMgr()->HasDOMFocus(mContent)) + return true; + + // If text entry of combobox widget has a focus then the combobox widget is + // active. + if (mRoleMapEntry && mRoleMapEntry->Is(nsGkAtoms::combobox)) { + PRUint32 childCount = ChildCount(); + for (PRUint32 idx = 0; idx < childCount; idx++) { + Accessible* child = mChildren.ElementAt(idx); + if (child->Role() == roles::ENTRY) + return FocusMgr()->HasDOMFocus(child->GetContent()); + } + } + + return false; } bool Accessible::AreItemsOperable() const { return mContent->HasAttr(kNameSpaceID_None, nsGkAtoms::aria_activedescendant); }
--- a/accessible/src/generic/DocAccessible.cpp +++ b/accessible/src/generic/DocAccessible.cpp @@ -1216,21 +1216,21 @@ DocAccessible::ARIAAttributeChanged(nsIC aContent); return; } } void DocAccessible::ARIAActiveDescendantChanged(nsIContent* aElm) { - if (FocusMgr()->HasDOMFocus(aElm)) { + Accessible* widget = GetAccessible(aElm); + if (widget && widget->IsActiveWidget()) { nsAutoString id; if (aElm->GetAttr(kNameSpaceID_None, nsGkAtoms::aria_activedescendant, id)) { - nsIDocument* DOMDoc = aElm->OwnerDoc(); - dom::Element* activeDescendantElm = DOMDoc->GetElementById(id); + dom::Element* activeDescendantElm = aElm->OwnerDoc()->GetElementById(id); if (activeDescendantElm) { Accessible* activeDescendant = GetAccessible(activeDescendantElm); if (activeDescendant) { FocusMgr()->ActiveItemChanged(activeDescendant, false); A11YDEBUG_FOCUS_ACTIVEITEMCHANGE_CAUSE("ARIA activedescedant changed", activeDescendant) } }
--- a/accessible/tests/mochitest/events/test_focus_aria_activedescendant.html +++ b/accessible/tests/mochitest/events/test_focus_aria_activedescendant.html @@ -65,16 +65,20 @@ https://bugzilla.mozilla.org/show_bug.cg var gQueue = null; function doTest() { gQueue = new eventQueue(); gQueue.push(new synthFocus("container", new focusChecker("item1"))); gQueue.push(new changeARIAActiveDescendant("container", "item2")); + + gQueue.push(new synthFocus("combobox_entry", new focusChecker("combobox_entry"))); + gQueue.push(new changeARIAActiveDescendant("combobox", "combobox_option2")); + todo(false, "No focus for inserted element, bug 687011"); //gQueue.push(new insertItemNFocus("container", "item3")); gQueue.invoke(); // Will call SimpleTest.finish(); } SimpleTest.waitForExplicitFinish(); addA11yLoadEvent(doTest); @@ -82,19 +86,32 @@ https://bugzilla.mozilla.org/show_bug.cg </head> <body> <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=429547" title="Support aria-activedescendant usage in nsIAccesible::TakeFocus()"> Mozilla Bug 429547 </a> + <a target="_blank" + href="https://bugzilla.mozilla.org/show_bug.cgi?id=761102" + title="Focus may be missed when ARIA active-descendant is changed on active composite widget"> + Mozilla Bug 761102 + </a> <p id="display"></p> <div id="content" style="display: none"></div> <pre id="test"> </pre> <div role="listbox" aria-activedescendant="item1" id="container" tabindex="1"> <div role="listitem" id="item1">item1</div> <div role="listitem" id="item2">item2</div> </div> + + <div role="combobox" id="combobox"> + <input id="combobox_entry"> + <ul> + <li role="option" id="combobox_option1">option1</li> + <li role="option" id="combobox_option2">option2</li> + </ul> + </div> </body> </html>