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