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(&params);
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