Commit e06dfd70 authored by Dominic Mazzoni's avatar Dominic Mazzoni Committed by Commit Bot

Add word boundaries to the PDF accessibility tree.

Bug: 812304
Cq-Include-Trybots: master.tryserver.chromium.linux:linux_mojo
Change-Id: Ib729933d425af0630201e11092e406089b7084ff
Reviewed-on: https://chromium-review.googlesource.com/919543
Commit-Queue: Dominic Mazzoni <dmazzoni@chromium.org>
Reviewed-by: default avatardsinclair <dsinclair@chromium.org>
Reviewed-by: default avatarKatie Dektar <katie@chromium.org>
Cr-Commit-Position: refs/heads/master@{#536903}
parent fbbadaf5
...@@ -766,6 +766,39 @@ IN_PROC_BROWSER_TEST_F(PDFExtensionTest, PdfAccessibilityInOOPIF) { ...@@ -766,6 +766,39 @@ IN_PROC_BROWSER_TEST_F(PDFExtensionTest, PdfAccessibilityInOOPIF) {
ASSERT_MULTILINE_STR_MATCHES(kExpectedPDFAXTreePattern, ax_tree_dump); ASSERT_MULTILINE_STR_MATCHES(kExpectedPDFAXTreePattern, ax_tree_dump);
} }
IN_PROC_BROWSER_TEST_F(PDFExtensionTest, PdfAccessibilityWordBoundaries) {
content::BrowserAccessibilityState::GetInstance()->EnableAccessibility();
GURL test_pdf_url(embedded_test_server()->GetURL("/pdf/test-bookmarks.pdf"));
WebContents* guest_contents = LoadPdfGetGuestContents(test_pdf_url);
ASSERT_TRUE(guest_contents);
WaitForAccessibilityTreeToContainNodeWithName(guest_contents,
"1 First Section\r\n");
ui::AXTreeUpdate ax_tree = GetAccessibilityTreeSnapshot(guest_contents);
bool found = false;
for (auto& node : ax_tree.nodes) {
std::string name =
node.GetStringAttribute(ax::mojom::StringAttribute::kName);
if (node.role == ax::mojom::Role::kInlineTextBox &&
name == "First Section\r\n") {
found = true;
std::vector<int32_t> word_starts =
node.GetIntListAttribute(ax::mojom::IntListAttribute::kWordStarts);
std::vector<int32_t> word_ends =
node.GetIntListAttribute(ax::mojom::IntListAttribute::kWordEnds);
ASSERT_EQ(2U, word_starts.size());
ASSERT_EQ(2U, word_ends.size());
EXPECT_EQ(0, word_starts[0]);
EXPECT_EQ(5, word_ends[0]);
EXPECT_EQ(6, word_starts[1]);
EXPECT_EQ(13, word_ends[1]);
}
}
ASSERT_TRUE(found);
}
#if defined(GOOGLE_CHROME_BUILD) #if defined(GOOGLE_CHROME_BUILD)
// Test a particular PDF encountered in the wild that triggered a crash // Test a particular PDF encountered in the wild that triggered a crash
// when accessibility is enabled. (http://crbug.com/668724) // when accessibility is enabled. (http://crbug.com/668724)
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <algorithm> #include <algorithm>
#include "base/debug/crash_logging.h" #include "base/debug/crash_logging.h"
#include "base/i18n/break_iterator.h"
#include "base/memory/ptr_util.h" #include "base/memory/ptr_util.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversion_utils.h" #include "base/strings/utf_string_conversion_utils.h"
...@@ -162,6 +163,7 @@ void PdfAccessibilityTree::SetAccessibilityPageInfo( ...@@ -162,6 +163,7 @@ void PdfAccessibilityTree::SetAccessibilityPageInfo(
inline_text_box_node->location = text_run_bounds; inline_text_box_node->location = text_run_bounds;
inline_text_box_node->AddIntListAttribute( inline_text_box_node->AddIntListAttribute(
ax::mojom::IntListAttribute::kCharacterOffsets, char_offsets); ax::mojom::IntListAttribute::kCharacterOffsets, char_offsets);
AddWordStartsAndEnds(inline_text_box_node);
para_node->location.Union(inline_text_box_node->location); para_node->location.Union(inline_text_box_node->location);
static_text_node->location.Union(inline_text_box_node->location); static_text_node->location.Union(inline_text_box_node->location);
...@@ -338,6 +340,28 @@ gfx::Transform* PdfAccessibilityTree::MakeTransformFromViewInfo() { ...@@ -338,6 +340,28 @@ gfx::Transform* PdfAccessibilityTree::MakeTransformFromViewInfo() {
return transform; return transform;
} }
void PdfAccessibilityTree::AddWordStartsAndEnds(
ui::AXNodeData* inline_text_box) {
base::string16 text =
inline_text_box->GetString16Attribute(ax::mojom::StringAttribute::kName);
base::i18n::BreakIterator iter(text, base::i18n::BreakIterator::BREAK_WORD);
if (!iter.Init())
return;
std::vector<int32_t> word_starts;
std::vector<int32_t> word_ends;
while (iter.Advance()) {
if (iter.IsWord()) {
word_starts.push_back(iter.prev());
word_ends.push_back(iter.pos());
}
}
inline_text_box->AddIntListAttribute(ax::mojom::IntListAttribute::kWordStarts,
word_starts);
inline_text_box->AddIntListAttribute(ax::mojom::IntListAttribute::kWordEnds,
word_ends);
}
// //
// AXTreeSource implementation. // AXTreeSource implementation.
// //
......
...@@ -80,6 +80,7 @@ class PdfAccessibilityTree ...@@ -80,6 +80,7 @@ class PdfAccessibilityTree
float GetDeviceScaleFactor() const; float GetDeviceScaleFactor() const;
content::RenderAccessibility* GetRenderAccessibility(); content::RenderAccessibility* GetRenderAccessibility();
gfx::Transform* MakeTransformFromViewInfo(); gfx::Transform* MakeTransformFromViewInfo();
void AddWordStartsAndEnds(ui::AXNodeData* inline_text_box);
ui::AXTree tree_; ui::AXTree tree_;
content::RendererPpapiHost* host_; content::RendererPpapiHost* host_;
......
...@@ -425,6 +425,7 @@ ...@@ -425,6 +425,7 @@
-PDFExtensionTest.PdfAccessibilityEnableLater -PDFExtensionTest.PdfAccessibilityEnableLater
-PDFExtensionTest.PdfAccessibilityInIframe -PDFExtensionTest.PdfAccessibilityInIframe
-PDFExtensionTest.PdfAccessibilityInOOPIF -PDFExtensionTest.PdfAccessibilityInOOPIF
-PDFExtensionTest.PdfAccessibilityWordBoundaries
-PDFExtensionTest.PdfZoomWithoutBubble -PDFExtensionTest.PdfZoomWithoutBubble
-PDFExtensionTest.PostMessageForZeroSizedEmbed -PDFExtensionTest.PostMessageForZeroSizedEmbed
-PDFExtensionTest.RedirectsFailInPlugin -PDFExtensionTest.RedirectsFailInPlugin
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment