blob: 67701813fadc7d0105225df74d58ba764758c839 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/pdf/renderer/pdf_accessibility_tree.h"
#include <utility>
#include "pdf/accessibility_structs.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/geometry/rect_f.h"
namespace pdf {
const chrome_pdf::AccessibilityTextRunInfo kFirstTextRun = {
15, gfx::RectF(26.0f, 189.0f, 84.0f, 13.0f),
chrome_pdf::AccessibilityTextDirection::kNone,
chrome_pdf::AccessibilityTextStyleInfo()};
const chrome_pdf::AccessibilityTextRunInfo kSecondTextRun = {
15, gfx::RectF(28.0f, 117.0f, 152.0f, 19.0f),
chrome_pdf::AccessibilityTextDirection::kNone,
chrome_pdf::AccessibilityTextStyleInfo()};
const chrome_pdf::AccessibilityCharInfo kDummyCharsData[] = {
{'H', 12}, {'e', 6}, {'l', 5}, {'l', 4}, {'o', 8}, {',', 4},
{' ', 4}, {'w', 12}, {'o', 6}, {'r', 6}, {'l', 4}, {'d', 9},
{'!', 4}, {'\r', 0}, {'\n', 0}, {'G', 16}, {'o', 12}, {'o', 12},
{'d', 12}, {'b', 10}, {'y', 12}, {'e', 12}, {',', 4}, {' ', 6},
{'w', 16}, {'o', 12}, {'r', 8}, {'l', 4}, {'d', 12}, {'!', 2},
};
TEST(PdfAccessibilityTreeUnitTest, TextRunsAndCharsMismatch) {
// `chars` and `text_runs` span over the same page text. They should denote
// the same page text size, but `text_runs_` is incorrect and only denotes 1
// of 2 text runs.
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, TextRunsAndCharsMatch) {
// `chars` and `text_runs` span over the same page text. They should denote
// the same page text size.
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
EXPECT_TRUE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, UnsortedLinkVector) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
// Add first link in the vector.
chrome_pdf::AccessibilityLinkInfo link;
link.text_range.index = 2;
link.text_range.count = 0;
link.index_in_page = 0;
page_objects.links.push_back(std::move(link));
}
{
// Add second link in the vector.
chrome_pdf::AccessibilityLinkInfo link;
link.text_range.index = 0;
link.text_range.count = 1;
link.index_in_page = 1;
page_objects.links.push_back(std::move(link));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, OutOfBoundLink) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityLinkInfo link;
link.text_range.index = 3;
link.text_range.count = 0;
link.index_in_page = 0;
page_objects.links.push_back(std::move(link));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, UnsortedImageVector) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
// Add first image to the vector.
chrome_pdf::AccessibilityImageInfo image;
image.text_run_index = 1;
page_objects.images.push_back(std::move(image));
}
{
// Add second image to the vector.
chrome_pdf::AccessibilityImageInfo image;
image.text_run_index = 0;
page_objects.images.push_back(std::move(image));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, OutOfBoundImage) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityImageInfo image;
image.text_run_index = 3;
page_objects.images.push_back(std::move(image));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, UnsortedHighlightVector) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
// Add first highlight in the vector.
chrome_pdf::AccessibilityHighlightInfo highlight;
highlight.text_range.index = 2;
highlight.text_range.count = 0;
highlight.index_in_page = 0;
page_objects.highlights.push_back(std::move(highlight));
}
{
// Add second highlight in the vector.
chrome_pdf::AccessibilityHighlightInfo highlight;
highlight.text_range.index = 0;
highlight.text_range.count = 1;
highlight.index_in_page = 1;
page_objects.highlights.push_back(std::move(highlight));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, OutOfBoundHighlight) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityHighlightInfo highlight;
highlight.text_range.index = 3;
highlight.text_range.count = 0;
highlight.index_in_page = 0;
page_objects.highlights.push_back(std::move(highlight));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, UnsortedTextFieldVector) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
// Add first text field in the vector.
chrome_pdf::AccessibilityTextFieldInfo text_field;
text_field.text_run_index = 2;
text_field.index_in_page = 0;
page_objects.form_fields.text_fields.push_back(std::move(text_field));
}
{
// Add second text field in the vector.
chrome_pdf::AccessibilityTextFieldInfo text_field;
text_field.text_run_index = 0;
text_field.index_in_page = 1;
page_objects.form_fields.text_fields.push_back(std::move(text_field));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, OutOfBoundTextField) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityTextFieldInfo text_field;
text_field.text_run_index = 3;
text_field.index_in_page = 0;
page_objects.form_fields.text_fields.push_back(std::move(text_field));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, UnsortedChoiceFieldVector) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
// Add first choice field in the vector.
chrome_pdf::AccessibilityChoiceFieldInfo choice_field;
choice_field.text_run_index = 2;
choice_field.index_in_page = 0;
page_objects.form_fields.choice_fields.push_back(std::move(choice_field));
}
{
// Add second choice field in the vector.
chrome_pdf::AccessibilityChoiceFieldInfo choice_field;
choice_field.text_run_index = 0;
choice_field.index_in_page = 1;
page_objects.form_fields.choice_fields.push_back(std::move(choice_field));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, OutOfBoundChoiceField) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityChoiceFieldInfo choice_field;
choice_field.text_run_index = 3;
choice_field.index_in_page = 0;
page_objects.form_fields.choice_fields.push_back(std::move(choice_field));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, UnsortedButtonVector) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
// Add first button in the vector.
chrome_pdf::AccessibilityButtonInfo button;
button.text_run_index = 2;
button.index_in_page = 0;
page_objects.form_fields.buttons.push_back(std::move(button));
}
{
// Add second button in the vector.
chrome_pdf::AccessibilityButtonInfo button;
button.text_run_index = 0;
button.index_in_page = 1;
page_objects.form_fields.buttons.push_back(std::move(button));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, OutOfBoundButton) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityButtonInfo button;
button.text_run_index = 3;
button.index_in_page = 0;
page_objects.form_fields.buttons.push_back(std::move(button));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, OutOfBoundRadioButton) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityButtonInfo button;
button.type = chrome_pdf::ButtonType::kRadioButton;
button.text_run_index = 0;
button.control_index = 1;
button.control_count = 2;
button.index_in_page = 0;
page_objects.form_fields.buttons.push_back(std::move(button));
}
EXPECT_TRUE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
{
chrome_pdf::AccessibilityButtonInfo button;
button.type = chrome_pdf::ButtonType::kRadioButton;
button.text_run_index = 0;
button.control_index = 3;
button.control_count = 2;
button.index_in_page = 1;
page_objects.form_fields.buttons.push_back(std::move(button));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, OutOfBoundCheckBox) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityButtonInfo button;
button.type = chrome_pdf::ButtonType::kCheckBox;
button.text_run_index = 0;
button.control_index = 1;
button.control_count = 2;
button.index_in_page = 0;
page_objects.form_fields.buttons.push_back(std::move(button));
}
EXPECT_TRUE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
{
chrome_pdf::AccessibilityButtonInfo button;
button.type = chrome_pdf::ButtonType::kCheckBox;
button.text_run_index = 0;
button.control_index = 3;
button.control_count = 2;
button.index_in_page = 1;
page_objects.form_fields.buttons.push_back(std::move(button));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, InvalidButtonType) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityButtonInfo button;
button.type = static_cast<chrome_pdf::ButtonType>(666);
button.text_run_index = 0;
button.control_index = 1;
button.control_count = 2;
button.index_in_page = 0;
page_objects.form_fields.buttons.push_back(std::move(button));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, OutOfBoundIndexInPageLink) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
// Add first link in the vector.
chrome_pdf::AccessibilityLinkInfo link;
link.text_range.index = 1;
link.text_range.count = 0;
link.index_in_page = 1;
page_objects.links.push_back(std::move(link));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, OutOfBoundIndexInPageHighlight) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityHighlightInfo highlight;
highlight.text_range.index = 1;
highlight.text_range.count = 0;
highlight.index_in_page = 1;
page_objects.highlights.push_back(std::move(highlight));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, OutOfBoundIndexInPageTextFeild) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityTextFieldInfo text_feild;
text_feild.text_run_index = 1;
text_feild.index_in_page = 1;
page_objects.form_fields.text_fields.push_back(std::move(text_feild));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, OutOfBoundIndexInChoiceFeild) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityChoiceFieldInfo choice_field;
choice_field.type = chrome_pdf::ChoiceFieldType::kListBox;
choice_field.text_run_index = 2;
choice_field.index_in_page = 1;
page_objects.form_fields.choice_fields.push_back(std::move(choice_field));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
TEST(PdfAccessibilityTreeUnitTest, InvalidChoiceFieldType) {
std::vector<chrome_pdf::AccessibilityTextRunInfo> text_runs;
text_runs.emplace_back(kFirstTextRun);
text_runs.emplace_back(kSecondTextRun);
std::vector<chrome_pdf::AccessibilityCharInfo> chars(
std::begin(kDummyCharsData), std::end(kDummyCharsData));
chrome_pdf::AccessibilityPageObjects page_objects;
{
chrome_pdf::AccessibilityChoiceFieldInfo choice_field;
choice_field.type = static_cast<chrome_pdf::ChoiceFieldType>(666);
choice_field.text_run_index = 0;
choice_field.index_in_page = 0;
page_objects.form_fields.choice_fields.push_back(std::move(choice_field));
}
EXPECT_FALSE(PdfAccessibilityTree::IsDataFromPluginValid(text_runs, chars,
page_objects));
}
} // namespace pdf