OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/accessibility/browser_accessibility_manager_android.h" | 5 #include "content/browser/accessibility/browser_accessibility_manager_android.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <cmath> | 9 #include <cmath> |
10 | 10 |
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
139 BrowserAccessibilityDelegate* delegate, | 139 BrowserAccessibilityDelegate* delegate, |
140 BrowserAccessibilityFactory* factory) | 140 BrowserAccessibilityFactory* factory) |
141 : BrowserAccessibilityManager(delegate, factory), | 141 : BrowserAccessibilityManager(delegate, factory), |
142 prune_tree_for_screen_reader_(true) { | 142 prune_tree_for_screen_reader_(true) { |
143 Initialize(initial_tree); | 143 Initialize(initial_tree); |
144 SetContentViewCore(content_view_core); | 144 SetContentViewCore(content_view_core); |
145 } | 145 } |
146 | 146 |
147 BrowserAccessibilityManagerAndroid::~BrowserAccessibilityManagerAndroid() { | 147 BrowserAccessibilityManagerAndroid::~BrowserAccessibilityManagerAndroid() { |
148 JNIEnv* env = AttachCurrentThread(); | 148 JNIEnv* env = AttachCurrentThread(); |
149 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 149 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); |
150 if (obj.is_null()) | 150 if (obj.is_null()) |
151 return; | 151 return; |
152 | 152 |
153 Java_BrowserAccessibilityManager_onNativeObjectDestroyed(env, obj.obj()); | 153 Java_BrowserAccessibilityManager_onNativeObjectDestroyed(env, obj.obj()); |
154 } | 154 } |
155 | 155 |
156 // static | 156 // static |
157 ui::AXTreeUpdate | 157 ui::AXTreeUpdate |
158 BrowserAccessibilityManagerAndroid::GetEmptyDocument() { | 158 BrowserAccessibilityManagerAndroid::GetEmptyDocument() { |
159 ui::AXNodeData empty_document; | 159 ui::AXNodeData empty_document; |
(...skipping 15 matching lines...) Expand all Loading... |
175 java_ref_ = JavaObjectWeakGlobalRef( | 175 java_ref_ = JavaObjectWeakGlobalRef( |
176 env, Java_BrowserAccessibilityManager_create( | 176 env, Java_BrowserAccessibilityManager_create( |
177 env, reinterpret_cast<intptr_t>(this), | 177 env, reinterpret_cast<intptr_t>(this), |
178 content_view_core.obj()).obj()); | 178 content_view_core.obj()).obj()); |
179 } | 179 } |
180 | 180 |
181 void BrowserAccessibilityManagerAndroid::NotifyAccessibilityEvent( | 181 void BrowserAccessibilityManagerAndroid::NotifyAccessibilityEvent( |
182 ui::AXEvent event_type, | 182 ui::AXEvent event_type, |
183 BrowserAccessibility* node) { | 183 BrowserAccessibility* node) { |
184 JNIEnv* env = AttachCurrentThread(); | 184 JNIEnv* env = AttachCurrentThread(); |
185 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 185 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); |
186 if (obj.is_null()) | 186 if (obj.is_null()) |
187 return; | 187 return; |
188 | 188 |
189 BrowserAccessibilityAndroid* android_node = | 189 BrowserAccessibilityAndroid* android_node = |
190 static_cast<BrowserAccessibilityAndroid*>(node); | 190 static_cast<BrowserAccessibilityAndroid*>(node); |
191 | 191 |
192 if (event_type == ui::AX_EVENT_HIDE) | 192 if (event_type == ui::AX_EVENT_HIDE) |
193 return; | 193 return; |
194 | 194 |
195 if (event_type == ui::AX_EVENT_TREE_CHANGED) | 195 if (event_type == ui::AX_EVENT_TREE_CHANGED) |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
268 } | 268 } |
269 } | 269 } |
270 | 270 |
271 void BrowserAccessibilityManagerAndroid::OnLocationChanges( | 271 void BrowserAccessibilityManagerAndroid::OnLocationChanges( |
272 const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { | 272 const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { |
273 // Android is not very efficient at handling notifications, and location | 273 // Android is not very efficient at handling notifications, and location |
274 // changes in particular are frequent and not time-critical. If a lot of | 274 // changes in particular are frequent and not time-critical. If a lot of |
275 // nodes changed location, just send a single notification after a short | 275 // nodes changed location, just send a single notification after a short |
276 // delay (to batch them), rather than lots of individual notifications. | 276 // delay (to batch them), rather than lots of individual notifications. |
277 if (params.size() > 3) { | 277 if (params.size() > 3) { |
| 278 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); |
278 JNIEnv* env = AttachCurrentThread(); | 279 JNIEnv* env = AttachCurrentThread(); |
279 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | |
280 if (obj.is_null()) | 280 if (obj.is_null()) |
281 return; | 281 return; |
282 Java_BrowserAccessibilityManager_sendDelayedWindowContentChangedEvent( | 282 Java_BrowserAccessibilityManager_sendDelayedWindowContentChangedEvent( |
283 env, obj.obj()); | 283 env, obj.obj()); |
284 return; | 284 return; |
285 } | 285 } |
286 | 286 |
287 BrowserAccessibilityManager::OnLocationChanges(params); | 287 BrowserAccessibilityManager::OnLocationChanges(params); |
288 } | 288 } |
289 | 289 |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
652 BrowserAccessibilityManager::SetValue( | 652 BrowserAccessibilityManager::SetValue( |
653 *node, base::UTF8ToUTF16(base::DoubleToString(value))); | 653 *node, base::UTF8ToUTF16(base::DoubleToString(value))); |
654 return true; | 654 return true; |
655 } | 655 } |
656 return false; | 656 return false; |
657 } | 657 } |
658 | 658 |
659 void BrowserAccessibilityManagerAndroid::HandleHoverEvent( | 659 void BrowserAccessibilityManagerAndroid::HandleHoverEvent( |
660 BrowserAccessibility* node) { | 660 BrowserAccessibility* node) { |
661 JNIEnv* env = AttachCurrentThread(); | 661 JNIEnv* env = AttachCurrentThread(); |
662 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 662 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); |
663 if (obj.is_null()) | 663 if (obj.is_null()) |
664 return; | 664 return; |
665 | 665 |
666 BrowserAccessibilityAndroid* ancestor = | 666 BrowserAccessibilityAndroid* ancestor = |
667 static_cast<BrowserAccessibilityAndroid*>(node->GetParent()); | 667 static_cast<BrowserAccessibilityAndroid*>(node->GetParent()); |
668 while (ancestor && ancestor != GetRoot()) { | 668 while (ancestor && ancestor != GetRoot()) { |
669 if (ancestor->PlatformIsLeaf() || | 669 if (ancestor->PlatformIsLeaf() || |
670 (ancestor->IsFocusable() && !ancestor->HasFocusableChild())) { | 670 (ancestor->IsFocusable() && !ancestor->HasFocusableChild())) { |
671 node = ancestor; | 671 node = ancestor; |
672 // Don't break - we want the highest ancestor that's focusable or a | 672 // Don't break - we want the highest ancestor that's focusable or a |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
889 if (!node) | 889 if (!node) |
890 return false; | 890 return false; |
891 | 891 |
892 return node->Scroll(direction); | 892 return node->Scroll(direction); |
893 } | 893 } |
894 | 894 |
895 void BrowserAccessibilityManagerAndroid::OnAtomicUpdateFinished( | 895 void BrowserAccessibilityManagerAndroid::OnAtomicUpdateFinished( |
896 ui::AXTree* tree, | 896 ui::AXTree* tree, |
897 bool root_changed, | 897 bool root_changed, |
898 const std::vector<ui::AXTreeDelegate::Change>& changes) { | 898 const std::vector<ui::AXTreeDelegate::Change>& changes) { |
| 899 BrowserAccessibilityManager::OnAtomicUpdateFinished( |
| 900 tree, root_changed, changes); |
| 901 |
899 if (root_changed) { | 902 if (root_changed) { |
900 JNIEnv* env = AttachCurrentThread(); | 903 JNIEnv* env = AttachCurrentThread(); |
901 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 904 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); |
902 if (obj.is_null()) | 905 if (obj.is_null()) |
903 return; | 906 return; |
904 | 907 |
905 Java_BrowserAccessibilityManager_handleNavigate(env, obj.obj()); | 908 Java_BrowserAccessibilityManager_handleNavigate(env, obj.obj()); |
906 } | 909 } |
907 } | 910 } |
908 | 911 |
909 bool | 912 bool |
910 BrowserAccessibilityManagerAndroid::UseRootScrollOffsetsWhenComputingBounds() { | 913 BrowserAccessibilityManagerAndroid::UseRootScrollOffsetsWhenComputingBounds() { |
911 // The Java layer handles the root scroll offset. | 914 // The Java layer handles the root scroll offset. |
912 return false; | 915 return false; |
913 } | 916 } |
914 | 917 |
915 BrowserAccessibilityAndroid* | 918 BrowserAccessibilityAndroid* |
916 BrowserAccessibilityManagerAndroid::GetFromUniqueID(int32_t unique_id) { | 919 BrowserAccessibilityManagerAndroid::GetFromUniqueID(int32_t unique_id) { |
917 return static_cast<BrowserAccessibilityAndroid*>( | 920 return static_cast<BrowserAccessibilityAndroid*>( |
918 BrowserAccessibility::GetFromUniqueID(unique_id)); | 921 BrowserAccessibility::GetFromUniqueID(unique_id)); |
919 } | 922 } |
920 | 923 |
| 924 ScopedJavaLocalRef<jobject> |
| 925 BrowserAccessibilityManagerAndroid::GetJavaRefFromRootManager() { |
| 926 BrowserAccessibilityManagerAndroid* root_manager = |
| 927 static_cast<BrowserAccessibilityManagerAndroid*>( |
| 928 GetRootManager()); |
| 929 if (!root_manager) |
| 930 return ScopedJavaLocalRef<jobject>(); |
| 931 |
| 932 JNIEnv* env = AttachCurrentThread(); |
| 933 return root_manager->java_ref().get(env); |
| 934 } |
| 935 |
921 bool RegisterBrowserAccessibilityManager(JNIEnv* env) { | 936 bool RegisterBrowserAccessibilityManager(JNIEnv* env) { |
922 return RegisterNativesImpl(env); | 937 return RegisterNativesImpl(env); |
923 } | 938 } |
924 | 939 |
925 } // namespace content | 940 } // namespace content |
OLD | NEW |