| Index: content/browser/accessibility/browser_accessibility_manager.cc
|
| diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc
|
| index c893d985b8fab9480caaed79054c18e55a9a32f8..45d5ec24629c47a4ef2e493c29a7a5f41ea47ec7 100644
|
| --- a/content/browser/accessibility/browser_accessibility_manager.cc
|
| +++ b/content/browser/accessibility/browser_accessibility_manager.cc
|
| @@ -123,7 +123,6 @@ BrowserAccessibilityManager::BrowserAccessibilityManager(
|
| : delegate_(delegate),
|
| factory_(factory),
|
| tree_(new ui::AXSerializableTree()),
|
| - focus_(NULL),
|
| user_is_navigating_away_(false),
|
| osk_state_(OSK_ALLOWED),
|
| ax_tree_id_(AXTreeIDRegistry::kNoAXTreeID),
|
| @@ -138,7 +137,6 @@ BrowserAccessibilityManager::BrowserAccessibilityManager(
|
| : delegate_(delegate),
|
| factory_(factory),
|
| tree_(new ui::AXSerializableTree()),
|
| - focus_(NULL),
|
| user_is_navigating_away_(false),
|
| osk_state_(OSK_ALLOWED),
|
| ax_tree_id_(AXTreeIDRegistry::kNoAXTreeID),
|
| @@ -162,9 +160,6 @@ void BrowserAccessibilityManager::Initialize(
|
| LOG(FATAL) << tree_->error();
|
| }
|
| }
|
| -
|
| - if (!focus_)
|
| - SetFocus(tree_->root(), false);
|
| }
|
|
|
| // static
|
| @@ -243,13 +238,15 @@ const ui::AXTreeData& BrowserAccessibilityManager::GetTreeData() {
|
| }
|
|
|
| void BrowserAccessibilityManager::OnWindowFocused() {
|
| - if (focus_)
|
| - NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, GetFromAXNode(focus_));
|
| + BrowserAccessibility* focus = GetFocus();
|
| + if (focus)
|
| + NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, focus);
|
| }
|
|
|
| void BrowserAccessibilityManager::OnWindowBlurred() {
|
| - if (focus_)
|
| - NotifyAccessibilityEvent(ui::AX_EVENT_BLUR, GetFromAXNode(focus_));
|
| + BrowserAccessibility* focus = GetFocus();
|
| + if (focus)
|
| + NotifyAccessibilityEvent(ui::AX_EVENT_BLUR, focus);
|
| }
|
|
|
| void BrowserAccessibilityManager::UserIsNavigatingAway() {
|
| @@ -269,11 +266,12 @@ void BrowserAccessibilityManager::NavigationFailed() {
|
| }
|
|
|
| void BrowserAccessibilityManager::GotMouseDown() {
|
| - if (!focus_)
|
| + BrowserAccessibility* focus = GetFocus();
|
| + if (!focus)
|
| return;
|
|
|
| osk_state_ = OSK_ALLOWED_WITHIN_FOCUSED_OBJECT;
|
| - NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, GetFromAXNode(focus_));
|
| + NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, focus);
|
| }
|
|
|
| bool BrowserAccessibilityManager::UseRootScrollOffsetsWhenComputingBounds() {
|
| @@ -282,8 +280,6 @@ bool BrowserAccessibilityManager::UseRootScrollOffsetsWhenComputingBounds() {
|
|
|
| void BrowserAccessibilityManager::OnAccessibilityEvents(
|
| const std::vector<AXEventNotificationDetails>& details) {
|
| - bool should_send_initial_focus = false;
|
| -
|
| // Process all changes to the accessibility tree first.
|
| for (uint32_t index = 0; index < details.size(); ++index) {
|
| const AXEventNotificationDetails& detail = details[index];
|
| @@ -296,17 +292,8 @@ void BrowserAccessibilityManager::OnAccessibilityEvents(
|
| }
|
| return;
|
| }
|
| -
|
| - // Set focus to the root if it's not anywhere else.
|
| - if (!focus_) {
|
| - SetFocus(tree_->root(), false);
|
| - should_send_initial_focus = true;
|
| - }
|
| }
|
|
|
| - if (should_send_initial_focus && NativeViewHasFocus())
|
| - NotifyAccessibilityEvent(ui::AX_EVENT_FOCUS, GetFromAXNode(focus_));
|
| -
|
| // Now iterate over the events again and fire the events.
|
| for (uint32_t index = 0; index < details.size(); index++) {
|
| const AXEventNotificationDetails& detail = details[index];
|
| @@ -320,8 +307,6 @@ void BrowserAccessibilityManager::OnAccessibilityEvents(
|
| ui::AXEvent event_type = detail.event_type;
|
| if (event_type == ui::AX_EVENT_FOCUS ||
|
| event_type == ui::AX_EVENT_BLUR) {
|
| - SetFocus(node, false);
|
| -
|
| if (osk_state_ != OSK_DISALLOWED_BECAUSE_TAB_HIDDEN &&
|
| osk_state_ != OSK_DISALLOWED_BECAUSE_TAB_JUST_APPEARED)
|
| osk_state_ = OSK_ALLOWED;
|
| @@ -387,20 +372,19 @@ void BrowserAccessibilityManager::ActivateFindInPageResult(
|
| }
|
|
|
| BrowserAccessibility* BrowserAccessibilityManager::GetActiveDescendantFocus(
|
| - BrowserAccessibility* root) {
|
| - BrowserAccessibility* node = BrowserAccessibilityManager::GetFocus(root);
|
| - if (!node)
|
| + BrowserAccessibility* focus) {
|
| + if (!focus)
|
| return NULL;
|
|
|
| int active_descendant_id;
|
| - if (node->GetIntAttribute(ui::AX_ATTR_ACTIVEDESCENDANT_ID,
|
| - &active_descendant_id)) {
|
| + if (focus->GetIntAttribute(ui::AX_ATTR_ACTIVEDESCENDANT_ID,
|
| + &active_descendant_id)) {
|
| BrowserAccessibility* active_descendant =
|
| - node->manager()->GetFromID(active_descendant_id);
|
| + focus->manager()->GetFromID(active_descendant_id);
|
| if (active_descendant)
|
| return active_descendant;
|
| }
|
| - return node;
|
| + return focus;
|
| }
|
|
|
| bool BrowserAccessibilityManager::NativeViewHasFocus() {
|
| @@ -410,39 +394,33 @@ bool BrowserAccessibilityManager::NativeViewHasFocus() {
|
| return false;
|
| }
|
|
|
| -BrowserAccessibility* BrowserAccessibilityManager::GetFocus(
|
| - BrowserAccessibility* root) {
|
| - if (!focus_)
|
| - return nullptr;
|
| -
|
| - if (root && !focus_->IsDescendantOf(root->node()))
|
| - return nullptr;
|
| +BrowserAccessibility* BrowserAccessibilityManager::GetFocus() {
|
| + int32_t focus_id = GetTreeData().focus_id;
|
| + BrowserAccessibility* obj = GetFromID(focus_id);
|
| + if (!obj)
|
| + return GetRoot();
|
|
|
| - BrowserAccessibility* obj = GetFromAXNode(focus_);
|
| - DCHECK(obj);
|
| if (obj->HasIntAttribute(ui::AX_ATTR_CHILD_TREE_ID)) {
|
| BrowserAccessibilityManager* child_manager =
|
| BrowserAccessibilityManager::FromID(
|
| obj->GetIntAttribute(ui::AX_ATTR_CHILD_TREE_ID));
|
| if (child_manager)
|
| - return child_manager->GetFocus(child_manager->GetRoot());
|
| + return child_manager->GetFocus();
|
| }
|
|
|
| return obj;
|
| }
|
|
|
| -void BrowserAccessibilityManager::SetFocus(ui::AXNode* node, bool notify) {
|
| - if (focus_ != node)
|
| - focus_ = node;
|
| -
|
| - if (notify && node && delegate_)
|
| - delegate_->AccessibilitySetFocus(node->id());
|
| +void BrowserAccessibilityManager::SetFocus(const BrowserAccessibility& node) {
|
| + if (delegate_)
|
| + delegate_->AccessibilitySetFocus(node.GetId());
|
| }
|
|
|
| -void BrowserAccessibilityManager::SetFocus(
|
| - BrowserAccessibility* obj, bool notify) {
|
| - if (obj->node())
|
| - SetFocus(obj->node(), notify);
|
| +void BrowserAccessibilityManager::SetFocusLocallyForTesting(
|
| + BrowserAccessibility* node) {
|
| + ui::AXTreeData data = GetTreeData();
|
| + data.focus_id = node->GetId();
|
| + tree_->UpdateData(data);
|
| }
|
|
|
| void BrowserAccessibilityManager::DoDefaultAction(
|
| @@ -678,12 +656,6 @@ void BrowserAccessibilityManager::OnTreeDataChanged(ui::AXTree* tree) {
|
| void BrowserAccessibilityManager::OnNodeWillBeDeleted(ui::AXTree* tree,
|
| ui::AXNode* node) {
|
| DCHECK(node);
|
| - if (node == focus_ && tree_) {
|
| - if (node != tree_->root())
|
| - SetFocus(tree_->root(), false);
|
| - else
|
| - focus_ = NULL;
|
| - }
|
| if (id_wrapper_map_.find(node->id()) == id_wrapper_map_.end())
|
| return;
|
| GetFromAXNode(node)->Destroy();
|
|
|