| Index: content/browser/accessibility/dump_accessibility_tree_browsertest.cc
|
| diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
|
| index c8e508ce5046aecb7b03c48df2fe30d153aaf90e..7a3862044358c6cad7576295c756032613bdd5b1 100644
|
| --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
|
| +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
|
| @@ -2,11 +2,13 @@
|
| // Use of this source code is governed by a BSD-style license that can be
|
| // found in the LICENSE file.
|
|
|
| +#include <set>
|
| #include <string>
|
| #include <vector>
|
|
|
| #include "base/logging.h"
|
| #include "base/path_service.h"
|
| +#include "base/string_split.h"
|
| #include "base/string_util.h"
|
| #include "base/string16.h"
|
| #include "base/utf_string_conversions.h"
|
| @@ -26,8 +28,6 @@
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace {
|
| -// Required to enter html content into a url.
|
| - static const std::string kUrlPreamble = "data:text/html,\n<!doctype html>";
|
| static const char kCommentToken = '#';
|
| static const char* kMarkSkipFile = "#<skip";
|
| static const char* kMarkEndOfFile = "<-- End-of-file -->";
|
| @@ -51,7 +51,7 @@ class DumpAccessibilityTreeTest : public ContentBrowserTest {
|
| // Utility helper that does a comment aware equality check.
|
| // Returns array of lines from expected file which are different.
|
| std::vector<int> DiffLines(std::vector<std::string>& expected_lines,
|
| - std::vector<std::string>& actual_lines) {
|
| + std::vector<std::string>& actual_lines) {
|
| int actual_lines_count = actual_lines.size();
|
| int expected_lines_count = expected_lines.size();
|
| std::vector<int> diff_lines;
|
| @@ -74,16 +74,42 @@ class DumpAccessibilityTreeTest : public ContentBrowserTest {
|
| return diff_lines;
|
| }
|
|
|
| + void AddDefaultFilters(std::set<string16>* allow_filters,
|
| + std::set<string16>* deny_filters) {
|
| + allow_filters->insert(ASCIIToUTF16("FOCUSABLE"));
|
| + allow_filters->insert(ASCIIToUTF16("READONLY"));
|
| + }
|
| +
|
| + void ParseFilters(const std::string& test_html,
|
| + std::set<string16>* allow_filters,
|
| + std::set<string16>* deny_filters) {
|
| + std::vector<std::string> lines;
|
| + base::SplitString(test_html, '\n', &lines);
|
| + for (std::vector<std::string>::const_iterator iter = lines.begin();
|
| + iter != lines.end();
|
| + ++iter) {
|
| + const std::string& line = *iter;
|
| + const std::string& allow_str = helper_.GetAllowString();
|
| + const std::string& deny_str = helper_.GetDenyString();
|
| + if (StartsWithASCII(line, allow_str, true))
|
| + allow_filters->insert(UTF8ToUTF16(line.substr(allow_str.size())));
|
| + else if (StartsWithASCII(line, deny_str, true))
|
| + deny_filters->insert(UTF8ToUTF16(line.substr(deny_str.size())));
|
| + }
|
| + }
|
| +
|
| + void RunTest(const FilePath::CharType* file_path);
|
| +
|
| DumpAccessibilityTreeHelper helper_;
|
| };
|
|
|
| -IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
|
| - DISABLED_PlatformTreeDifferenceTest) {
|
| +void DumpAccessibilityTreeTest::RunTest(const FilePath::CharType* file_path) {
|
| + NavigateToURL(shell(), GURL("about:blank"));
|
| RenderWidgetHostViewPort* host_view = static_cast<RenderWidgetHostViewPort*>(
|
| shell()->web_contents()->GetRenderWidgetHostView());
|
| - RenderWidgetHost* host = host_view->GetRenderWidgetHost();
|
| - RenderViewHostImpl* view_host =
|
| - static_cast<RenderViewHostImpl*>(RenderWidgetHostImpl::From(host));
|
| + RenderWidgetHostImpl* host =
|
| + RenderWidgetHostImpl::From(host_view->GetRenderWidgetHost());
|
| + RenderViewHostImpl* view_host = static_cast<RenderViewHostImpl*>(host);
|
| view_host->set_save_accessibility_tree_for_testing(true);
|
| view_host->SetAccessibilityMode(AccessibilityModeComplete);
|
|
|
| @@ -94,107 +120,141 @@ IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
|
| EXPECT_TRUE(file_util::PathExists(test_path))
|
| << test_path.LossyDisplayName();
|
|
|
| + FilePath html_file = test_path.Append(FilePath(file_path));
|
| // Output the test path to help anyone who encounters a failure and needs
|
| // to know where to look.
|
| - printf("Path to test files: %s\n", test_path.MaybeAsASCII().c_str());
|
| -
|
| - // Grab all HTML files.
|
| - file_util::FileEnumerator file_enumerator(test_path,
|
| - false,
|
| - file_util::FileEnumerator::FILES,
|
| - FILE_PATH_LITERAL("*.html"));
|
| -
|
| - // TODO(dtseng): Make each of these a gtest with script.
|
| - FilePath html_file(file_enumerator.Next());
|
| - ASSERT_FALSE(html_file.empty());
|
| - do {
|
| - std::string html_contents;
|
| - file_util::ReadFileToString(html_file, &html_contents);
|
| -
|
| - // Read the expected file.
|
| - std::string expected_contents_raw;
|
| - FilePath expected_file =
|
| - FilePath(html_file.RemoveExtension().value() +
|
| - helper_.GetExpectedFileSuffix());
|
| - file_util::ReadFileToString(
|
| - expected_file,
|
| - &expected_contents_raw);
|
| -
|
| - // Tolerate Windows-style line endings (\r\n) in the expected file:
|
| - // normalize by deleting all \r from the file (if any) to leave only \n.
|
| - std::string expected_contents;
|
| - RemoveChars(expected_contents_raw, "\r", &expected_contents);
|
| -
|
| - if (!expected_contents.compare(0, strlen(kMarkSkipFile), kMarkSkipFile)) {
|
| - printf("Skipping %s\n", html_file.BaseName().MaybeAsASCII().c_str());
|
| - continue;
|
| - }
|
| + printf("Testing: %s\n", html_file.MaybeAsASCII().c_str());
|
| +
|
| + std::string html_contents;
|
| + file_util::ReadFileToString(html_file, &html_contents);
|
| +
|
| + // Parse filters in the test file.
|
| + std::set<string16> allow_filters;
|
| + std::set<string16> deny_filters;
|
| + AddDefaultFilters(&allow_filters, &deny_filters);
|
| + ParseFilters(html_contents, &allow_filters, &deny_filters);
|
| + helper_.SetFilters(allow_filters, deny_filters);
|
|
|
| - printf("Testing %s\n", html_file.BaseName().MaybeAsASCII().c_str());
|
| -
|
| - // Load the page.
|
| - WindowedNotificationObserver tree_updated_observer(
|
| - NOTIFICATION_RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED,
|
| - NotificationService::AllSources());
|
| - string16 html_contents16;
|
| - html_contents16 = UTF8ToUTF16(html_contents);
|
| - GURL url(UTF8ToUTF16(kUrlPreamble) + html_contents16);
|
| - NavigateToURL(shell(), url);
|
| -
|
| - // Wait for the tree.
|
| - tree_updated_observer.Wait();
|
| -
|
| - // Perform a diff (or write the initial baseline).
|
| - string16 actual_contents_utf16;
|
| - helper_.DumpAccessibilityTree(
|
| - host_view->GetBrowserAccessibilityManager()->GetRoot(),
|
| - &actual_contents_utf16);
|
| - std::string actual_contents = UTF16ToUTF8(actual_contents_utf16);
|
| - std::vector<std::string> actual_lines, expected_lines;
|
| - Tokenize(actual_contents, "\n", &actual_lines);
|
| - Tokenize(expected_contents, "\n", &expected_lines);
|
| - // Marking the end of the file with a line of text ensures that
|
| - // file length differences are found.
|
| - expected_lines.push_back(kMarkEndOfFile);
|
| - actual_lines.push_back(kMarkEndOfFile);
|
| -
|
| - std::vector<int> diff_lines = DiffLines(expected_lines, actual_lines);
|
| - bool is_different = diff_lines.size() > 0;
|
| - EXPECT_FALSE(is_different);
|
| - if (is_different) {
|
| - // Mark the expected lines which did not match actual output with a *.
|
| - printf("* Line Expected\n");
|
| - printf("- ---- --------\n");
|
| - for (int line = 0, diff_index = 0;
|
| - line < static_cast<int>(expected_lines.size());
|
| - ++line) {
|
| - bool is_diff = false;
|
| - if (diff_index < static_cast<int>(diff_lines.size()) &&
|
| - diff_lines[diff_index] == line) {
|
| - is_diff = true;
|
| - ++ diff_index;
|
| - }
|
| - printf("%1s %4d %s\n", is_diff? kSignalDiff : "", line + 1,
|
| - expected_lines[line].c_str());
|
| + // Read the expected file.
|
| + std::string expected_contents_raw;
|
| + FilePath expected_file =
|
| + FilePath(html_file.RemoveExtension().value() +
|
| + helper_.GetExpectedFileSuffix());
|
| + file_util::ReadFileToString(
|
| + expected_file,
|
| + &expected_contents_raw);
|
| +
|
| + // Tolerate Windows-style line endings (\r\n) in the expected file:
|
| + // normalize by deleting all \r from the file (if any) to leave only \n.
|
| + std::string expected_contents;
|
| + RemoveChars(expected_contents_raw, "\r", &expected_contents);
|
| +
|
| + if (!expected_contents.compare(0, strlen(kMarkSkipFile), kMarkSkipFile)) {
|
| + printf("Skipping this test on this platform.\n");
|
| + return;
|
| + }
|
| +
|
| + // Load the page.
|
| + WindowedNotificationObserver tree_updated_observer(
|
| + NOTIFICATION_RENDER_VIEW_HOST_ACCESSIBILITY_TREE_UPDATED,
|
| + NotificationService::AllSources());
|
| + string16 html_contents16;
|
| + html_contents16 = UTF8ToUTF16(html_contents);
|
| + GURL url = GetTestUrl("accessibility",
|
| + html_file.BaseName().MaybeAsASCII().c_str());
|
| + NavigateToURL(shell(), url);
|
| +
|
| + // Wait for the tree.
|
| + tree_updated_observer.Wait();
|
| +
|
| + // Perform a diff (or write the initial baseline).
|
| + string16 actual_contents_utf16;
|
| + helper_.DumpAccessibilityTree(
|
| + host_view->GetBrowserAccessibilityManager()->GetRoot(),
|
| + &actual_contents_utf16);
|
| + std::string actual_contents = UTF16ToUTF8(actual_contents_utf16);
|
| + std::vector<std::string> actual_lines, expected_lines;
|
| + Tokenize(actual_contents, "\n", &actual_lines);
|
| + Tokenize(expected_contents, "\n", &expected_lines);
|
| + // Marking the end of the file with a line of text ensures that
|
| + // file length differences are found.
|
| + expected_lines.push_back(kMarkEndOfFile);
|
| + actual_lines.push_back(kMarkEndOfFile);
|
| +
|
| + std::vector<int> diff_lines = DiffLines(expected_lines, actual_lines);
|
| + bool is_different = diff_lines.size() > 0;
|
| + EXPECT_FALSE(is_different);
|
| + if (is_different) {
|
| + // Mark the expected lines which did not match actual output with a *.
|
| + printf("* Line Expected\n");
|
| + printf("- ---- --------\n");
|
| + for (int line = 0, diff_index = 0;
|
| + line < static_cast<int>(expected_lines.size());
|
| + ++line) {
|
| + bool is_diff = false;
|
| + if (diff_index < static_cast<int>(diff_lines.size()) &&
|
| + diff_lines[diff_index] == line) {
|
| + is_diff = true;
|
| + ++ diff_index;
|
| }
|
| - printf("\nActual\n");
|
| - printf("------\n");
|
| - printf("%s\n", actual_contents.c_str());
|
| + printf("%1s %4d %s\n", is_diff? kSignalDiff : "", line + 1,
|
| + expected_lines[line].c_str());
|
| }
|
| + printf("\nActual\n");
|
| + printf("------\n");
|
| + printf("%s\n", actual_contents.c_str());
|
| + }
|
|
|
| - if (!file_util::PathExists(expected_file)) {
|
| - FilePath actual_file =
|
| - FilePath(html_file.RemoveExtension().value() +
|
| - helper_.GetActualFileSuffix());
|
| + if (!file_util::PathExists(expected_file)) {
|
| + FilePath actual_file =
|
| + FilePath(html_file.RemoveExtension().value() +
|
| + helper_.GetActualFileSuffix());
|
|
|
| - EXPECT_TRUE(file_util::WriteFile(
|
| - actual_file, actual_contents.c_str(), actual_contents.size()));
|
| + EXPECT_TRUE(file_util::WriteFile(
|
| + actual_file, actual_contents.c_str(), actual_contents.size()));
|
|
|
| - ADD_FAILURE() << "No expectation found. Create it by doing:\n"
|
| - << "mv " << actual_file.LossyDisplayName() << " "
|
| - << expected_file.LossyDisplayName();
|
| - }
|
| - } while (!(html_file = file_enumerator.Next()).empty());
|
| + ADD_FAILURE() << "No expectation found. Create it by doing:\n"
|
| + << "mv " << actual_file.LossyDisplayName() << " "
|
| + << expected_file.LossyDisplayName();
|
| + }
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityA) {
|
| + RunTest(FILE_PATH_LITERAL("a.html"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityAName) {
|
| + RunTest(FILE_PATH_LITERAL("a-name.html"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityAOnclick) {
|
| + RunTest(FILE_PATH_LITERAL("a-onclick.html"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
|
| + AccessibilityAriaApplication) {
|
| + RunTest(FILE_PATH_LITERAL("aria-application.html"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityAWithImg) {
|
| + RunTest(FILE_PATH_LITERAL("a-with-img.html"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest,
|
| + AccessibilityContenteditableDescendants) {
|
| + RunTest(FILE_PATH_LITERAL("contenteditable-descendants.html"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityFooter) {
|
| + RunTest(FILE_PATH_LITERAL("footer.html"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityListMarkers) {
|
| + RunTest(FILE_PATH_LITERAL("list-markers.html"));
|
| +}
|
| +
|
| +IN_PROC_BROWSER_TEST_F(DumpAccessibilityTreeTest, AccessibilityUl) {
|
| + RunTest(FILE_PATH_LITERAL("ul.html"));
|
| }
|
|
|
| } // namespace content
|
|
|