146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "chrome/test/base/web_ui_browser_test.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted_memory.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/path_service.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_util.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h" 151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "chrome/browser/chrome_content_browser_client.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h" 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/web_ui_test_handler.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_paths.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/test_chrome_web_ui_controller_factory.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/url_data_source.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_controller.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_ui_message_handler.h" 301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/test/browser_test_utils.h" 311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "content/public/test/test_navigation_observer.h" 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "net/base/filename_util.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_handle.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 35c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_FULL_PRINTING) 36c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#include "chrome/browser/printing/print_preview_dialog_controller.h" 37c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif 38c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::RenderViewHost; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIController; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::LazyInstance<std::vector<std::string> > error_messages_ = 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Intercepts all log messages. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool LogHandler(int severity, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* file, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int line, 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t message_start, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& str) { 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (severity == logging::LOG_ERROR && file && 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string("CONSOLE") == file) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_messages_.Get().push_back(str); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class WebUIJsInjectionReadyObserver : public content::WebContentsObserver { 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebUIJsInjectionReadyObserver(content::WebContents* web_contents, 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebUIBrowserTest* browser_test, 671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& preload_test_fixture, 681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& preload_test_name) 691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : content::WebContentsObserver(web_contents), 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) browser_test_(browser_test), 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) preload_test_fixture_(preload_test_fixture), 721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) preload_test_name_(preload_test_name) {} 731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void RenderViewCreated(content::RenderViewHost* rvh) OVERRIDE { 751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) browser_test_->PreLoadJavascriptLibraries( 761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) preload_test_fixture_, preload_test_name_, rvh); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 801e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebUIBrowserTest* browser_test_; 811e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string preload_test_fixture_; 821e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string preload_test_name_; 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)WebUIBrowserTest::~WebUIBrowserTest() { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptFunction(const std::string& function_name) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstValueVector empty_args; 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptFunction(function_name, empty_args); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptFunction(const std::string& function_name, 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* arg) { 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstValueVector args; 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(arg); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptFunction(function_name, args); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptFunction(const std::string& function_name, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* arg1, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* arg2) { 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstValueVector args; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(arg1); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(arg2); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptFunction(function_name, args); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptFunction( 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& function_name, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ConstValueVector& function_arguments) { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptUsingHandler( 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) function_name, function_arguments, false, false, NULL); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptTestF(bool is_async, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& test_fixture, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& test_name) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstValueVector args; 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args.push_back(new base::StringValue(test_fixture)); 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args.push_back(new base::StringValue(test_name)); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_async) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptAsyncTest("RUN_TEST_F", args); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptTest("RUN_TEST_F", args); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name) { 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstValueVector empty_args; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptTest(test_name, empty_args); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* arg) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstValueVector args; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(arg); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptTest(test_name, args); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptTest(const std::string& test_name, 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* arg1, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* arg2) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstValueVector args; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(arg1); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(arg2); 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptTest(test_name, args); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptTest( 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& test_name, 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ConstValueVector& test_arguments) { 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptUsingHandler( 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_name, test_arguments, true, false, NULL); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptAsyncTest(const std::string& test_name) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstValueVector empty_args; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptAsyncTest(test_name, empty_args); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptAsyncTest(const std::string& test_name, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* arg) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstValueVector args; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(arg); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptAsyncTest(test_name, args); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptAsyncTest(const std::string& test_name, 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* arg1, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* arg2) { 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstValueVector args; 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(arg1); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(arg2); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptAsyncTest(test_name, args); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptAsyncTest(const std::string& test_name, 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* arg1, 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* arg2, 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Value* arg3) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstValueVector args; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(arg1); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(arg2); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) args.push_back(arg3); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptAsyncTest(test_name, args); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptAsyncTest( 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& test_name, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ConstValueVector& test_arguments) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return RunJavascriptUsingHandler(test_name, test_arguments, true, true, NULL); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIBrowserTest::PreLoadJavascriptLibraries( 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& preload_test_fixture, 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& preload_test_name, 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* preload_host) { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(libraries_preloaded_); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ConstValueVector args; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args.push_back(new base::StringValue(preload_test_fixture)); 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) args.push_back(new base::StringValue(preload_test_name)); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunJavascriptUsingHandler( 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "preloadJavascriptLibraries", args, false, false, preload_host); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) libraries_preloaded_ = true; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIBrowserTest::BrowsePreload(const GURL& browse_to) { 2111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::WebContents* web_contents = 2121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 2131e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebUIJsInjectionReadyObserver injection_observer( 2141e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) web_contents, this, preload_test_fixture_, preload_test_name_); 2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::TestNavigationObserver navigation_observer(web_contents); 216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) chrome::NavigateParams params( 2171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci browser(), GURL(browse_to), ui::PAGE_TRANSITION_TYPED); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) params.disposition = CURRENT_TAB; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::Navigate(¶ms); 2204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) navigation_observer.Wait(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2231e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#if defined(ENABLE_FULL_PRINTING) 2241e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// This custom ContentBrowserClient is used to get notified when a WebContents 2261e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)// for the print preview dialog gets created. 2271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class PrintContentBrowserClient : public chrome::ChromeContentBrowserClient { 2281e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) public: 2291e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PrintContentBrowserClient(WebUIBrowserTest* browser_test, 2301e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& preload_test_fixture, 2311e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const std::string& preload_test_name) 2321e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) : browser_test_(browser_test), 2331e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) preload_test_fixture_(preload_test_fixture), 2341e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) preload_test_name_(preload_test_name), 2351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) preview_dialog_(NULL), 2361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) message_loop_runner_(new content::MessageLoopRunner) {} 2371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) void Wait() { 2391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) message_loop_runner_->Run(); 2401e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::WaitForLoadStop(preview_dialog_); 2411e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2421e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2431e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) private: 2441e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // ChromeContentBrowserClient implementation: 245010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual content::WebContentsViewDelegate* GetWebContentsViewDelegate( 246010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) content::WebContents* web_contents) OVERRIDE { 2471e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) preview_dialog_ = web_contents; 248f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) observer_.reset(new WebUIJsInjectionReadyObserver(preview_dialog_, 249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) browser_test_, 250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) preload_test_fixture_, 251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) preload_test_name_)); 2521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) message_loop_runner_->Quit(); 2531e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) return NULL; 2541e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 2551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) WebUIBrowserTest* browser_test_; 2571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_ptr<WebUIJsInjectionReadyObserver> observer_; 2581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string preload_test_fixture_; 2591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) std::string preload_test_name_; 2601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::WebContents* preview_dialog_; 2611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) scoped_refptr<content::MessageLoopRunner> message_loop_runner_; 2621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)}; 2631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#endif 2641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIBrowserTest::BrowsePrintPreload(const GURL& browse_to) { 266c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#if defined(ENABLE_FULL_PRINTING) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_test_utils::NavigateToURL(browser(), browse_to); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) PrintContentBrowserClient new_client( 2701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) this, preload_test_fixture_, preload_test_name_); 2711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) content::ContentBrowserClient* old_client = 2721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SetBrowserClientForTesting(&new_client); 2731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::Print(browser()); 2751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) new_client.Wait(); 2761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 2771e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) SetBrowserClientForTesting(old_client); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printing::PrintPreviewDialogController* tab_controller = 2802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) printing::PrintPreviewDialogController::GetInstance(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(tab_controller); 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebContents* preview_dialog = tab_controller->GetPrintPreviewForContents( 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents()); 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(preview_dialog); 2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetWebUIInstance(preview_dialog->GetWebUI()); 286c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#else 287c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch NOTREACHED(); 288c2db58bd994c04d98e4ee2cd7565b71548655fe3Ben Murdoch#endif 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char WebUIBrowserTest::kDummyURL[] = "chrome://DummyURL"; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIBrowserTest::WebUIBrowserTest() 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : test_handler_(new WebUITestHandler()), 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) libraries_preloaded_(false), 296f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) override_selected_web_ui_(NULL) { 297f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIBrowserTest::set_preload_test_fixture( 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& preload_test_fixture) { 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preload_test_fixture_ = preload_test_fixture; 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIBrowserTest::set_preload_test_name( 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& preload_test_name) { 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) preload_test_name_ = preload_test_name; 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DataSource for the dummy URL. If no data source is provided then an error 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// page is shown. While this doesn't matter for most tests, without it, 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// navigation to different anchors cannot be listened to (via the hashchange 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// event). 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockWebUIDataSource : public content::URLDataSource { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockWebUIDataSource() {} 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockWebUIDataSource() {} 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual std::string GetSource() const OVERRIDE { return "dummyurl"; } 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void StartDataRequest( 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& path, 326c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int render_process_id, 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int render_frame_id, 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::URLDataSource::GotDataCallback& callback) OVERRIDE { 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string dummy_html = "<html><body>Dummy</body></html>"; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<base::RefCountedString> response = 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedString::TakeString(&dummy_html); 332868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) callback.Run(response.get()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual std::string GetMimeType(const std::string& path) const OVERRIDE { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return "text/html"; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockWebUIDataSource); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebUIProvider to allow attaching the DataSource for the dummy URL when 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// testing. 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockWebUIProvider 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public TestChromeWebUIControllerFactory::WebUIProvider { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWebUIProvider() {} 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a new WebUI 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual WebUIController* NewWebUI(content::WebUI* web_ui, 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const GURL& url) OVERRIDE { 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebUIController* controller = new content::WebUIController(web_ui); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = Profile::FromWebUI(web_ui); 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::URLDataSource::Add(profile, new MockWebUIDataSource()); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return controller; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockWebUIProvider); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::LazyInstance<MockWebUIProvider> mock_provider_ = 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LAZY_INSTANCE_INITIALIZER; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIBrowserTest::SetUpOnMainThread() { 368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) JavaScriptBrowserTest::SetUpOnMainThread(); 369f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) logging::SetLogMessageHandler(&LogHandler); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 372f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) AddLibrary(base::FilePath(kA11yAuditLibraryJSPath)); 373f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIControllerFactory::UnregisterFactoryForTesting( 3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChromeWebUIControllerFactory::GetInstance()); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_factory_.reset(new TestChromeWebUIControllerFactory); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIControllerFactory::RegisterFactory(test_factory_.get()); 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 381f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) test_factory_->AddFactoryOverride(GURL(kDummyURL).host(), 382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) mock_provider_.Pointer()); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void WebUIBrowserTest::TearDownOnMainThread() { 3862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) logging::SetLogMessageHandler(NULL); 3872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_factory_->RemoveFactoryOverride(GURL(kDummyURL).host()); 3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIControllerFactory::UnregisterFactoryForTesting( 3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_factory_.get()); 3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // This is needed to avoid a debug assert after the test completes, see stack 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // trace in http://crrev.com/179347 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebUIControllerFactory::RegisterFactory( 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ChromeWebUIControllerFactory::GetInstance()); 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) test_factory_.reset(); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIBrowserTest::SetWebUIInstance(content::WebUI* web_ui) { 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) override_selected_web_ui_ = web_ui; 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebUIMessageHandler* WebUIBrowserTest::GetMockMessageHandler() { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebUIBrowserTest::RunJavascriptUsingHandler( 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& function_name, 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ConstValueVector& function_arguments, 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_test, 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_async, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RenderViewHost* preload_host) { 414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Get the user libraries. Preloading them individually is best, then 415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // we can assign each one a filename for better stack traces. Otherwise 416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // append them all to |content|. 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 content; 418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<base::string16> libraries; 419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!libraries_preloaded_) { 420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BuildJavascriptLibraries(&libraries); 421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!preload_host) { 422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content = JoinString(libraries, '\n'); 423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) libraries.clear(); 424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 425cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!function_name.empty()) { 4285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::string16 called_function; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_test) { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) called_function = 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BuildRunTestJSCall(is_async, function_name, function_arguments); 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 433f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) called_function = content::WebUI::GetJavascriptCall( 434f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) function_name, function_arguments.get()); 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content.append(called_function); 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!preload_host) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetupHandlers(); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result = true; 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < libraries.size(); ++i) 445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_handler_->PreloadJavaScript(libraries[i], preload_host); 446cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (is_test) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = test_handler_->RunJavaScriptTestWithResult(content); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (preload_host) 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_handler_->PreloadJavaScript(content, preload_host); 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_handler_->RunJavaScript(content); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (error_messages_.Get().size() > 0) { 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOG(ERROR) << "Encountered javascript console error(s)"; 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = false; 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_messages_.Get().clear(); 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebUIBrowserTest::SetupHandlers() { 463f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) content::WebUI* web_ui_instance = 464f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) override_selected_web_ui_ 465f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ? override_selected_web_ui_ 466f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : browser()->tab_strip_model()->GetActiveWebContents()->GetWebUI(); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(web_ui_instance != NULL); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_handler_->set_web_ui(web_ui_instance); 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) test_handler_->RegisterMessages(); 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (GetMockMessageHandler()) { 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMockMessageHandler()->set_web_ui(web_ui_instance); 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetMockMessageHandler()->RegisterMessages(); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 478f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)GURL WebUIBrowserTest::WebUITestDataPathToURL( 479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const base::FilePath::StringType& path) { 480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath dir_test_data; 481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &dir_test_data)); 482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::FilePath test_path(dir_test_data.Append(kWebUITestFolder).Append(path)); 483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(base::PathExists(test_path)); 484f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return net::FilePathToFileURL(test_path); 485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 486