OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/renderer/accessibility/blink_ax_tree_source.h" | 5 #include "content/renderer/accessibility/blink_ax_tree_source.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 | 8 |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
125 bool BlinkAXTreeSource::IsInTree(blink::WebAXObject node) const { | 125 bool BlinkAXTreeSource::IsInTree(blink::WebAXObject node) const { |
126 const blink::WebAXObject& root = GetRoot(); | 126 const blink::WebAXObject& root = GetRoot(); |
127 while (IsValid(node)) { | 127 while (IsValid(node)) { |
128 if (node.equals(root)) | 128 if (node.equals(root)) |
129 return true; | 129 return true; |
130 node = GetParent(node); | 130 node = GetParent(node); |
131 } | 131 } |
132 return false; | 132 return false; |
133 } | 133 } |
134 | 134 |
| 135 AXContentTreeData BlinkAXTreeSource::GetTreeData() const { |
| 136 AXContentTreeData tree_data; |
| 137 |
| 138 blink::WebDocument document = BlinkAXTreeSource::GetMainDocument(); |
| 139 const blink::WebAXObject& root = GetRoot(); |
| 140 |
| 141 tree_data.title = document.title().utf8(); |
| 142 tree_data.url = document.url().spec(); |
| 143 tree_data.mimetype = document.isXHTMLDocument() ? "text/xhtml" : "text/html"; |
| 144 tree_data.loaded = root.isLoaded(); |
| 145 tree_data.loading_progress = root.estimatedLoadingProgress(); |
| 146 |
| 147 const WebDocumentType& doctype = document.doctype(); |
| 148 if (!doctype.isNull()) |
| 149 tree_data.doctype = UTF16ToUTF8(base::StringPiece16(doctype.name())); |
| 150 |
| 151 WebAXObject anchor_object, focus_object; |
| 152 int anchor_offset, focus_offset; |
| 153 root.selection(anchor_object, anchor_offset, focus_object, focus_offset); |
| 154 if (!anchor_object.isNull() && !focus_object.isNull() && |
| 155 anchor_offset >= 0 && focus_offset >= 0) { |
| 156 int32 anchor_id = anchor_object.axID(); |
| 157 int32 focus_id = focus_object.axID(); |
| 158 tree_data.sel_anchor_object_id = anchor_id; |
| 159 tree_data.sel_anchor_offset = anchor_offset; |
| 160 tree_data.sel_focus_object_id = focus_id; |
| 161 tree_data.sel_focus_offset = focus_offset; |
| 162 } |
| 163 |
| 164 // Get the tree ID for this frame and possibly the parent frame. |
| 165 WebLocalFrame* web_frame = document.frame(); |
| 166 if (web_frame) { |
| 167 RenderFrame* render_frame = RenderFrame::FromWebFrame(web_frame); |
| 168 tree_data.routing_id = render_frame->GetRoutingID(); |
| 169 |
| 170 // Get the tree ID for the parent frame, if it's remote. |
| 171 // (If it's local, it's already part of this same tree.) |
| 172 blink::WebFrame* parent_web_frame = web_frame->parent(); |
| 173 if (parent_web_frame && parent_web_frame->isWebRemoteFrame()) { |
| 174 RenderFrameProxy* parent_render_frame_proxy = |
| 175 RenderFrameProxy::FromWebFrame(parent_web_frame); |
| 176 tree_data.parent_routing_id = parent_render_frame_proxy->routing_id(); |
| 177 } |
| 178 } |
| 179 |
| 180 return tree_data; |
| 181 } |
| 182 |
135 blink::WebAXObject BlinkAXTreeSource::GetRoot() const { | 183 blink::WebAXObject BlinkAXTreeSource::GetRoot() const { |
136 if (!root_.isNull()) | 184 if (!root_.isNull()) |
137 return root_; | 185 return root_; |
138 return GetMainDocument().accessibilityObject(); | 186 return GetMainDocument().accessibilityObject(); |
139 } | 187 } |
140 | 188 |
141 blink::WebAXObject BlinkAXTreeSource::GetFromId(int32 id) const { | 189 blink::WebAXObject BlinkAXTreeSource::GetFromId(int32 id) const { |
142 return GetMainDocument().accessibilityObjectFromID(id); | 190 return GetMainDocument().accessibilityObjectFromID(id); |
143 } | 191 } |
144 | 192 |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 src.maxValueForRange()); | 524 src.maxValueForRange()); |
477 dst->AddFloatAttribute(ui::AX_ATTR_MIN_VALUE_FOR_RANGE, | 525 dst->AddFloatAttribute(ui::AX_ATTR_MIN_VALUE_FOR_RANGE, |
478 src.minValueForRange()); | 526 src.minValueForRange()); |
479 } | 527 } |
480 | 528 |
481 if (dst->role == ui::AX_ROLE_WEB_AREA) { | 529 if (dst->role == ui::AX_ROLE_WEB_AREA) { |
482 dst->AddStringAttribute(ui::AX_ATTR_HTML_TAG, "#document"); | 530 dst->AddStringAttribute(ui::AX_ATTR_HTML_TAG, "#document"); |
483 const WebDocument& document = src.document(); | 531 const WebDocument& document = src.document(); |
484 if (name.empty()) | 532 if (name.empty()) |
485 name = UTF16ToUTF8(base::StringPiece16(document.title())); | 533 name = UTF16ToUTF8(base::StringPiece16(document.title())); |
486 dst->AddStringAttribute( | |
487 ui::AX_ATTR_DOC_TITLE, | |
488 UTF16ToUTF8(base::StringPiece16(document.title()))); | |
489 dst->AddStringAttribute(ui::AX_ATTR_DOC_URL, document.url().spec()); | |
490 dst->AddStringAttribute( | |
491 ui::AX_ATTR_DOC_MIMETYPE, | |
492 document.isXHTMLDocument() ? "text/xhtml" : "text/html"); | |
493 dst->AddBoolAttribute(ui::AX_ATTR_DOC_LOADED, src.isLoaded()); | |
494 dst->AddFloatAttribute(ui::AX_ATTR_DOC_LOADING_PROGRESS, | |
495 src.estimatedLoadingProgress()); | |
496 | |
497 const WebDocumentType& doctype = document.doctype(); | |
498 if (!doctype.isNull()) { | |
499 dst->AddStringAttribute( | |
500 ui::AX_ATTR_DOC_DOCTYPE, | |
501 UTF16ToUTF8(base::StringPiece16(doctype.name()))); | |
502 } | |
503 | |
504 WebAXObject anchor_object, focus_object; | |
505 int anchor_offset, focus_offset; | |
506 src.selection(anchor_object, anchor_offset, focus_object, focus_offset); | |
507 if (!anchor_object.isNull() && !focus_object.isNull() && | |
508 anchor_offset >= 0 && focus_offset >= 0) { | |
509 int32 anchor_id = anchor_object.axID(); | |
510 int32 focus_id = focus_object.axID(); | |
511 dst->AddIntAttribute(ui::AX_ATTR_ANCHOR_OBJECT_ID, anchor_id); | |
512 dst->AddIntAttribute(ui::AX_ATTR_ANCHOR_OFFSET, anchor_offset); | |
513 dst->AddIntAttribute(ui::AX_ATTR_FOCUS_OBJECT_ID, focus_id); | |
514 dst->AddIntAttribute(ui::AX_ATTR_FOCUS_OFFSET, focus_offset); | |
515 } | |
516 | |
517 // Get the tree ID for this frame and possibly the parent frame. | |
518 WebLocalFrame* web_frame = document.frame(); | |
519 if (web_frame) { | |
520 RenderFrame* render_frame = RenderFrame::FromWebFrame(web_frame); | |
521 dst->AddContentIntAttribute( | |
522 AX_CONTENT_ATTR_ROUTING_ID, | |
523 render_frame->GetRoutingID()); | |
524 | |
525 // Get the tree ID for the parent frame, if it's remote. | |
526 // (If it's local, it's already part of this same tree.) | |
527 blink::WebFrame* parent_web_frame = web_frame->parent(); | |
528 if (parent_web_frame && parent_web_frame->isWebRemoteFrame()) { | |
529 RenderFrameProxy* parent_render_frame_proxy = | |
530 RenderFrameProxy::FromWebFrame(parent_web_frame); | |
531 dst->AddContentIntAttribute( | |
532 AX_CONTENT_ATTR_PARENT_ROUTING_ID, | |
533 parent_render_frame_proxy->routing_id()); | |
534 } | |
535 } | |
536 } | 534 } |
537 | 535 |
538 if (dst->role == ui::AX_ROLE_TABLE) { | 536 if (dst->role == ui::AX_ROLE_TABLE) { |
539 int column_count = src.columnCount(); | 537 int column_count = src.columnCount(); |
540 int row_count = src.rowCount(); | 538 int row_count = src.rowCount(); |
541 if (column_count > 0 && row_count > 0) { | 539 if (column_count > 0 && row_count > 0) { |
542 std::set<int32> unique_cell_id_set; | 540 std::set<int32> unique_cell_id_set; |
543 std::vector<int32> cell_ids; | 541 std::vector<int32> cell_ids; |
544 std::vector<int32> unique_cell_ids; | 542 std::vector<int32> unique_cell_ids; |
545 dst->AddIntAttribute(ui::AX_ATTR_TABLE_COLUMN_COUNT, column_count); | 543 dst->AddIntAttribute(ui::AX_ATTR_TABLE_COLUMN_COUNT, column_count); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
655 } | 653 } |
656 } | 654 } |
657 | 655 |
658 blink::WebDocument BlinkAXTreeSource::GetMainDocument() const { | 656 blink::WebDocument BlinkAXTreeSource::GetMainDocument() const { |
659 if (render_frame_ && render_frame_->GetWebFrame()) | 657 if (render_frame_ && render_frame_->GetWebFrame()) |
660 return render_frame_->GetWebFrame()->document(); | 658 return render_frame_->GetWebFrame()->document(); |
661 return WebDocument(); | 659 return WebDocument(); |
662 } | 660 } |
663 | 661 |
664 } // namespace content | 662 } // namespace content |
OLD | NEW |