Chromium Code Reviews| Index: content/browser/web_contents/web_contents_android.cc |
| diff --git a/content/browser/web_contents/web_contents_android.cc b/content/browser/web_contents/web_contents_android.cc |
| index 033dcee5d2183e3567339f0af22c3d73d4cc43da..99ab35b20ed82b6d3583316c2d1d1f445bd77f51 100644 |
| --- a/content/browser/web_contents/web_contents_android.cc |
| +++ b/content/browser/web_contents/web_contents_android.cc |
| @@ -38,6 +38,7 @@ |
| #include "jni/WebContentsImpl_jni.h" |
| #include "net/android/network_library.h" |
| #include "ui/accessibility/ax_node_data.h" |
| +#include "ui/accessibility/platform/ax_android_snapshot.h" |
| #include "ui/android/overscroll_refresh_handler.h" |
| #include "ui/android/window_android.h" |
| #include "ui/gfx/android/java_bitmap.h" |
| @@ -82,90 +83,29 @@ void SmartClipCallback(const ScopedJavaGlobalRef<jobject>& callback, |
| Java_WebContentsImpl_onSmartClipDataExtracted(env, jtext, jhtml, callback); |
| } |
| -struct AccessibilitySnapshotParams { |
| - AccessibilitySnapshotParams() |
| - : has_tree_data(false), should_select_leaf_nodes(false) {} |
| - |
| - bool has_tree_data; |
| - // The current text selection within this tree, if any, expressed as the |
| - // node ID and character offset of the anchor (selection start) and focus |
| - // (selection end). |
| - int32_t sel_anchor_object_id; |
| - int32_t sel_anchor_offset; |
| - int32_t sel_focus_object_id; |
| - int32_t sel_focus_offset; |
| - // if the flag is true, mark the leaf node as selected. |
| - bool should_select_leaf_nodes; |
| -}; |
| - |
| -ScopedJavaLocalRef<jobject> WalkAXTreeDepthFirst( |
| +ScopedJavaLocalRef<jobject> CreateJavaAXSnapshot( |
| JNIEnv* env, |
| - BrowserAccessibilityAndroid* node, |
| - const gfx::Rect& parent_rect, |
| - AccessibilitySnapshotParams* params) { |
| + const ui::AXSnapshotNodeAndroid* node, |
| + bool is_root) { |
| ScopedJavaLocalRef<jstring> j_text = |
| - ConvertUTF16ToJavaString(env, node->GetText()); |
| + ConvertUTF16ToJavaString(env, node->text); |
| ScopedJavaLocalRef<jstring> j_class = |
| - ConvertUTF8ToJavaString(env, node->GetClassName()); |
| - // The style attributes exists and valid if size attribute exists. Otherwise, |
| - // they are not. Use a negative size information to indicate the existence |
| - // of style information. |
| - float size = -1.0; |
| - int color = 0; |
| - int bgcolor = 0; |
| - int text_style = 0; |
| - |
| - if (node->HasFloatAttribute(ui::AX_ATTR_FONT_SIZE)) { |
| - color = node->GetIntAttribute(ui::AX_ATTR_COLOR); |
| - bgcolor = node->GetIntAttribute(ui::AX_ATTR_BACKGROUND_COLOR); |
| - text_style = node->GetIntAttribute(ui::AX_ATTR_TEXT_STYLE); |
| - |
| - // The font size is just the computed style for that element; apply |
| - // transformations to get the actual pixel size. |
| - gfx::RectF text_size_rect( |
| - 0, 0, 1, node->GetFloatAttribute(ui::AX_ATTR_FONT_SIZE)); |
| - gfx::Rect scaled_text_size_rect = node->RelativeToAbsoluteBounds( |
| - text_size_rect, false); |
| - size = scaled_text_size_rect.height(); |
| - } |
| - |
| - const gfx::Rect& absolute_rect = node->GetPageBoundsRect(); |
| - gfx::Rect parent_relative_rect = absolute_rect; |
| - bool is_root = node->PlatformGetParent() == nullptr; |
| - if (!is_root) { |
| - parent_relative_rect.Offset(-parent_rect.OffsetFromOrigin()); |
| - } |
| + ConvertUTF8ToJavaString(env, node->class_name); |
| ScopedJavaLocalRef<jobject> j_node = |
| Java_WebContentsImpl_createAccessibilitySnapshotNode( |
| - env, parent_relative_rect.x(), parent_relative_rect.y(), |
| - absolute_rect.width(), absolute_rect.height(), is_root, j_text, color, |
| - bgcolor, size, text_style, j_class); |
| - |
| - if (params->has_tree_data && node->PlatformIsLeaf()) { |
| - int start_selection = 0; |
| - int end_selection = 0; |
| - if (params->sel_anchor_object_id == node->GetId()) { |
| - start_selection = params->sel_anchor_offset; |
| - params->should_select_leaf_nodes = true; |
| - } |
| - if (params->should_select_leaf_nodes) |
| - end_selection = node->GetText().length(); |
| - |
| - if (params->sel_focus_object_id == node->GetId()) { |
| - end_selection = params->sel_focus_offset; |
| - params->should_select_leaf_nodes = false; |
| - } |
| - if (end_selection > 0) |
| - Java_WebContentsImpl_setAccessibilitySnapshotSelection( |
| - env, j_node, start_selection, end_selection); |
| + env, node->rect.x(), node->rect.y(), node->rect.width(), |
| + node->rect.height(), is_root, j_text, node->color, node->bgcolor, |
| + node->text_size, node->bold, node->italic, node->underline, |
| + node->line_through, j_class); |
| + |
| + if (node->has_selection) { |
| + Java_WebContentsImpl_setAccessibilitySnapshotSelection( |
| + env, j_node, node->start_selection, node->end_selection); |
| } |
| - for (uint32_t i = 0; i < node->PlatformChildCount(); i++) { |
| - BrowserAccessibilityAndroid* child = |
| - static_cast<BrowserAccessibilityAndroid*>( |
| - node->PlatformGetChild(i)); |
| + for (auto& child : node->children) { |
| Java_WebContentsImpl_addAccessibilityNodeAsChild( |
| - env, j_node, WalkAXTreeDepthFirst(env, child, absolute_rect, params)); |
| + env, j_node, CreateJavaAXSnapshot(env, child.get(), false)); |
| } |
| return j_node; |
| } |
| @@ -178,23 +118,9 @@ void AXTreeSnapshotCallback(const ScopedJavaGlobalRef<jobject>& callback, |
| Java_WebContentsImpl_onAccessibilitySnapshot(env, nullptr, callback); |
| return; |
| } |
| - std::unique_ptr<BrowserAccessibilityManagerAndroid> manager( |
| - static_cast<BrowserAccessibilityManagerAndroid*>( |
| - BrowserAccessibilityManager::Create(result, nullptr))); |
| - manager->set_prune_tree_for_screen_reader(false); |
|
sgurun-gerrit only
2017/04/20 23:25:01
where is this code now?
Muyuan
2017/04/21 18:45:11
The code logic is consistent with this path taken.
sgurun-gerrit only
2017/04/21 21:48:22
I don't know this part of the code well so leaving
|
| - BrowserAccessibilityAndroid* root = |
| - static_cast<BrowserAccessibilityAndroid*>(manager->GetRoot()); |
| - AccessibilitySnapshotParams params; |
| - if (result.has_tree_data) { |
| - params.has_tree_data = true; |
| - params.sel_anchor_object_id = result.tree_data.sel_anchor_object_id; |
| - params.sel_anchor_offset = result.tree_data.sel_anchor_offset; |
| - params.sel_focus_object_id = result.tree_data.sel_focus_object_id; |
| - params.sel_focus_offset = result.tree_data.sel_focus_offset; |
| - } |
| - gfx::Rect parent_rect; |
| + auto snapshot = ui::AXSnapshotNodeAndroid::Create(result); |
| ScopedJavaLocalRef<jobject> j_root = |
| - WalkAXTreeDepthFirst(env, root, parent_rect, ¶ms); |
| + CreateJavaAXSnapshot(env, snapshot.get(), true); |
| Java_WebContentsImpl_onAccessibilitySnapshot(env, j_root, callback); |
| } |