зеркало из https://github.com/mozilla/gecko-dev.git
Bug 889512 - no focus event for google's moving textbox, r=tbsaunde
This commit is contained in:
Родитель
e854bc2ed3
Коммит
0a304aba4a
|
@ -1830,10 +1830,16 @@ DocAccessible::UpdateTreeInternal(Accessible* aChild, bool aIsInsert,
|
||||||
{
|
{
|
||||||
uint32_t updateFlags = eAccessible;
|
uint32_t updateFlags = eAccessible;
|
||||||
|
|
||||||
|
// If a focused node has been shown then it could mean its frame was recreated
|
||||||
|
// while the node stays focused and we need to fire focus event on
|
||||||
|
// the accessible we just created. If the queue contains a focus event for
|
||||||
|
// this node already then it will be suppressed by this one.
|
||||||
|
Accessible* focusedAcc = nullptr;
|
||||||
|
|
||||||
nsINode* node = aChild->GetNode();
|
nsINode* node = aChild->GetNode();
|
||||||
if (aIsInsert) {
|
if (aIsInsert) {
|
||||||
// Create accessible tree for shown accessible.
|
// Create accessible tree for shown accessible.
|
||||||
CacheChildrenInSubtree(aChild);
|
CacheChildrenInSubtree(aChild, &focusedAcc);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Fire menupopup end event before hide event if a menu goes away.
|
// Fire menupopup end event before hide event if a menu goes away.
|
||||||
|
@ -1870,16 +1876,6 @@ DocAccessible::UpdateTreeInternal(Accessible* aChild, bool aIsInsert,
|
||||||
updateFlags = eAlertAccessible;
|
updateFlags = eAlertAccessible;
|
||||||
FireDelayedEvent(nsIAccessibleEvent::EVENT_ALERT, aChild);
|
FireDelayedEvent(nsIAccessibleEvent::EVENT_ALERT, aChild);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If focused node has been shown then it means its frame was recreated
|
|
||||||
// while it's focused. Fire focus event on new focused accessible. If
|
|
||||||
// the queue contains focus event for this node then it's suppressed by
|
|
||||||
// this one.
|
|
||||||
// XXX: do we really want to send focus to focused DOM node not taking into
|
|
||||||
// account active item?
|
|
||||||
if (FocusMgr()->IsFocused(aChild))
|
|
||||||
FocusMgr()->DispatchFocusEvent(this, aChild);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// Update the tree for content removal.
|
// Update the tree for content removal.
|
||||||
// The accessible parent may differ from container accessible if
|
// The accessible parent may differ from container accessible if
|
||||||
|
@ -1893,12 +1889,24 @@ DocAccessible::UpdateTreeInternal(Accessible* aChild, bool aIsInsert,
|
||||||
UncacheChildrenInSubtree(aChild);
|
UncacheChildrenInSubtree(aChild);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// XXX: do we really want to send focus to focused DOM node not taking into
|
||||||
|
// account active item?
|
||||||
|
if (focusedAcc)
|
||||||
|
FocusMgr()->DispatchFocusEvent(this, focusedAcc);
|
||||||
|
|
||||||
return updateFlags;
|
return updateFlags;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
DocAccessible::CacheChildrenInSubtree(Accessible* aRoot)
|
DocAccessible::CacheChildrenInSubtree(Accessible* aRoot,
|
||||||
|
Accessible** aFocusedAcc)
|
||||||
{
|
{
|
||||||
|
// If the accessible is focused then report a focus event after all related
|
||||||
|
// mutation events.
|
||||||
|
if (aFocusedAcc && !*aFocusedAcc &&
|
||||||
|
FocusMgr()->HasDOMFocus(aRoot->GetContent()))
|
||||||
|
*aFocusedAcc = aRoot;
|
||||||
|
|
||||||
aRoot->EnsureChildren();
|
aRoot->EnsureChildren();
|
||||||
|
|
||||||
// Make sure we create accessible tree defined in DOM only, i.e. if accessible
|
// Make sure we create accessible tree defined in DOM only, i.e. if accessible
|
||||||
|
@ -1910,7 +1918,7 @@ DocAccessible::CacheChildrenInSubtree(Accessible* aRoot)
|
||||||
NS_ASSERTION(child, "Illicit tree change while tree is created!");
|
NS_ASSERTION(child, "Illicit tree change while tree is created!");
|
||||||
// Don't cross document boundaries.
|
// Don't cross document boundaries.
|
||||||
if (child && child->IsContent())
|
if (child && child->IsContent())
|
||||||
CacheChildrenInSubtree(child);
|
CacheChildrenInSubtree(child, aFocusedAcc);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fire document load complete on ARIA documents.
|
// Fire document load complete on ARIA documents.
|
||||||
|
|
|
@ -449,8 +449,13 @@ protected:
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create accessible tree.
|
* Create accessible tree.
|
||||||
|
*
|
||||||
|
* @param aRoot [in] a root of subtree to create
|
||||||
|
* @param aFocusedAcc [in, optional] a focused accessible under created
|
||||||
|
* subtree if any
|
||||||
*/
|
*/
|
||||||
void CacheChildrenInSubtree(Accessible* aRoot);
|
void CacheChildrenInSubtree(Accessible* aRoot,
|
||||||
|
Accessible** aFocusedAcc = nullptr);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove accessibles in subtree from node to accessible map.
|
* Remove accessibles in subtree from node to accessible map.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче