OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/web_contents_accessibility_android.h" | 5 #include "content/browser/accessibility/web_contents_accessibility_android.h" |
6 | 6 |
7 #include "base/android/jni_android.h" | 7 #include "base/android/jni_android.h" |
8 #include "base/android/jni_string.h" | 8 #include "base/android/jni_string.h" |
9 #include "base/feature_list.h" | 9 #include "base/feature_list.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
557 JNIEnv* env, | 557 JNIEnv* env, |
558 const JavaParamRef<jobject>& obj) { | 558 const JavaParamRef<jobject>& obj) { |
559 InitSearchKeyToPredicateMapIfNeeded(); | 559 InitSearchKeyToPredicateMapIfNeeded(); |
560 return base::android::ConvertUTF16ToJavaString(env, g_all_search_keys.Get()); | 560 return base::android::ConvertUTF16ToJavaString(env, g_all_search_keys.Get()); |
561 } | 561 } |
562 | 562 |
563 jint WebContentsAccessibilityAndroid::GetRootId( | 563 jint WebContentsAccessibilityAndroid::GetRootId( |
564 JNIEnv* env, | 564 JNIEnv* env, |
565 const JavaParamRef<jobject>& obj) { | 565 const JavaParamRef<jobject>& obj) { |
566 if (root_manager_) { | 566 if (root_manager_) { |
567 auto* root = | 567 auto* root = root_manager_->GetRoot(); |
568 static_cast<BrowserAccessibilityAndroid*>(root_manager_->GetRoot()); | |
569 if (root) | 568 if (root) |
570 return static_cast<jint>(root->unique_id()); | 569 return static_cast<jint>(root->unique_id()); |
571 } | 570 } |
572 return -1; | 571 return -1; |
573 } | 572 } |
574 | 573 |
575 jboolean WebContentsAccessibilityAndroid::IsNodeValid( | 574 jboolean WebContentsAccessibilityAndroid::IsNodeValid( |
576 JNIEnv* env, | 575 JNIEnv* env, |
577 const JavaParamRef<jobject>& obj, | 576 const JavaParamRef<jobject>& obj, |
578 jint unique_id) { | 577 jint unique_id) { |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
634 jboolean WebContentsAccessibilityAndroid::PopulateAccessibilityNodeInfo( | 633 jboolean WebContentsAccessibilityAndroid::PopulateAccessibilityNodeInfo( |
635 JNIEnv* env, | 634 JNIEnv* env, |
636 const JavaParamRef<jobject>& obj, | 635 const JavaParamRef<jobject>& obj, |
637 const JavaParamRef<jobject>& info, | 636 const JavaParamRef<jobject>& info, |
638 jint unique_id) { | 637 jint unique_id) { |
639 BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id); | 638 BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id); |
640 if (!node) | 639 if (!node) |
641 return false; | 640 return false; |
642 | 641 |
643 if (node->PlatformGetParent()) { | 642 if (node->PlatformGetParent()) { |
644 auto* android_node = | |
645 static_cast<BrowserAccessibilityAndroid*>(node->PlatformGetParent()); | |
646 Java_WebContentsAccessibility_setAccessibilityNodeInfoParent( | 643 Java_WebContentsAccessibility_setAccessibilityNodeInfoParent( |
647 env, obj, info, android_node->unique_id()); | 644 env, obj, info, node->PlatformGetParent()->unique_id()); |
648 } | 645 } |
649 for (unsigned i = 0; i < node->PlatformChildCount(); ++i) { | 646 for (unsigned i = 0; i < node->PlatformChildCount(); ++i) { |
650 auto* android_node = | |
651 static_cast<BrowserAccessibilityAndroid*>(node->PlatformGetChild(i)); | |
652 Java_WebContentsAccessibility_addAccessibilityNodeInfoChild( | 647 Java_WebContentsAccessibility_addAccessibilityNodeInfoChild( |
653 env, obj, info, android_node->unique_id()); | 648 env, obj, info, node->PlatformGetChild(i)->unique_id()); |
654 } | 649 } |
655 Java_WebContentsAccessibility_setAccessibilityNodeInfoBooleanAttributes( | 650 Java_WebContentsAccessibility_setAccessibilityNodeInfoBooleanAttributes( |
656 env, obj, info, unique_id, node->IsCheckable(), node->IsChecked(), | 651 env, obj, info, unique_id, node->IsCheckable(), node->IsChecked(), |
657 node->IsClickable(), node->IsEnabled(), node->IsFocusable(), | 652 node->IsClickable(), node->IsEnabled(), node->IsFocusable(), |
658 node->IsFocused(), node->IsPassword(), node->IsScrollable(), | 653 node->IsFocused(), node->IsPassword(), node->IsScrollable(), |
659 node->IsSelected(), node->IsVisibleToUser()); | 654 node->IsSelected(), node->IsVisibleToUser()); |
660 Java_WebContentsAccessibility_addAccessibilityNodeInfoActions( | 655 Java_WebContentsAccessibility_addAccessibilityNodeInfoActions( |
661 env, obj, info, unique_id, node->CanScrollForward(), | 656 env, obj, info, unique_id, node->CanScrollForward(), |
662 node->CanScrollBackward(), node->CanScrollUp(), node->CanScrollDown(), | 657 node->CanScrollBackward(), node->CanScrollUp(), node->CanScrollDown(), |
663 node->CanScrollLeft(), node->CanScrollRight(), node->IsClickable(), | 658 node->CanScrollLeft(), node->CanScrollRight(), node->IsClickable(), |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
923 ? OneShotAccessibilityTreeSearch::FORWARDS | 918 ? OneShotAccessibilityTreeSearch::FORWARDS |
924 : OneShotAccessibilityTreeSearch::BACKWARDS); | 919 : OneShotAccessibilityTreeSearch::BACKWARDS); |
925 tree_search.SetResultLimit(1); | 920 tree_search.SetResultLimit(1); |
926 tree_search.SetImmediateDescendantsOnly(false); | 921 tree_search.SetImmediateDescendantsOnly(false); |
927 tree_search.SetVisibleOnly(false); | 922 tree_search.SetVisibleOnly(false); |
928 tree_search.AddPredicate(predicate); | 923 tree_search.AddPredicate(predicate); |
929 | 924 |
930 if (tree_search.CountMatches() == 0) | 925 if (tree_search.CountMatches() == 0) |
931 return 0; | 926 return 0; |
932 | 927 |
933 auto* android_node = | 928 int32_t element_id = tree_search.GetMatchAtIndex(0)->unique_id(); |
934 static_cast<BrowserAccessibilityAndroid*>(tree_search.GetMatchAtIndex(0)); | |
935 int32_t element_id = android_node->unique_id(); | |
936 | 929 |
937 // Navigate forwards to the autofill popup's proxy node if focus is currently | 930 // Navigate forwards to the autofill popup's proxy node if focus is currently |
938 // on the element hosting the autofill popup. Once within the popup, a back | 931 // on the element hosting the autofill popup. Once within the popup, a back |
939 // press will navigate back to the element hosting the popup. If user swipes | 932 // press will navigate back to the element hosting the popup. If user swipes |
940 // past last suggestion in the popup, or swipes left from the first suggestion | 933 // past last suggestion in the popup, or swipes left from the first suggestion |
941 // in the popup, we will navigate to the element that is the next element in | 934 // in the popup, we will navigate to the element that is the next element in |
942 // the document after the element hosting the popup. | 935 // the document after the element hosting the popup. |
943 if (forwards && start_id == g_element_hosting_autofill_popup_unique_id && | 936 if (forwards && start_id == g_element_hosting_autofill_popup_unique_id && |
944 g_autofill_popup_proxy_node) { | 937 g_autofill_popup_proxy_node) { |
945 g_element_after_element_hosting_autofill_popup_unique_id = element_id; | 938 g_element_after_element_hosting_autofill_popup_unique_id = element_id; |
946 auto* android_node = | 939 return g_autofill_popup_proxy_node->unique_id(); |
947 static_cast<BrowserAccessibilityAndroid*>(g_autofill_popup_proxy_node); | |
948 return android_node->unique_id(); | |
949 } | 940 } |
950 | 941 |
951 return element_id; | 942 return element_id; |
952 } | 943 } |
953 | 944 |
954 jboolean WebContentsAccessibilityAndroid::NextAtGranularity( | 945 jboolean WebContentsAccessibilityAndroid::NextAtGranularity( |
955 JNIEnv* env, | 946 JNIEnv* env, |
956 const JavaParamRef<jobject>& obj, | 947 const JavaParamRef<jobject>& obj, |
957 jint granularity, | 948 jint granularity, |
958 jboolean extend_selection, | 949 jboolean extend_selection, |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1041 ax_node_data.role = ui::AX_ROLE_MENU; | 1032 ax_node_data.role = ui::AX_ROLE_MENU; |
1042 ax_node_data.SetName("Autofill"); | 1033 ax_node_data.SetName("Autofill"); |
1043 ax_node_data.AddIntAttribute(ui::AX_ATTR_RESTRICTION, | 1034 ax_node_data.AddIntAttribute(ui::AX_ATTR_RESTRICTION, |
1044 ui::AX_RESTRICTION_READ_ONLY); | 1035 ui::AX_RESTRICTION_READ_ONLY); |
1045 ax_node_data.AddState(ui::AX_STATE_FOCUSABLE); | 1036 ax_node_data.AddState(ui::AX_STATE_FOCUSABLE); |
1046 ax_node_data.AddState(ui::AX_STATE_SELECTABLE); | 1037 ax_node_data.AddState(ui::AX_STATE_SELECTABLE); |
1047 g_autofill_popup_proxy_node_ax_node->SetData(ax_node_data); | 1038 g_autofill_popup_proxy_node_ax_node->SetData(ax_node_data); |
1048 g_autofill_popup_proxy_node->Init(root_manager_, | 1039 g_autofill_popup_proxy_node->Init(root_manager_, |
1049 g_autofill_popup_proxy_node_ax_node); | 1040 g_autofill_popup_proxy_node_ax_node); |
1050 | 1041 |
1051 auto* android_node = static_cast<BrowserAccessibilityAndroid*>(current_focus); | 1042 g_element_hosting_autofill_popup_unique_id = current_focus->unique_id(); |
1052 | |
1053 g_element_hosting_autofill_popup_unique_id = android_node->unique_id(); | |
1054 } | 1043 } |
1055 | 1044 |
1056 void WebContentsAccessibilityAndroid::OnAutofillPopupDismissed( | 1045 void WebContentsAccessibilityAndroid::OnAutofillPopupDismissed( |
1057 JNIEnv* env, | 1046 JNIEnv* env, |
1058 const JavaParamRef<jobject>& obj) { | 1047 const JavaParamRef<jobject>& obj) { |
1059 g_element_hosting_autofill_popup_unique_id = -1; | 1048 g_element_hosting_autofill_popup_unique_id = -1; |
1060 g_element_after_element_hosting_autofill_popup_unique_id = -1; | 1049 g_element_after_element_hosting_autofill_popup_unique_id = -1; |
1061 DeleteAutofillPopupProxy(); | 1050 DeleteAutofillPopupProxy(); |
1062 } | 1051 } |
1063 | 1052 |
1064 jint WebContentsAccessibilityAndroid:: | 1053 jint WebContentsAccessibilityAndroid:: |
1065 GetIdForElementAfterElementHostingAutofillPopup( | 1054 GetIdForElementAfterElementHostingAutofillPopup( |
1066 JNIEnv* env, | 1055 JNIEnv* env, |
1067 const JavaParamRef<jobject>& obj) { | 1056 const JavaParamRef<jobject>& obj) { |
1068 if (!base::FeatureList::IsEnabled(features::kAndroidAutofillAccessibility) || | 1057 if (!base::FeatureList::IsEnabled(features::kAndroidAutofillAccessibility) || |
1069 g_element_after_element_hosting_autofill_popup_unique_id == -1 || | 1058 g_element_after_element_hosting_autofill_popup_unique_id == -1 || |
1070 GetAXFromUniqueID( | 1059 GetAXFromUniqueID( |
1071 g_element_after_element_hosting_autofill_popup_unique_id) == nullptr) | 1060 g_element_after_element_hosting_autofill_popup_unique_id) == nullptr) |
1072 return 0; | 1061 return 0; |
1073 | 1062 |
1074 return g_element_after_element_hosting_autofill_popup_unique_id; | 1063 return g_element_after_element_hosting_autofill_popup_unique_id; |
1075 } | 1064 } |
1076 | 1065 |
1077 jboolean WebContentsAccessibilityAndroid::IsAutofillPopupNode( | 1066 jboolean WebContentsAccessibilityAndroid::IsAutofillPopupNode( |
1078 JNIEnv* env, | 1067 JNIEnv* env, |
1079 const JavaParamRef<jobject>& obj, | 1068 const JavaParamRef<jobject>& obj, |
1080 jint unique_id) { | 1069 jint unique_id) { |
1081 auto* android_node = | 1070 return g_autofill_popup_proxy_node && |
1082 static_cast<BrowserAccessibilityAndroid*>(g_autofill_popup_proxy_node); | 1071 g_autofill_popup_proxy_node->unique_id() == unique_id; |
1083 | |
1084 return g_autofill_popup_proxy_node && android_node->unique_id() == unique_id; | |
1085 } | 1072 } |
1086 | 1073 |
1087 bool WebContentsAccessibilityAndroid::Scroll(JNIEnv* env, | 1074 bool WebContentsAccessibilityAndroid::Scroll(JNIEnv* env, |
1088 const JavaParamRef<jobject>& obj, | 1075 const JavaParamRef<jobject>& obj, |
1089 jint unique_id, | 1076 jint unique_id, |
1090 int direction) { | 1077 int direction) { |
1091 BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id); | 1078 BrowserAccessibilityAndroid* node = GetAXFromUniqueID(unique_id); |
1092 if (!node) | 1079 if (!node) |
1093 return false; | 1080 return false; |
1094 | 1081 |
1095 return node->Scroll(direction); | 1082 return node->Scroll(direction); |
1096 } | 1083 } |
1097 | 1084 |
1098 BrowserAccessibilityAndroid* WebContentsAccessibilityAndroid::GetAXFromUniqueID( | 1085 BrowserAccessibilityAndroid* WebContentsAccessibilityAndroid::GetAXFromUniqueID( |
1099 int32_t unique_id) { | 1086 int32_t unique_id) { |
1100 return static_cast<BrowserAccessibilityAndroid*>( | 1087 return static_cast<BrowserAccessibilityAndroid*>( |
1101 BrowserAccessibilityAndroid::GetFromUniqueId(unique_id)); | 1088 BrowserAccessibility::GetFromUniqueID(unique_id)); |
1102 } | 1089 } |
1103 | 1090 |
1104 void WebContentsAccessibilityAndroid::UpdateFrameInfo() { | 1091 void WebContentsAccessibilityAndroid::UpdateFrameInfo() { |
1105 if (frame_info_initialized_) | 1092 if (frame_info_initialized_) |
1106 return; | 1093 return; |
1107 | 1094 |
1108 JNIEnv* env = AttachCurrentThread(); | 1095 JNIEnv* env = AttachCurrentThread(); |
1109 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); | 1096 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); |
1110 if (obj.is_null()) | 1097 if (obj.is_null()) |
1111 return; | 1098 return; |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1191 const JavaParamRef<jobject>& jweb_contents, | 1178 const JavaParamRef<jobject>& jweb_contents, |
1192 jboolean should_focus_on_page_load) { | 1179 jboolean should_focus_on_page_load) { |
1193 WebContents* web_contents = WebContents::FromJavaWebContents(jweb_contents); | 1180 WebContents* web_contents = WebContents::FromJavaWebContents(jweb_contents); |
1194 DCHECK(web_contents); | 1181 DCHECK(web_contents); |
1195 | 1182 |
1196 return reinterpret_cast<intptr_t>(new WebContentsAccessibilityAndroid( | 1183 return reinterpret_cast<intptr_t>(new WebContentsAccessibilityAndroid( |
1197 env, obj, web_contents, should_focus_on_page_load)); | 1184 env, obj, web_contents, should_focus_on_page_load)); |
1198 } | 1185 } |
1199 | 1186 |
1200 } // namespace content | 1187 } // namespace content |
OLD | NEW |