| Index: chrome/test/webdriver/webdriver_server.cc
|
| diff --git a/chrome/test/webdriver/webdriver_server.cc b/chrome/test/webdriver/webdriver_server.cc
|
| deleted file mode 100644
|
| index 0785fafddf0515d1449f7cfea3c566dd43d7a355..0000000000000000000000000000000000000000
|
| --- a/chrome/test/webdriver/webdriver_server.cc
|
| +++ /dev/null
|
| @@ -1,331 +0,0 @@
|
| -// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include <signal.h>
|
| -#include <stdlib.h>
|
| -
|
| -#if defined(OS_WIN)
|
| -#include <windows.h>
|
| -#endif
|
| -
|
| -#include <fstream>
|
| -#include <iostream>
|
| -
|
| -#include "base/at_exit.h"
|
| -#include "base/base_paths.h"
|
| -#include "base/command_line.h"
|
| -#include "base/files/file_path.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "base/path_service.h"
|
| -#include "base/strings/string_number_conversions.h"
|
| -#include "base/strings/string_split.h"
|
| -#include "base/strings/string_util.h"
|
| -#include "base/strings/stringprintf.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "base/synchronization/waitable_event.h"
|
| -#include "base/test/test_timeouts.h"
|
| -#include "base/threading/platform_thread.h"
|
| -#include "base/time/time.h"
|
| -#include "chrome/common/chrome_constants.h"
|
| -#include "chrome/common/chrome_paths.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| -#include "chrome/test/webdriver/commands/alert_commands.h"
|
| -#include "chrome/test/webdriver/commands/appcache_status_command.h"
|
| -#include "chrome/test/webdriver/commands/browser_connection_commands.h"
|
| -#include "chrome/test/webdriver/commands/chrome_commands.h"
|
| -#include "chrome/test/webdriver/commands/cookie_commands.h"
|
| -#include "chrome/test/webdriver/commands/create_session.h"
|
| -#include "chrome/test/webdriver/commands/execute_async_script_command.h"
|
| -#include "chrome/test/webdriver/commands/execute_command.h"
|
| -#include "chrome/test/webdriver/commands/file_upload_command.h"
|
| -#include "chrome/test/webdriver/commands/find_element_commands.h"
|
| -#include "chrome/test/webdriver/commands/html5_location_commands.h"
|
| -#include "chrome/test/webdriver/commands/html5_storage_commands.h"
|
| -#include "chrome/test/webdriver/commands/keys_command.h"
|
| -#include "chrome/test/webdriver/commands/log_command.h"
|
| -#include "chrome/test/webdriver/commands/mouse_commands.h"
|
| -#include "chrome/test/webdriver/commands/navigate_commands.h"
|
| -#include "chrome/test/webdriver/commands/screenshot_command.h"
|
| -#include "chrome/test/webdriver/commands/session_with_id.h"
|
| -#include "chrome/test/webdriver/commands/set_timeout_commands.h"
|
| -#include "chrome/test/webdriver/commands/source_command.h"
|
| -#include "chrome/test/webdriver/commands/target_locator_commands.h"
|
| -#include "chrome/test/webdriver/commands/title_command.h"
|
| -#include "chrome/test/webdriver/commands/url_command.h"
|
| -#include "chrome/test/webdriver/commands/webelement_commands.h"
|
| -#include "chrome/test/webdriver/commands/window_commands.h"
|
| -#include "chrome/test/webdriver/webdriver_dispatch.h"
|
| -#include "chrome/test/webdriver/webdriver_logging.h"
|
| -#include "chrome/test/webdriver/webdriver_session_manager.h"
|
| -#include "chrome/test/webdriver/webdriver_switches.h"
|
| -#include "chrome/test/webdriver/webdriver_util.h"
|
| -#include "third_party/mongoose/mongoose.h"
|
| -
|
| -#if defined(OS_WIN)
|
| -#include <time.h>
|
| -#elif defined(OS_POSIX)
|
| -#include <errno.h>
|
| -#include <sys/time.h>
|
| -#include <sys/types.h>
|
| -#include <sys/wait.h>
|
| -#endif
|
| -
|
| -namespace webdriver {
|
| -
|
| -namespace {
|
| -
|
| -void InitCallbacks(Dispatcher* dispatcher,
|
| - base::WaitableEvent* shutdown_event,
|
| - bool forbid_other_requests) {
|
| - dispatcher->AddShutdown("/shutdown", shutdown_event);
|
| - dispatcher->AddStatus("/status");
|
| - dispatcher->AddLog("/log");
|
| -
|
| - dispatcher->Add<CreateSession>("/session");
|
| -
|
| - // WebElement commands
|
| - dispatcher->Add<FindOneElementCommand>( "/session/*/element");
|
| - dispatcher->Add<FindManyElementsCommand>("/session/*/elements");
|
| - dispatcher->Add<ActiveElementCommand>( "/session/*/element/active");
|
| - dispatcher->Add<FindOneElementCommand>( "/session/*/element/*/element");
|
| - dispatcher->Add<FindManyElementsCommand>("/session/*/elements/*/elements");
|
| - dispatcher->Add<ElementAttributeCommand>("/session/*/element/*/attribute/*");
|
| - dispatcher->Add<ElementCssCommand>( "/session/*/element/*/css/*");
|
| - dispatcher->Add<ElementClearCommand>( "/session/*/element/*/clear");
|
| - dispatcher->Add<ElementDisplayedCommand>("/session/*/element/*/displayed");
|
| - dispatcher->Add<ElementEnabledCommand>( "/session/*/element/*/enabled");
|
| - dispatcher->Add<ElementEqualsCommand>( "/session/*/element/*/equals/*");
|
| - dispatcher->Add<ElementLocationCommand>( "/session/*/element/*/location");
|
| - dispatcher->Add<ElementLocationInViewCommand>(
|
| - "/session/*/element/*/location_in_view");
|
| - dispatcher->Add<ElementNameCommand>( "/session/*/element/*/name");
|
| - dispatcher->Add<ElementSelectedCommand>("/session/*/element/*/selected");
|
| - dispatcher->Add<ElementSizeCommand>( "/session/*/element/*/size");
|
| - dispatcher->Add<ElementSubmitCommand>( "/session/*/element/*/submit");
|
| - dispatcher->Add<ElementTextCommand>( "/session/*/element/*/text");
|
| - dispatcher->Add<ElementToggleCommand>( "/session/*/element/*/toggle");
|
| - dispatcher->Add<ElementValueCommand>( "/session/*/element/*/value");
|
| -
|
| - dispatcher->Add<ScreenshotCommand>("/session/*/screenshot");
|
| -
|
| - // Mouse Commands
|
| - dispatcher->Add<MoveAndClickCommand>("/session/*/element/*/click");
|
| - dispatcher->Add<DragCommand>( "/session/*/element/*/drag");
|
| - dispatcher->Add<HoverCommand>( "/session/*/element/*/hover");
|
| -
|
| - dispatcher->Add<MoveToCommand>( "/session/*/moveto");
|
| - dispatcher->Add<ClickCommand>( "/session/*/click");
|
| - dispatcher->Add<ButtonDownCommand>( "/session/*/buttondown");
|
| - dispatcher->Add<ButtonUpCommand>( "/session/*/buttonup");
|
| - dispatcher->Add<DoubleClickCommand>("/session/*/doubleclick");
|
| -
|
| - // All session based commands should be listed after the element based
|
| - // commands to avoid potential mapping conflicts from an overzealous
|
| - // wildcard match. For example, /session/*/title maps to the handler to
|
| - // fetch the page title. If mapped first, this would overwrite the handler
|
| - // for /session/*/element/*/attribute/title, which should fetch the title
|
| - // attribute of the element.
|
| - dispatcher->Add<AcceptAlertCommand>( "/session/*/accept_alert");
|
| - dispatcher->Add<AlertTextCommand>( "/session/*/alert_text");
|
| - dispatcher->Add<BackCommand>( "/session/*/back");
|
| - dispatcher->Add<DismissAlertCommand>( "/session/*/dismiss_alert");
|
| - dispatcher->Add<ExecuteCommand>( "/session/*/execute");
|
| - dispatcher->Add<ExecuteAsyncScriptCommand>(
|
| - "/session/*/execute_async");
|
| - dispatcher->Add<ForwardCommand>( "/session/*/forward");
|
| - dispatcher->Add<SwitchFrameCommand>( "/session/*/frame");
|
| - dispatcher->Add<KeysCommand>( "/session/*/keys");
|
| - dispatcher->Add<RefreshCommand>( "/session/*/refresh");
|
| - dispatcher->Add<SourceCommand>( "/session/*/source");
|
| - dispatcher->Add<TitleCommand>( "/session/*/title");
|
| - dispatcher->Add<URLCommand>( "/session/*/url");
|
| - dispatcher->Add<WindowCommand>( "/session/*/window");
|
| - dispatcher->Add<WindowHandleCommand>( "/session/*/window_handle");
|
| - dispatcher->Add<WindowHandlesCommand>("/session/*/window_handles");
|
| - dispatcher->Add<WindowSizeCommand>( "/session/*/window/*/size");
|
| - dispatcher->Add<WindowPositionCommand>(
|
| - "/session/*/window/*/position");
|
| - dispatcher->Add<WindowMaximizeCommand>(
|
| - "/session/*/window/*/maximize");
|
| - dispatcher->Add<SetAsyncScriptTimeoutCommand>(
|
| - "/session/*/timeouts/async_script");
|
| - dispatcher->Add<ImplicitWaitCommand>( "/session/*/timeouts/implicit_wait");
|
| - dispatcher->Add<LogCommand>( "/session/*/log");
|
| - dispatcher->Add<FileUploadCommand>( "/session/*/file");
|
| -
|
| - // Cookie functions.
|
| - dispatcher->Add<CookieCommand>( "/session/*/cookie");
|
| - dispatcher->Add<NamedCookieCommand>("/session/*/cookie/*");
|
| -
|
| - dispatcher->Add<BrowserConnectionCommand>("/session/*/browser_connection");
|
| - dispatcher->Add<AppCacheStatusCommand>("/session/*/application_cache/status");
|
| -
|
| - // Chrome-specific commands.
|
| - dispatcher->Add<ExtensionsCommand>("/session/*/chrome/extensions");
|
| - dispatcher->Add<ExtensionCommand>("/session/*/chrome/extension/*");
|
| - dispatcher->Add<ViewsCommand>("/session/*/chrome/views");
|
| -#if !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS))
|
| - dispatcher->Add<HeapProfilerDumpCommand>(
|
| - "/session/*/chrome/heapprofilerdump");
|
| -#endif // !defined(NO_TCMALLOC) && (defined(OS_LINUX) || defined(OS_CHROMEOS))
|
| -
|
| - // HTML5 functions.
|
| - dispatcher->Add<HTML5LocationCommand>("/session/*/location");
|
| - dispatcher->Add<LocalStorageCommand>("/session/*/local_storage");
|
| - dispatcher->Add<LocalStorageSizeCommand>("/session/*/local_storage/size");
|
| - dispatcher->Add<LocalStorageKeyCommand>("/session/*/local_storage/key*");
|
| - dispatcher->Add<SessionStorageCommand>("/session/*/session_storage");
|
| - dispatcher->Add<SessionStorageSizeCommand>("/session/*/session_storage/size");
|
| - dispatcher->Add<SessionStorageKeyCommand>("/session/*/session_storage/key*");
|
| -
|
| - // Since the /session/* is a wild card that would match the above URIs, this
|
| - // line MUST be after all other webdriver command callbacks.
|
| - dispatcher->Add<SessionWithID>("/session/*");
|
| -
|
| - if (forbid_other_requests)
|
| - dispatcher->ForbidAllOtherRequests();
|
| -}
|
| -
|
| -void* ProcessHttpRequest(mg_event event_raised,
|
| - struct mg_connection* connection,
|
| - const struct mg_request_info* request_info) {
|
| - bool handler_result_code = false;
|
| - if (event_raised == MG_NEW_REQUEST) {
|
| - handler_result_code =
|
| - reinterpret_cast<Dispatcher*>(request_info->user_data)->
|
| - ProcessHttpRequest(connection, request_info);
|
| - }
|
| -
|
| - return reinterpret_cast<void*>(handler_result_code);
|
| -}
|
| -
|
| -void MakeMongooseOptions(const std::string& port,
|
| - const std::string& root,
|
| - int http_threads,
|
| - bool enable_keep_alive,
|
| - std::vector<std::string>* out_options) {
|
| - out_options->push_back("listening_ports");
|
| - out_options->push_back(port);
|
| - out_options->push_back("enable_keep_alive");
|
| - out_options->push_back(enable_keep_alive ? "yes" : "no");
|
| - out_options->push_back("num_threads");
|
| - out_options->push_back(base::IntToString(http_threads));
|
| - if (!root.empty()) {
|
| - out_options->push_back("document_root");
|
| - out_options->push_back(root);
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -int RunChromeDriver() {
|
| - base::AtExitManager exit;
|
| - base::WaitableEvent shutdown_event(false, false);
|
| - CommandLine* cmd_line = CommandLine::ForCurrentProcess();
|
| -
|
| -#if defined(OS_POSIX)
|
| - signal(SIGPIPE, SIG_IGN);
|
| -#endif
|
| - srand((unsigned int)time(NULL));
|
| -
|
| - // Register Chrome's path provider so that the AutomationProxy will find our
|
| - // built Chrome.
|
| - chrome::RegisterPathProvider();
|
| - TestTimeouts::Initialize();
|
| -
|
| - // Parse command line flags.
|
| - std::string port = "9515";
|
| - base::FilePath log_path;
|
| - std::string root;
|
| - std::string url_base;
|
| - int http_threads = 4;
|
| - bool enable_keep_alive = false;
|
| - if (cmd_line->HasSwitch("port"))
|
| - port = cmd_line->GetSwitchValueASCII("port");
|
| - if (cmd_line->HasSwitch("log-path"))
|
| - log_path = cmd_line->GetSwitchValuePath("log-path");
|
| - // The 'root' flag allows the user to specify a location to serve files from.
|
| - // If it is not given, a callback will be registered to forbid all file
|
| - // requests.
|
| - if (cmd_line->HasSwitch("root"))
|
| - root = cmd_line->GetSwitchValueASCII("root");
|
| - if (cmd_line->HasSwitch("url-base"))
|
| - url_base = cmd_line->GetSwitchValueASCII("url-base");
|
| - if (cmd_line->HasSwitch("http-threads")) {
|
| - if (!base::StringToInt(cmd_line->GetSwitchValueASCII("http-threads"),
|
| - &http_threads)) {
|
| - std::cerr << "'http-threads' option must be an integer";
|
| - return 1;
|
| - }
|
| - }
|
| - if (cmd_line->HasSwitch(kEnableKeepAlive))
|
| - enable_keep_alive = true;
|
| -
|
| - bool logging_success = InitWebDriverLogging(log_path, kAllLogLevel);
|
| - std::string chromedriver_info = base::StringPrintf(
|
| - "ChromeDriver %s", chrome::kChromeVersion);
|
| - base::FilePath chromedriver_exe;
|
| - if (PathService::Get(base::FILE_EXE, &chromedriver_exe)) {
|
| - chromedriver_info += base::StringPrintf(
|
| - " %" PRFilePath, chromedriver_exe.value().c_str());
|
| - }
|
| - FileLog::Get()->Log(kInfoLogLevel, base::Time::Now(), chromedriver_info);
|
| -
|
| -
|
| - SessionManager* manager = SessionManager::GetInstance();
|
| - manager->set_port(port);
|
| - manager->set_url_base(url_base);
|
| -
|
| - Dispatcher dispatcher(url_base);
|
| - InitCallbacks(&dispatcher, &shutdown_event, root.empty());
|
| -
|
| - std::vector<std::string> args;
|
| - MakeMongooseOptions(port, root, http_threads, enable_keep_alive, &args);
|
| - scoped_ptr<const char*[]> options(new const char*[args.size() + 1]);
|
| - for (size_t i = 0; i < args.size(); ++i) {
|
| - options[i] = args[i].c_str();
|
| - }
|
| - options[args.size()] = NULL;
|
| -
|
| - // Initialize SHTTPD context.
|
| - // Listen on port 9515 or port specified on command line.
|
| - // TODO(jmikhail) Maybe add port 9516 as a secure connection.
|
| - struct mg_context* ctx = mg_start(&ProcessHttpRequest,
|
| - &dispatcher,
|
| - options.get());
|
| - if (ctx == NULL) {
|
| - std::cerr << "Port already in use. Exiting..." << std::endl;
|
| -#if defined(OS_WIN)
|
| - return WSAEADDRINUSE;
|
| -#else
|
| - return EADDRINUSE;
|
| -#endif
|
| - }
|
| -
|
| - // The tests depend on parsing the first line ChromeDriver outputs,
|
| - // so all other logging should happen after this.
|
| - if (!cmd_line->HasSwitch("silent")) {
|
| - std::cout << "Started ChromeDriver" << std::endl
|
| - << "port=" << port << std::endl
|
| - << "version=" << chrome::kChromeVersion << std::endl;
|
| - if (logging_success)
|
| - std::cout << "log=" << FileLog::Get()->path().value() << std::endl;
|
| - else
|
| - std::cout << "Log file could not be created" << std::endl;
|
| - }
|
| -
|
| - // Run until we receive command to shutdown.
|
| - // Don't call mg_stop because mongoose will hang if clients are still
|
| - // connected when keep-alive is enabled.
|
| - shutdown_event.Wait();
|
| -
|
| - return (EXIT_SUCCESS);
|
| -}
|
| -
|
| -} // namespace webdriver
|
| -
|
| -int main(int argc, char *argv[]) {
|
| - CommandLine::Init(argc, argv);
|
| - return webdriver::RunChromeDriver();
|
| -}
|
|
|