• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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
3 // found in the LICENSE file.
4 
5 #include "chrome/test/base/javascript_browser_test.h"
6 
7 #include "base/path_service.h"
8 #include "base/strings/utf_string_conversions.h"
9 #include "chrome/common/chrome_paths.h"
10 #include "content/public/browser/web_ui.h"
11 #include "ui/base/resource/resource_bundle.h"
12 
13 // static
14 const base::FilePath::CharType
15     JavaScriptBrowserTest::kA11yAuditLibraryJSPath[] =
16         FILE_PATH_LITERAL("third_party/accessibility-audit/axs_testing.js");
17 
18 // static
19 const base::FilePath::CharType JavaScriptBrowserTest::kMockJSPath[] =
20     FILE_PATH_LITERAL("chrome/third_party/mock4js/mock4js.js");
21 
22 // static
23 const base::FilePath::CharType JavaScriptBrowserTest::kWebUILibraryJS[] =
24     FILE_PATH_LITERAL("test_api.js");
25 
26 // static
27 const base::FilePath::CharType JavaScriptBrowserTest::kWebUITestFolder[] =
28     FILE_PATH_LITERAL("webui");
29 
AddLibrary(const base::FilePath & library_path)30 void JavaScriptBrowserTest::AddLibrary(const base::FilePath& library_path) {
31   user_libraries_.push_back(library_path);
32 }
33 
JavaScriptBrowserTest()34 JavaScriptBrowserTest::JavaScriptBrowserTest() {
35 }
36 
~JavaScriptBrowserTest()37 JavaScriptBrowserTest::~JavaScriptBrowserTest() {
38 }
39 
SetUpOnMainThread()40 void JavaScriptBrowserTest::SetUpOnMainThread() {
41   base::FilePath test_data_directory;
42   ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &test_data_directory));
43   test_data_directory = test_data_directory.Append(kWebUITestFolder);
44   library_search_paths_.push_back(test_data_directory);
45 
46   base::FilePath gen_test_data_directory;
47   ASSERT_TRUE(
48       PathService::Get(chrome::DIR_GEN_TEST_DATA, &gen_test_data_directory));
49   library_search_paths_.push_back(gen_test_data_directory);
50 
51   base::FilePath source_root_directory;
52   ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &source_root_directory));
53   library_search_paths_.push_back(source_root_directory);
54 
55   base::FilePath resources_pack_path;
56   PathService::Get(chrome::FILE_RESOURCES_PACK, &resources_pack_path);
57   ResourceBundle::GetSharedInstance().AddDataPackFromPath(
58       resources_pack_path, ui::SCALE_FACTOR_NONE);
59 
60   AddLibrary(base::FilePath(kMockJSPath));
61   AddLibrary(base::FilePath(kWebUILibraryJS));
62 }
63 
64 // TODO(dtseng): Make this return bool (success/failure) and remove ASSERt_TRUE
65 // calls.
BuildJavascriptLibraries(std::vector<base::string16> * libraries)66 void JavaScriptBrowserTest::BuildJavascriptLibraries(
67     std::vector<base::string16>* libraries) {
68   ASSERT_TRUE(libraries != NULL);
69   std::vector<base::FilePath>::iterator user_libraries_iterator;
70   for (user_libraries_iterator = user_libraries_.begin();
71        user_libraries_iterator != user_libraries_.end();
72        ++user_libraries_iterator) {
73     std::string library_content;
74     if (user_libraries_iterator->IsAbsolute()) {
75       ASSERT_TRUE(
76           base::ReadFileToString(*user_libraries_iterator, &library_content))
77           << user_libraries_iterator->value();
78     } else {
79       bool ok = false;
80       std::vector<base::FilePath>::iterator library_search_path_iterator;
81       for (library_search_path_iterator = library_search_paths_.begin();
82            library_search_path_iterator != library_search_paths_.end();
83            ++library_search_path_iterator) {
84         ok = base::ReadFileToString(
85             base::MakeAbsoluteFilePath(
86                 library_search_path_iterator->Append(*user_libraries_iterator)),
87             &library_content);
88         if (ok)
89           break;
90       }
91       ASSERT_TRUE(ok) << "User library not found: "
92                       << user_libraries_iterator->value();
93     }
94     library_content.append(";\n");
95 
96     // This magic code puts filenames in stack traces.
97     library_content.append("//# sourceURL=");
98     library_content.append(user_libraries_iterator->BaseName().AsUTF8Unsafe());
99     library_content.append("\n");
100     libraries->push_back(base::UTF8ToUTF16(library_content));
101   }
102 }
103 
BuildRunTestJSCall(bool is_async,const std::string & function_name,const ConstValueVector & test_func_args)104 base::string16 JavaScriptBrowserTest::BuildRunTestJSCall(
105     bool is_async,
106     const std::string& function_name,
107     const ConstValueVector& test_func_args) {
108   ConstValueVector arguments;
109   base::FundamentalValue* is_async_arg = new base::FundamentalValue(is_async);
110   arguments.push_back(is_async_arg);
111   base::StringValue* function_name_arg = new base::StringValue(function_name);
112   arguments.push_back(function_name_arg);
113   base::ListValue* baked_argument_list = new base::ListValue();
114   ConstValueVector::const_iterator arguments_iterator;
115   for (arguments_iterator = test_func_args.begin();
116        arguments_iterator != test_func_args.end();
117        ++arguments_iterator) {
118     baked_argument_list->Append((*arguments_iterator)->DeepCopy());
119   }
120   arguments.push_back(baked_argument_list);
121   return content::WebUI::GetJavascriptCall(std::string("runTest"),
122                                            arguments.get());
123 }
124