Chromium Code Reviews| 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) { |
|
David Tseng
2012/07/31 17:04:17
nit: Do we really want to add a test per file? Gte
|
| + 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 |