| 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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 SetContentViewCore(content_view_core); | 147 SetContentViewCore(content_view_core); |
| 148 } | 148 } |
| 149 | 149 |
| 150 BrowserAccessibilityManagerAndroid::~BrowserAccessibilityManagerAndroid() { | 150 BrowserAccessibilityManagerAndroid::~BrowserAccessibilityManagerAndroid() { |
| 151 JNIEnv* env = AttachCurrentThread(); | 151 JNIEnv* env = AttachCurrentThread(); |
| 152 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); | 152 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); |
| 153 if (obj.is_null()) | 153 if (obj.is_null()) |
| 154 return; | 154 return; |
| 155 | 155 |
| 156 Java_BrowserAccessibilityManager_onNativeObjectDestroyed( | 156 Java_BrowserAccessibilityManager_onNativeObjectDestroyed( |
| 157 env, obj.obj(),reinterpret_cast<intptr_t>(this)); | 157 env, obj, reinterpret_cast<intptr_t>(this)); |
| 158 } | 158 } |
| 159 | 159 |
| 160 // static | 160 // static |
| 161 ui::AXTreeUpdate | 161 ui::AXTreeUpdate |
| 162 BrowserAccessibilityManagerAndroid::GetEmptyDocument() { | 162 BrowserAccessibilityManagerAndroid::GetEmptyDocument() { |
| 163 ui::AXNodeData empty_document; | 163 ui::AXNodeData empty_document; |
| 164 empty_document.id = 0; | 164 empty_document.id = 0; |
| 165 empty_document.role = ui::AX_ROLE_ROOT_WEB_AREA; | 165 empty_document.role = ui::AX_ROLE_ROOT_WEB_AREA; |
| 166 empty_document.state = 1 << ui::AX_STATE_READ_ONLY; | 166 empty_document.state = 1 << ui::AX_STATE_READ_ONLY; |
| 167 | 167 |
| 168 ui::AXTreeUpdate update; | 168 ui::AXTreeUpdate update; |
| 169 update.root_id = empty_document.id; | 169 update.root_id = empty_document.id; |
| 170 update.nodes.push_back(empty_document); | 170 update.nodes.push_back(empty_document); |
| 171 return update; | 171 return update; |
| 172 } | 172 } |
| 173 | 173 |
| 174 void BrowserAccessibilityManagerAndroid::SetContentViewCore( | 174 void BrowserAccessibilityManagerAndroid::SetContentViewCore( |
| 175 ScopedJavaLocalRef<jobject> content_view_core) { | 175 ScopedJavaLocalRef<jobject> content_view_core) { |
| 176 if (content_view_core.is_null()) | 176 if (content_view_core.is_null()) |
| 177 return; | 177 return; |
| 178 | 178 |
| 179 JNIEnv* env = AttachCurrentThread(); | 179 JNIEnv* env = AttachCurrentThread(); |
| 180 java_ref_ = JavaObjectWeakGlobalRef( | 180 java_ref_ = JavaObjectWeakGlobalRef( |
| 181 env, Java_BrowserAccessibilityManager_create( | 181 env, Java_BrowserAccessibilityManager_create( |
| 182 env, reinterpret_cast<intptr_t>(this), | 182 env, reinterpret_cast<intptr_t>(this), content_view_core) |
| 183 content_view_core.obj()).obj()); | 183 .obj()); |
| 184 } | 184 } |
| 185 | 185 |
| 186 bool BrowserAccessibilityManagerAndroid::ShouldExposePasswordText() { | 186 bool BrowserAccessibilityManagerAndroid::ShouldExposePasswordText() { |
| 187 JNIEnv* env = AttachCurrentThread(); | 187 JNIEnv* env = AttachCurrentThread(); |
| 188 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); | 188 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); |
| 189 if (obj.is_null()) | 189 if (obj.is_null()) |
| 190 return false; | 190 return false; |
| 191 | 191 |
| 192 return Java_BrowserAccessibilityManager_shouldExposePasswordText( | 192 return Java_BrowserAccessibilityManager_shouldExposePasswordText(env, obj); |
| 193 env, obj.obj()); | |
| 194 } | 193 } |
| 195 | 194 |
| 196 BrowserAccessibility* BrowserAccessibilityManagerAndroid::GetFocus() { | 195 BrowserAccessibility* BrowserAccessibilityManagerAndroid::GetFocus() { |
| 197 BrowserAccessibility* focus = BrowserAccessibilityManager::GetFocus(); | 196 BrowserAccessibility* focus = BrowserAccessibilityManager::GetFocus(); |
| 198 return GetActiveDescendant(focus); | 197 return GetActiveDescendant(focus); |
| 199 } | 198 } |
| 200 | 199 |
| 201 void BrowserAccessibilityManagerAndroid::NotifyAccessibilityEvent( | 200 void BrowserAccessibilityManagerAndroid::NotifyAccessibilityEvent( |
| 202 BrowserAccessibilityEvent::Source source, | 201 BrowserAccessibilityEvent::Source source, |
| 203 ui::AXEvent event_type, | 202 ui::AXEvent event_type, |
| (...skipping 18 matching lines...) Expand all Loading... |
| 222 return; | 221 return; |
| 223 | 222 |
| 224 if (event_type == ui::AX_EVENT_HOVER) { | 223 if (event_type == ui::AX_EVENT_HOVER) { |
| 225 HandleHoverEvent(node); | 224 HandleHoverEvent(node); |
| 226 return; | 225 return; |
| 227 } | 226 } |
| 228 | 227 |
| 229 // Always send AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED to notify | 228 // Always send AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED to notify |
| 230 // the Android system that the accessibility hierarchy rooted at this | 229 // the Android system that the accessibility hierarchy rooted at this |
| 231 // node has changed. | 230 // node has changed. |
| 232 Java_BrowserAccessibilityManager_handleContentChanged( | 231 Java_BrowserAccessibilityManager_handleContentChanged(env, obj, |
| 233 env, obj.obj(), node->unique_id()); | 232 node->unique_id()); |
| 234 | 233 |
| 235 // Ignore load complete events on iframes. | 234 // Ignore load complete events on iframes. |
| 236 if (event_type == ui::AX_EVENT_LOAD_COMPLETE && | 235 if (event_type == ui::AX_EVENT_LOAD_COMPLETE && |
| 237 node->manager() != GetRootManager()) { | 236 node->manager() != GetRootManager()) { |
| 238 return; | 237 return; |
| 239 } | 238 } |
| 240 | 239 |
| 241 switch (event_type) { | 240 switch (event_type) { |
| 242 case ui::AX_EVENT_LOAD_COMPLETE: | 241 case ui::AX_EVENT_LOAD_COMPLETE: |
| 243 Java_BrowserAccessibilityManager_handlePageLoaded( | 242 Java_BrowserAccessibilityManager_handlePageLoaded( |
| 244 env, obj.obj(), GetFocus()->unique_id()); | 243 env, obj, GetFocus()->unique_id()); |
| 245 break; | 244 break; |
| 246 case ui::AX_EVENT_FOCUS: | 245 case ui::AX_EVENT_FOCUS: |
| 247 Java_BrowserAccessibilityManager_handleFocusChanged( | 246 Java_BrowserAccessibilityManager_handleFocusChanged(env, obj, |
| 248 env, obj.obj(), node->unique_id()); | 247 node->unique_id()); |
| 249 break; | 248 break; |
| 250 case ui::AX_EVENT_CHECKED_STATE_CHANGED: | 249 case ui::AX_EVENT_CHECKED_STATE_CHANGED: |
| 251 Java_BrowserAccessibilityManager_handleCheckStateChanged( | 250 Java_BrowserAccessibilityManager_handleCheckStateChanged( |
| 252 env, obj.obj(), node->unique_id()); | 251 env, obj, node->unique_id()); |
| 253 break; | 252 break; |
| 254 case ui::AX_EVENT_CLICKED: | 253 case ui::AX_EVENT_CLICKED: |
| 255 Java_BrowserAccessibilityManager_handleClicked(env, obj.obj(), | 254 Java_BrowserAccessibilityManager_handleClicked(env, obj, |
| 256 node->unique_id()); | 255 node->unique_id()); |
| 257 break; | 256 break; |
| 258 case ui::AX_EVENT_SCROLL_POSITION_CHANGED: | 257 case ui::AX_EVENT_SCROLL_POSITION_CHANGED: |
| 259 Java_BrowserAccessibilityManager_handleScrollPositionChanged( | 258 Java_BrowserAccessibilityManager_handleScrollPositionChanged( |
| 260 env, obj.obj(), node->unique_id()); | 259 env, obj, node->unique_id()); |
| 261 break; | 260 break; |
| 262 case ui::AX_EVENT_SCROLLED_TO_ANCHOR: | 261 case ui::AX_EVENT_SCROLLED_TO_ANCHOR: |
| 263 Java_BrowserAccessibilityManager_handleScrolledToAnchor( | 262 Java_BrowserAccessibilityManager_handleScrolledToAnchor( |
| 264 env, obj.obj(), node->unique_id()); | 263 env, obj, node->unique_id()); |
| 265 break; | 264 break; |
| 266 case ui::AX_EVENT_ALERT: | 265 case ui::AX_EVENT_ALERT: |
| 267 // An alert is a special case of live region. Fall through to the | 266 // An alert is a special case of live region. Fall through to the |
| 268 // next case to handle it. | 267 // next case to handle it. |
| 269 case ui::AX_EVENT_SHOW: { | 268 case ui::AX_EVENT_SHOW: { |
| 270 // This event is fired when an object appears in a live region. | 269 // This event is fired when an object appears in a live region. |
| 271 // Speak its text. | 270 // Speak its text. |
| 272 Java_BrowserAccessibilityManager_announceLiveRegionText( | 271 Java_BrowserAccessibilityManager_announceLiveRegionText( |
| 273 env, obj.obj(), | 272 env, obj, base::android::ConvertUTF16ToJavaString( |
| 274 base::android::ConvertUTF16ToJavaString( | 273 env, android_node->GetText())); |
| 275 env, android_node->GetText()).obj()); | |
| 276 break; | 274 break; |
| 277 } | 275 } |
| 278 case ui::AX_EVENT_TEXT_SELECTION_CHANGED: | 276 case ui::AX_EVENT_TEXT_SELECTION_CHANGED: |
| 279 Java_BrowserAccessibilityManager_handleTextSelectionChanged( | 277 Java_BrowserAccessibilityManager_handleTextSelectionChanged( |
| 280 env, obj.obj(), node->unique_id()); | 278 env, obj, node->unique_id()); |
| 281 break; | 279 break; |
| 282 case ui::AX_EVENT_TEXT_CHANGED: | 280 case ui::AX_EVENT_TEXT_CHANGED: |
| 283 case ui::AX_EVENT_VALUE_CHANGED: | 281 case ui::AX_EVENT_VALUE_CHANGED: |
| 284 if (android_node->IsEditableText() && GetFocus() == node) { | 282 if (android_node->IsEditableText() && GetFocus() == node) { |
| 285 Java_BrowserAccessibilityManager_handleEditableTextChanged( | 283 Java_BrowserAccessibilityManager_handleEditableTextChanged( |
| 286 env, obj.obj(), node->unique_id()); | 284 env, obj, node->unique_id()); |
| 287 } else if (android_node->IsSlider()) { | 285 } else if (android_node->IsSlider()) { |
| 288 Java_BrowserAccessibilityManager_handleSliderChanged( | 286 Java_BrowserAccessibilityManager_handleSliderChanged(env, obj, |
| 289 env, obj.obj(), node->unique_id()); | 287 node->unique_id()); |
| 290 } | 288 } |
| 291 break; | 289 break; |
| 292 default: | 290 default: |
| 293 // There are some notifications that aren't meaningful on Android. | 291 // There are some notifications that aren't meaningful on Android. |
| 294 // It's okay to skip them. | 292 // It's okay to skip them. |
| 295 break; | 293 break; |
| 296 } | 294 } |
| 297 } | 295 } |
| 298 | 296 |
| 299 void BrowserAccessibilityManagerAndroid::SendLocationChangeEvents( | 297 void BrowserAccessibilityManagerAndroid::SendLocationChangeEvents( |
| 300 const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { | 298 const std::vector<AccessibilityHostMsg_LocationChangeParams>& params) { |
| 301 // Android is not very efficient at handling notifications, and location | 299 // Android is not very efficient at handling notifications, and location |
| 302 // changes in particular are frequent and not time-critical. If a lot of | 300 // changes in particular are frequent and not time-critical. If a lot of |
| 303 // nodes changed location, just send a single notification after a short | 301 // nodes changed location, just send a single notification after a short |
| 304 // delay (to batch them), rather than lots of individual notifications. | 302 // delay (to batch them), rather than lots of individual notifications. |
| 305 if (params.size() > 3) { | 303 if (params.size() > 3) { |
| 306 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); | 304 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); |
| 307 JNIEnv* env = AttachCurrentThread(); | 305 JNIEnv* env = AttachCurrentThread(); |
| 308 if (obj.is_null()) | 306 if (obj.is_null()) |
| 309 return; | 307 return; |
| 310 Java_BrowserAccessibilityManager_sendDelayedWindowContentChangedEvent( | 308 Java_BrowserAccessibilityManager_sendDelayedWindowContentChangedEvent(env, |
| 311 env, obj.obj()); | 309 obj); |
| 312 return; | 310 return; |
| 313 } | 311 } |
| 314 | 312 |
| 315 BrowserAccessibilityManager::SendLocationChangeEvents(params); | 313 BrowserAccessibilityManager::SendLocationChangeEvents(params); |
| 316 } | 314 } |
| 317 | 315 |
| 318 base::android::ScopedJavaLocalRef<jstring> | 316 base::android::ScopedJavaLocalRef<jstring> |
| 319 BrowserAccessibilityManagerAndroid::GetSupportedHtmlElementTypes( | 317 BrowserAccessibilityManagerAndroid::GetSupportedHtmlElementTypes( |
| 320 JNIEnv* env, | 318 JNIEnv* env, |
| 321 const JavaParamRef<jobject>& obj) { | 319 const JavaParamRef<jobject>& obj) { |
| (...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 node->CanScrollDown(), | 418 node->CanScrollDown(), |
| 421 node->CanScrollLeft(), | 419 node->CanScrollLeft(), |
| 422 node->CanScrollRight(), | 420 node->CanScrollRight(), |
| 423 node->IsClickable(), | 421 node->IsClickable(), |
| 424 node->IsEditableText(), | 422 node->IsEditableText(), |
| 425 node->IsEnabled(), | 423 node->IsEnabled(), |
| 426 node->IsFocusable(), | 424 node->IsFocusable(), |
| 427 node->IsFocused()); | 425 node->IsFocused()); |
| 428 Java_BrowserAccessibilityManager_setAccessibilityNodeInfoClassName( | 426 Java_BrowserAccessibilityManager_setAccessibilityNodeInfoClassName( |
| 429 env, obj, info, | 427 env, obj, info, |
| 430 base::android::ConvertUTF8ToJavaString(env, node->GetClassName()).obj()); | 428 base::android::ConvertUTF8ToJavaString(env, node->GetClassName())); |
| 431 Java_BrowserAccessibilityManager_setAccessibilityNodeInfoText( | 429 Java_BrowserAccessibilityManager_setAccessibilityNodeInfoText( |
| 432 env, obj, info, | 430 env, obj, info, |
| 433 base::android::ConvertUTF16ToJavaString(env, node->GetText()).obj(), | 431 base::android::ConvertUTF16ToJavaString(env, node->GetText()), |
| 434 node->IsLink(), | 432 node->IsLink(), node->IsEditableText()); |
| 435 node->IsEditableText()); | |
| 436 base::string16 element_id; | 433 base::string16 element_id; |
| 437 if (node->GetHtmlAttribute("id", &element_id)) { | 434 if (node->GetHtmlAttribute("id", &element_id)) { |
| 438 Java_BrowserAccessibilityManager_setAccessibilityNodeInfoViewIdResourceName( | 435 Java_BrowserAccessibilityManager_setAccessibilityNodeInfoViewIdResourceName( |
| 439 env, obj, info, | 436 env, obj, info, |
| 440 base::android::ConvertUTF16ToJavaString(env, element_id).obj()); | 437 base::android::ConvertUTF16ToJavaString(env, element_id)); |
| 441 } | 438 } |
| 442 | 439 |
| 443 gfx::Rect absolute_rect = node->GetPageBoundsRect(); | 440 gfx::Rect absolute_rect = node->GetPageBoundsRect(); |
| 444 gfx::Rect parent_relative_rect = absolute_rect; | 441 gfx::Rect parent_relative_rect = absolute_rect; |
| 445 if (node->GetParent()) { | 442 if (node->GetParent()) { |
| 446 gfx::Rect parent_rect = node->GetParent()->GetPageBoundsRect(); | 443 gfx::Rect parent_rect = node->GetParent()->GetPageBoundsRect(); |
| 447 parent_relative_rect.Offset(-parent_rect.OffsetFromOrigin()); | 444 parent_relative_rect.Offset(-parent_rect.OffsetFromOrigin()); |
| 448 } | 445 } |
| 449 bool is_root = node->GetParent() == NULL; | 446 bool is_root = node->GetParent() == NULL; |
| 450 Java_BrowserAccessibilityManager_setAccessibilityNodeInfoLocation( | 447 Java_BrowserAccessibilityManager_setAccessibilityNodeInfoLocation( |
| 451 env, obj, info, | 448 env, obj, info, |
| 452 id, | 449 id, |
| 453 absolute_rect.x(), absolute_rect.y(), | 450 absolute_rect.x(), absolute_rect.y(), |
| 454 parent_relative_rect.x(), parent_relative_rect.y(), | 451 parent_relative_rect.x(), parent_relative_rect.y(), |
| 455 absolute_rect.width(), absolute_rect.height(), | 452 absolute_rect.width(), absolute_rect.height(), |
| 456 is_root); | 453 is_root); |
| 457 | 454 |
| 458 Java_BrowserAccessibilityManager_setAccessibilityNodeInfoKitKatAttributes( | 455 Java_BrowserAccessibilityManager_setAccessibilityNodeInfoKitKatAttributes( |
| 459 env, obj, info, | 456 env, obj, info, is_root, node->IsEditableText(), |
| 460 is_root, | 457 base::android::ConvertUTF16ToJavaString(env, node->GetRoleDescription())); |
| 461 node->IsEditableText(), | |
| 462 base::android::ConvertUTF16ToJavaString( | |
| 463 env, node->GetRoleDescription()).obj()); | |
| 464 | 458 |
| 465 Java_BrowserAccessibilityManager_setAccessibilityNodeInfoLollipopAttributes( | 459 Java_BrowserAccessibilityManager_setAccessibilityNodeInfoLollipopAttributes( |
| 466 env, obj, info, | 460 env, obj, info, |
| 467 node->CanOpenPopup(), | 461 node->CanOpenPopup(), |
| 468 node->IsContentInvalid(), | 462 node->IsContentInvalid(), |
| 469 node->IsDismissable(), | 463 node->IsDismissable(), |
| 470 node->IsMultiLine(), | 464 node->IsMultiLine(), |
| 471 node->AndroidInputType(), | 465 node->AndroidInputType(), |
| 472 node->AndroidLiveRegionType()); | 466 node->AndroidLiveRegionType()); |
| 473 if (node->IsCollection()) { | 467 if (node->IsCollection()) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 509 return false; | 503 return false; |
| 510 | 504 |
| 511 Java_BrowserAccessibilityManager_setAccessibilityEventBooleanAttributes( | 505 Java_BrowserAccessibilityManager_setAccessibilityEventBooleanAttributes( |
| 512 env, obj, event, | 506 env, obj, event, |
| 513 node->IsChecked(), | 507 node->IsChecked(), |
| 514 node->IsEnabled(), | 508 node->IsEnabled(), |
| 515 node->IsPassword(), | 509 node->IsPassword(), |
| 516 node->IsScrollable()); | 510 node->IsScrollable()); |
| 517 Java_BrowserAccessibilityManager_setAccessibilityEventClassName( | 511 Java_BrowserAccessibilityManager_setAccessibilityEventClassName( |
| 518 env, obj, event, | 512 env, obj, event, |
| 519 base::android::ConvertUTF8ToJavaString(env, node->GetClassName()).obj()); | 513 base::android::ConvertUTF8ToJavaString(env, node->GetClassName())); |
| 520 Java_BrowserAccessibilityManager_setAccessibilityEventListAttributes( | 514 Java_BrowserAccessibilityManager_setAccessibilityEventListAttributes( |
| 521 env, obj, event, | 515 env, obj, event, |
| 522 node->GetItemIndex(), | 516 node->GetItemIndex(), |
| 523 node->GetItemCount()); | 517 node->GetItemCount()); |
| 524 Java_BrowserAccessibilityManager_setAccessibilityEventScrollAttributes( | 518 Java_BrowserAccessibilityManager_setAccessibilityEventScrollAttributes( |
| 525 env, obj, event, | 519 env, obj, event, |
| 526 node->GetScrollX(), | 520 node->GetScrollX(), |
| 527 node->GetScrollY(), | 521 node->GetScrollY(), |
| 528 node->GetMaxScrollX(), | 522 node->GetMaxScrollX(), |
| 529 node->GetMaxScrollY()); | 523 node->GetMaxScrollY()); |
| 530 | 524 |
| 531 switch (event_type) { | 525 switch (event_type) { |
| 532 case ANDROID_ACCESSIBILITY_EVENT_TEXT_CHANGED: { | 526 case ANDROID_ACCESSIBILITY_EVENT_TEXT_CHANGED: { |
| 533 base::string16 before_text = node->GetTextChangeBeforeText(); | 527 base::string16 before_text = node->GetTextChangeBeforeText(); |
| 534 base::string16 text = node->GetText(); | 528 base::string16 text = node->GetText(); |
| 535 Java_BrowserAccessibilityManager_setAccessibilityEventTextChangedAttrs( | 529 Java_BrowserAccessibilityManager_setAccessibilityEventTextChangedAttrs( |
| 536 env, obj, event, | 530 env, obj, event, node->GetTextChangeFromIndex(), |
| 537 node->GetTextChangeFromIndex(), | 531 node->GetTextChangeAddedCount(), node->GetTextChangeRemovedCount(), |
| 538 node->GetTextChangeAddedCount(), | 532 base::android::ConvertUTF16ToJavaString(env, before_text), |
| 539 node->GetTextChangeRemovedCount(), | 533 base::android::ConvertUTF16ToJavaString(env, text)); |
| 540 base::android::ConvertUTF16ToJavaString( | |
| 541 env, before_text).obj(), | |
| 542 base::android::ConvertUTF16ToJavaString(env, text).obj()); | |
| 543 break; | 534 break; |
| 544 } | 535 } |
| 545 case ANDROID_ACCESSIBILITY_EVENT_TEXT_SELECTION_CHANGED: { | 536 case ANDROID_ACCESSIBILITY_EVENT_TEXT_SELECTION_CHANGED: { |
| 546 base::string16 text = node->GetText(); | 537 base::string16 text = node->GetText(); |
| 547 Java_BrowserAccessibilityManager_setAccessibilityEventSelectionAttrs( | 538 Java_BrowserAccessibilityManager_setAccessibilityEventSelectionAttrs( |
| 548 env, obj, event, | 539 env, obj, event, node->GetSelectionStart(), node->GetSelectionEnd(), |
| 549 node->GetSelectionStart(), | |
| 550 node->GetSelectionEnd(), | |
| 551 node->GetEditableTextLength(), | 540 node->GetEditableTextLength(), |
| 552 base::android::ConvertUTF16ToJavaString(env, text).obj()); | 541 base::android::ConvertUTF16ToJavaString(env, text)); |
| 553 break; | 542 break; |
| 554 } | 543 } |
| 555 default: | 544 default: |
| 556 break; | 545 break; |
| 557 } | 546 } |
| 558 | 547 |
| 559 Java_BrowserAccessibilityManager_setAccessibilityEventLollipopAttributes( | 548 Java_BrowserAccessibilityManager_setAccessibilityEventLollipopAttributes( |
| 560 env, obj, event, | 549 env, obj, event, |
| 561 node->CanOpenPopup(), | 550 node->CanOpenPopup(), |
| 562 node->IsContentInvalid(), | 551 node->IsContentInvalid(), |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 696 while (ancestor && ancestor != GetRoot()) { | 685 while (ancestor && ancestor != GetRoot()) { |
| 697 if (ancestor->PlatformIsLeaf() || | 686 if (ancestor->PlatformIsLeaf() || |
| 698 (ancestor->IsFocusable() && !ancestor->HasFocusableChild())) { | 687 (ancestor->IsFocusable() && !ancestor->HasFocusableChild())) { |
| 699 node = ancestor; | 688 node = ancestor; |
| 700 // Don't break - we want the highest ancestor that's focusable or a | 689 // Don't break - we want the highest ancestor that's focusable or a |
| 701 // leaf node. | 690 // leaf node. |
| 702 } | 691 } |
| 703 ancestor = static_cast<BrowserAccessibilityAndroid*>(ancestor->GetParent()); | 692 ancestor = static_cast<BrowserAccessibilityAndroid*>(ancestor->GetParent()); |
| 704 } | 693 } |
| 705 | 694 |
| 706 Java_BrowserAccessibilityManager_handleHover( | 695 Java_BrowserAccessibilityManager_handleHover(env, obj, node->unique_id()); |
| 707 env, obj.obj(), node->unique_id()); | |
| 708 } | 696 } |
| 709 | 697 |
| 710 jint BrowserAccessibilityManagerAndroid::FindElementType( | 698 jint BrowserAccessibilityManagerAndroid::FindElementType( |
| 711 JNIEnv* env, | 699 JNIEnv* env, |
| 712 const JavaParamRef<jobject>& obj, | 700 const JavaParamRef<jobject>& obj, |
| 713 jint start_id, | 701 jint start_id, |
| 714 const JavaParamRef<jstring>& element_type_str, | 702 const JavaParamRef<jstring>& element_type_str, |
| 715 jboolean forwards) { | 703 jboolean forwards) { |
| 716 BrowserAccessibilityAndroid* start_node = GetFromUniqueID(start_id); | 704 BrowserAccessibilityAndroid* start_node = GetFromUniqueID(start_id); |
| 717 if (!start_node) | 705 if (!start_node) |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 755 BrowserAccessibilityAndroid* node = GetFromUniqueID(id); | 743 BrowserAccessibilityAndroid* node = GetFromUniqueID(id); |
| 756 if (!node) | 744 if (!node) |
| 757 return false; | 745 return false; |
| 758 | 746 |
| 759 jint start_index = -1; | 747 jint start_index = -1; |
| 760 int end_index = -1; | 748 int end_index = -1; |
| 761 if (NextAtGranularity(granularity, cursor_index, node, | 749 if (NextAtGranularity(granularity, cursor_index, node, |
| 762 &start_index, &end_index)) { | 750 &start_index, &end_index)) { |
| 763 base::string16 text = node->GetText(); | 751 base::string16 text = node->GetText(); |
| 764 Java_BrowserAccessibilityManager_finishGranularityMove( | 752 Java_BrowserAccessibilityManager_finishGranularityMove( |
| 765 env, obj, base::android::ConvertUTF16ToJavaString( | 753 env, obj, base::android::ConvertUTF16ToJavaString(env, text), |
| 766 env, text).obj(), | |
| 767 extend_selection, start_index, end_index, true); | 754 extend_selection, start_index, end_index, true); |
| 768 return true; | 755 return true; |
| 769 } | 756 } |
| 770 return false; | 757 return false; |
| 771 } | 758 } |
| 772 | 759 |
| 773 jboolean BrowserAccessibilityManagerAndroid::PreviousAtGranularity( | 760 jboolean BrowserAccessibilityManagerAndroid::PreviousAtGranularity( |
| 774 JNIEnv* env, | 761 JNIEnv* env, |
| 775 const JavaParamRef<jobject>& obj, | 762 const JavaParamRef<jobject>& obj, |
| 776 jint granularity, | 763 jint granularity, |
| 777 jboolean extend_selection, | 764 jboolean extend_selection, |
| 778 jint id, | 765 jint id, |
| 779 jint cursor_index) { | 766 jint cursor_index) { |
| 780 BrowserAccessibilityAndroid* node = GetFromUniqueID(id); | 767 BrowserAccessibilityAndroid* node = GetFromUniqueID(id); |
| 781 if (!node) | 768 if (!node) |
| 782 return false; | 769 return false; |
| 783 | 770 |
| 784 jint start_index = -1; | 771 jint start_index = -1; |
| 785 int end_index = -1; | 772 int end_index = -1; |
| 786 if (PreviousAtGranularity(granularity, cursor_index, node, | 773 if (PreviousAtGranularity(granularity, cursor_index, node, |
| 787 &start_index, &end_index)) { | 774 &start_index, &end_index)) { |
| 788 Java_BrowserAccessibilityManager_finishGranularityMove( | 775 Java_BrowserAccessibilityManager_finishGranularityMove( |
| 789 env, obj, base::android::ConvertUTF16ToJavaString( | 776 env, obj, base::android::ConvertUTF16ToJavaString(env, node->GetText()), |
| 790 env, node->GetText()).obj(), | |
| 791 extend_selection, start_index, end_index, false); | 777 extend_selection, start_index, end_index, false); |
| 792 return true; | 778 return true; |
| 793 } | 779 } |
| 794 return false; | 780 return false; |
| 795 } | 781 } |
| 796 | 782 |
| 797 bool BrowserAccessibilityManagerAndroid::NextAtGranularity( | 783 bool BrowserAccessibilityManagerAndroid::NextAtGranularity( |
| 798 int32_t granularity, | 784 int32_t granularity, |
| 799 int32_t cursor_index, | 785 int32_t cursor_index, |
| 800 BrowserAccessibilityAndroid* node, | 786 BrowserAccessibilityAndroid* node, |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 922 const std::vector<ui::AXTreeDelegate::Change>& changes) { | 908 const std::vector<ui::AXTreeDelegate::Change>& changes) { |
| 923 BrowserAccessibilityManager::OnAtomicUpdateFinished( | 909 BrowserAccessibilityManager::OnAtomicUpdateFinished( |
| 924 tree, root_changed, changes); | 910 tree, root_changed, changes); |
| 925 | 911 |
| 926 if (root_changed) { | 912 if (root_changed) { |
| 927 JNIEnv* env = AttachCurrentThread(); | 913 JNIEnv* env = AttachCurrentThread(); |
| 928 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); | 914 ScopedJavaLocalRef<jobject> obj = GetJavaRefFromRootManager(); |
| 929 if (obj.is_null()) | 915 if (obj.is_null()) |
| 930 return; | 916 return; |
| 931 | 917 |
| 932 Java_BrowserAccessibilityManager_handleNavigate(env, obj.obj()); | 918 Java_BrowserAccessibilityManager_handleNavigate(env, obj); |
| 933 } | 919 } |
| 934 } | 920 } |
| 935 | 921 |
| 936 bool | 922 bool |
| 937 BrowserAccessibilityManagerAndroid::UseRootScrollOffsetsWhenComputingBounds() { | 923 BrowserAccessibilityManagerAndroid::UseRootScrollOffsetsWhenComputingBounds() { |
| 938 // The Java layer handles the root scroll offset. | 924 // The Java layer handles the root scroll offset. |
| 939 return false; | 925 return false; |
| 940 } | 926 } |
| 941 | 927 |
| 942 BrowserAccessibilityAndroid* | 928 BrowserAccessibilityAndroid* |
| (...skipping 12 matching lines...) Expand all Loading... |
| 955 | 941 |
| 956 JNIEnv* env = AttachCurrentThread(); | 942 JNIEnv* env = AttachCurrentThread(); |
| 957 return root_manager->java_ref().get(env); | 943 return root_manager->java_ref().get(env); |
| 958 } | 944 } |
| 959 | 945 |
| 960 bool RegisterBrowserAccessibilityManager(JNIEnv* env) { | 946 bool RegisterBrowserAccessibilityManager(JNIEnv* env) { |
| 961 return RegisterNativesImpl(env); | 947 return RegisterNativesImpl(env); |
| 962 } | 948 } |
| 963 | 949 |
| 964 } // namespace content | 950 } // namespace content |
| OLD | NEW |