| Index: chrome/test/chromedriver/server/http_handler.cc
|
| diff --git a/chrome/test/chromedriver/server/http_handler.cc b/chrome/test/chromedriver/server/http_handler.cc
|
| index 66d515fb9f0ed1a08db06edb424e61c0158dae3d..e6fabb29f11711c18c4240193e900ad36849a1ba 100644
|
| --- a/chrome/test/chromedriver/server/http_handler.cc
|
| +++ b/chrome/test/chromedriver/server/http_handler.cc
|
| @@ -4,24 +4,53 @@
|
|
|
| #include "chrome/test/chromedriver/server/http_handler.h"
|
|
|
| +#include "base/bind.h"
|
| +#include "base/callback.h"
|
| #include "base/json/json_reader.h"
|
| #include "base/json/json_writer.h"
|
| +#include "base/logging.h" // For CHECK macros.
|
| #include "base/memory/scoped_ptr.h"
|
| +#include "base/message_loop.h"
|
| +#include "base/message_loop/message_loop_proxy.h"
|
| #include "base/strings/string_split.h"
|
| #include "base/strings/string_util.h"
|
| #include "base/strings/stringprintf.h"
|
| +#include "base/sys_info.h"
|
| #include "base/values.h"
|
| +#include "chrome/test/chromedriver/alert_commands.h"
|
| +#include "chrome/test/chromedriver/chrome/adb_impl.h"
|
| +#include "chrome/test/chromedriver/chrome/device_manager.h"
|
| #include "chrome/test/chromedriver/chrome/log.h"
|
| #include "chrome/test/chromedriver/chrome/status.h"
|
| -#include "chrome/test/chromedriver/command_executor.h"
|
| -#include "chrome/test/chromedriver/command_names.h"
|
| +#include "chrome/test/chromedriver/chrome/version.h"
|
| +#include "chrome/test/chromedriver/commands.h"
|
| +#include "chrome/test/chromedriver/element_commands.h"
|
| +#include "chrome/test/chromedriver/net/url_request_context_getter.h"
|
| #include "chrome/test/chromedriver/server/http_response.h"
|
| +#include "chrome/test/chromedriver/session.h"
|
| +#include "chrome/test/chromedriver/session_commands.h"
|
| +#include "chrome/test/chromedriver/session_map.h"
|
| #include "chrome/test/chromedriver/util.h"
|
| +#include "chrome/test/chromedriver/window_commands.h"
|
| +
|
| +#if defined(OS_MACOSX)
|
| +#include "base/mac/scoped_nsautorelease_pool.h"
|
| +#endif
|
|
|
| namespace {
|
|
|
| +const char kLocalStorage[] = "localStorage";
|
| +const char kSessionStorage[] = "sessionStorage";
|
| const char kShutdownPath[] = "shutdown";
|
|
|
| +Status UnimplementedCommand(
|
| + const base::DictionaryValue& params,
|
| + const std::string& session_id,
|
| + scoped_ptr<base::Value>* value,
|
| + std::string* out_session_id) {
|
| + return Status(kUnknownCommand);
|
| +}
|
| +
|
| } // namespace
|
|
|
| HttpRequest::HttpRequest(HttpMethod method,
|
| @@ -33,236 +62,283 @@ HttpRequest::~HttpRequest() {}
|
|
|
| CommandMapping::CommandMapping(HttpMethod method,
|
| const std::string& path_pattern,
|
| - const std::string& name)
|
| - : method(method), path_pattern(path_pattern), name(name) {}
|
| + const Command& command)
|
| + : method(method), path_pattern(path_pattern), command(command) {}
|
|
|
| CommandMapping::~CommandMapping() {}
|
|
|
| -// static
|
| -scoped_ptr<HttpHandler::CommandMap> HttpHandler::CreateCommandMap() {
|
| +HttpHandler::HttpHandler(Log* log, const std::string& url_base)
|
| + : log_(log),
|
| + io_thread_("ChromeDriver IO"),
|
| + url_base_(url_base) {
|
| +#if defined(OS_MACOSX)
|
| + base::mac::ScopedNSAutoreleasePool autorelease_pool;
|
| +#endif
|
| + base::Thread::Options options(base::MessageLoop::TYPE_IO, 0);
|
| + CHECK(io_thread_.StartWithOptions(options));
|
| + context_getter_ = new URLRequestContextGetter(
|
| + io_thread_.message_loop_proxy());
|
| + socket_factory_ = CreateSyncWebSocketFactory(context_getter_.get());
|
| + adb_.reset(new AdbImpl(io_thread_.message_loop_proxy(), log_));
|
| + device_manager_.reset(new DeviceManager(adb_.get()));
|
| +
|
| CommandMapping commands[] = {
|
| - CommandMapping(kPost, "session", CommandNames::kNewSession),
|
| + CommandMapping(kPost, internal::kNewSessionPathPattern,
|
| + base::Bind(&ExecuteNewSession,
|
| + NewSessionParams(log_, &session_map_,
|
| + context_getter_, socket_factory_,
|
| + device_manager_.get()))),
|
| CommandMapping(kGet, "session/:sessionId",
|
| - CommandNames::kGetSessionCapabilities),
|
| - CommandMapping(kDelete, "session/:sessionId", CommandNames::kQuit),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteGetSessionCapabilities,
|
| + &session_map_))),
|
| + CommandMapping(kDelete, "session/:sessionId",
|
| + base::Bind(&ExecuteQuit, false, &session_map_)),
|
| CommandMapping(kGet, "session/:sessionId/window_handle",
|
| - CommandNames::kGetCurrentWindowHandle),
|
| + WrapToCommand(base::Bind(&ExecuteGetCurrentWindowHandle))),
|
| CommandMapping(kGet, "session/:sessionId/window_handles",
|
| - CommandNames::kGetWindowHandles),
|
| - CommandMapping(kPost, "session/:sessionId/url", CommandNames::kGet),
|
| - CommandMapping(kGet, "session/:sessionId/alert", CommandNames::kGetAlert),
|
| + WrapToCommand(base::Bind(&ExecuteGetWindowHandles))),
|
| + CommandMapping(kPost, "session/:sessionId/url",
|
| + WrapToCommand(base::Bind(&ExecuteGet))),
|
| + CommandMapping(kGet, "session/:sessionId/alert",
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteAlertCommand,
|
| + base::Bind(&ExecuteGetAlert)))),
|
| CommandMapping(kPost, "session/:sessionId/dismiss_alert",
|
| - CommandNames::kDismissAlert),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteAlertCommand,
|
| + base::Bind(&ExecuteDismissAlert)))),
|
| CommandMapping(kPost, "session/:sessionId/accept_alert",
|
| - CommandNames::kAcceptAlert),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteAlertCommand,
|
| + base::Bind(&ExecuteAcceptAlert)))),
|
| CommandMapping(kGet, "session/:sessionId/alert_text",
|
| - CommandNames::kGetAlertText),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteAlertCommand,
|
| + base::Bind(&ExecuteGetAlertText)))),
|
| CommandMapping(kPost, "session/:sessionId/alert_text",
|
| - CommandNames::kSetAlertValue),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteAlertCommand,
|
| + base::Bind(&ExecuteSetAlertValue)))),
|
| CommandMapping(kPost, "session/:sessionId/forward",
|
| - CommandNames::kGoForward),
|
| - CommandMapping(kPost, "session/:sessionId/back", CommandNames::kGoBack),
|
| + WrapToCommand(base::Bind(&ExecuteGoForward))),
|
| + CommandMapping(kPost, "session/:sessionId/back",
|
| + WrapToCommand(base::Bind(&ExecuteGoBack))),
|
| CommandMapping(kPost, "session/:sessionId/refresh",
|
| - CommandNames::kRefresh),
|
| + WrapToCommand(base::Bind(&ExecuteRefresh))),
|
| CommandMapping(kPost, "session/:sessionId/execute",
|
| - CommandNames::kExecuteScript),
|
| + WrapToCommand(base::Bind(&ExecuteExecuteScript))),
|
| CommandMapping(kPost, "session/:sessionId/execute_async",
|
| - CommandNames::kExecuteAsyncScript),
|
| + WrapToCommand(base::Bind(&ExecuteExecuteAsyncScript))),
|
| CommandMapping(kGet, "session/:sessionId/url",
|
| - CommandNames::kGetCurrentUrl),
|
| - CommandMapping(kGet, "session/:sessionId/title", CommandNames::kGetTitle),
|
| + WrapToCommand(base::Bind(&ExecuteGetCurrentUrl))),
|
| + CommandMapping(kGet, "session/:sessionId/title",
|
| + WrapToCommand(base::Bind(&ExecuteGetTitle))),
|
| CommandMapping(kGet, "session/:sessionId/source",
|
| - CommandNames::kGetPageSource),
|
| + WrapToCommand(base::Bind(&ExecuteGetPageSource))),
|
| CommandMapping(kGet, "session/:sessionId/screenshot",
|
| - CommandNames::kScreenshot),
|
| + WrapToCommand(base::Bind(&ExecuteScreenshot))),
|
| CommandMapping(kPost, "session/:sessionId/visible",
|
| - CommandNames::kSetBrowserVisible),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kGet, "session/:sessionId/visible",
|
| - CommandNames::kIsBrowserVisible),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/element",
|
| - CommandNames::kFindElement),
|
| + WrapToCommand(base::Bind(&ExecuteFindElement, 50))),
|
| CommandMapping(kPost, "session/:sessionId/elements",
|
| - CommandNames::kFindElements),
|
| + WrapToCommand(base::Bind(&ExecuteFindElements, 50))),
|
| CommandMapping(kPost, "session/:sessionId/element/active",
|
| - CommandNames::kGetActiveElement),
|
| + WrapToCommand(base::Bind(&ExecuteGetActiveElement))),
|
| CommandMapping(kPost, "session/:sessionId/element/:id/element",
|
| - CommandNames::kFindChildElement),
|
| + WrapToCommand(base::Bind(&ExecuteFindChildElement, 50))),
|
| CommandMapping(kPost, "session/:sessionId/element/:id/elements",
|
| - CommandNames::kFindChildElements),
|
| + WrapToCommand(base::Bind(&ExecuteFindChildElements, 50))),
|
| CommandMapping(kPost, "session/:sessionId/element/:id/click",
|
| - CommandNames::kClickElement),
|
| + WrapToCommand(base::Bind(&ExecuteClickElement))),
|
| CommandMapping(kPost, "session/:sessionId/element/:id/clear",
|
| - CommandNames::kClearElement),
|
| + WrapToCommand(base::Bind(&ExecuteClearElement))),
|
| CommandMapping(kPost, "session/:sessionId/element/:id/submit",
|
| - CommandNames::kSubmitElement),
|
| + WrapToCommand(base::Bind(&ExecuteSubmitElement))),
|
| CommandMapping(kGet, "session/:sessionId/element/:id/text",
|
| - CommandNames::kGetElementText),
|
| + WrapToCommand(base::Bind(&ExecuteGetElementText))),
|
| CommandMapping(kPost, "session/:sessionId/element/:id/value",
|
| - CommandNames::kSendKeysToElement),
|
| + WrapToCommand(base::Bind(&ExecuteSendKeysToElement))),
|
| CommandMapping(kPost, "session/:sessionId/file",
|
| - CommandNames::kUploadFile),
|
| + WrapToCommand(base::Bind(&ExecuteUploadFile))),
|
| CommandMapping(kGet, "session/:sessionId/element/:id/value",
|
| - CommandNames::kGetElementValue),
|
| + WrapToCommand(base::Bind(&ExecuteGetElementValue))),
|
| CommandMapping(kGet, "session/:sessionId/element/:id/name",
|
| - CommandNames::kGetElementTagName),
|
| + WrapToCommand(base::Bind(&ExecuteGetElementTagName))),
|
| CommandMapping(kGet, "session/:sessionId/element/:id/selected",
|
| - CommandNames::kIsElementSelected),
|
| + WrapToCommand(base::Bind(&ExecuteIsElementSelected))),
|
| CommandMapping(kGet, "session/:sessionId/element/:id/enabled",
|
| - CommandNames::kIsElementEnabled),
|
| + WrapToCommand(base::Bind(&ExecuteIsElementEnabled))),
|
| CommandMapping(kGet, "session/:sessionId/element/:id/displayed",
|
| - CommandNames::kIsElementDisplayed),
|
| + WrapToCommand(base::Bind(&ExecuteIsElementDisplayed))),
|
| CommandMapping(kPost, "session/:sessionId/element/:id/hover",
|
| - CommandNames::kHoverOverElement),
|
| + WrapToCommand(base::Bind(&ExecuteHoverOverElement))),
|
| CommandMapping(kGet, "session/:sessionId/element/:id/location",
|
| - CommandNames::kGetElementLocation),
|
| + WrapToCommand(base::Bind(&ExecuteGetElementLocation))),
|
| CommandMapping(kGet, "session/:sessionId/element/:id/location_in_view",
|
| - CommandNames::kGetElementLocationOnceScrolledIntoView),
|
| + WrapToCommand(
|
| + base::Bind(
|
| + &ExecuteGetElementLocationOnceScrolledIntoView))),
|
| CommandMapping(kGet, "session/:sessionId/element/:id/size",
|
| - CommandNames::kGetElementSize),
|
| + WrapToCommand(base::Bind(&ExecuteGetElementSize))),
|
| CommandMapping(kGet, "session/:sessionId/element/:id/attribute/:name",
|
| - CommandNames::kGetElementAttribute),
|
| + WrapToCommand(base::Bind(&ExecuteGetElementAttribute))),
|
| CommandMapping(kGet, "session/:sessionId/element/:id/equals/:other",
|
| - CommandNames::kElementEquals),
|
| + WrapToCommand(base::Bind(&ExecuteElementEquals))),
|
| CommandMapping(kGet, "session/:sessionId/cookie",
|
| - CommandNames::kGetCookies),
|
| + WrapToCommand(base::Bind(&ExecuteGetCookies))),
|
| CommandMapping(kPost, "session/:sessionId/cookie",
|
| - CommandNames::kAddCookie),
|
| + WrapToCommand(base::Bind(&ExecuteAddCookie))),
|
| CommandMapping(kDelete, "session/:sessionId/cookie",
|
| - CommandNames::kDeleteAllCookies),
|
| + WrapToCommand(base::Bind(&ExecuteDeleteAllCookies))),
|
| CommandMapping(kDelete, "session/:sessionId/cookie/:name",
|
| - CommandNames::kDeleteCookie),
|
| + WrapToCommand(base::Bind(&ExecuteDeleteCookie))),
|
| CommandMapping(kPost, "session/:sessionId/frame",
|
| - CommandNames::kSwitchToFrame),
|
| + WrapToCommand(base::Bind(&ExecuteSwitchToFrame))),
|
| CommandMapping(kPost, "session/:sessionId/window",
|
| - CommandNames::kSwitchToWindow),
|
| + WrapToCommand(base::Bind(&ExecuteSwitchToWindow))),
|
| CommandMapping(kGet, "session/:sessionId/window/:windowHandle/size",
|
| - CommandNames::kGetWindowSize),
|
| + WrapToCommand(base::Bind(&ExecuteGetWindowSize))),
|
| CommandMapping(kGet, "session/:sessionId/window/:windowHandle/position",
|
| - CommandNames::kGetWindowPosition),
|
| + WrapToCommand(base::Bind(&ExecuteGetWindowPosition))),
|
| CommandMapping(kPost, "session/:sessionId/window/:windowHandle/size",
|
| - CommandNames::kSetWindowSize),
|
| + WrapToCommand(base::Bind(&ExecuteSetWindowSize))),
|
| CommandMapping(kPost, "session/:sessionId/window/:windowHandle/position",
|
| - CommandNames::kSetWindowPosition),
|
| + WrapToCommand(base::Bind(&ExecuteSetWindowPosition))),
|
| CommandMapping(kPost, "session/:sessionId/window/:windowHandle/maximize",
|
| - CommandNames::kMaximizeWindow),
|
| + WrapToCommand(base::Bind(&ExecuteMaximizeWindow))),
|
| CommandMapping(kDelete, "session/:sessionId/window",
|
| - CommandNames::kClose),
|
| + WrapToCommand(base::Bind(&ExecuteClose, &session_map_))),
|
| CommandMapping(kPost, "session/:sessionId/element/:id/drag",
|
| - CommandNames::kDragElement),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kGet, "session/:sessionId/element/:id/css/:propertyName",
|
| - CommandNames::kGetElementValueOfCssProperty),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteGetElementValueOfCSSProperty))),
|
| CommandMapping(kPost, "session/:sessionId/timeouts/implicit_wait",
|
| - CommandNames::kImplicitlyWait),
|
| + WrapToCommand(base::Bind(&ExecuteImplicitlyWait))),
|
| CommandMapping(kPost, "session/:sessionId/timeouts/async_script",
|
| - CommandNames::kSetScriptTimeout),
|
| + WrapToCommand(base::Bind(&ExecuteSetScriptTimeout))),
|
| CommandMapping(kPost, "session/:sessionId/timeouts",
|
| - CommandNames::kSetTimeout),
|
| + WrapToCommand(base::Bind(&ExecuteSetTimeout))),
|
| CommandMapping(kPost, "session/:sessionId/execute_sql",
|
| - CommandNames::kExecuteSQL),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kGet, "session/:sessionId/location",
|
| - CommandNames::kGetLocation),
|
| + WrapToCommand(base::Bind(&ExecuteGetLocation))),
|
| CommandMapping(kPost, "session/:sessionId/location",
|
| - CommandNames::kSetLocation),
|
| + WrapToCommand(base::Bind(&ExecuteSetLocation))),
|
| CommandMapping(kGet, "session/:sessionId/application_cache/status",
|
| - CommandNames::kGetStatus),
|
| + base::Bind(&ExecuteGetStatus)),
|
| CommandMapping(kGet, "session/:sessionId/browser_connection",
|
| - CommandNames::kIsBrowserOnline),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/browser_connection",
|
| - CommandNames::kSetBrowserOnline),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kGet, "session/:sessionId/local_storage/key/:key",
|
| - CommandNames::kGetLocalStorageItem),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteGetStorageItem, kLocalStorage))),
|
| CommandMapping(kDelete, "session/:sessionId/local_storage/key/:key",
|
| - CommandNames::kRemoveLocalStorageItem),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteRemoveStorageItem, kLocalStorage))),
|
| CommandMapping(kGet, "session/:sessionId/local_storage",
|
| - CommandNames::kGetLocalStorageKeys),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteGetStorageKeys, kLocalStorage))),
|
| CommandMapping(kPost, "session/:sessionId/local_storage",
|
| - CommandNames::kSetLocalStorageItem),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteSetStorageItem, kLocalStorage))),
|
| CommandMapping(kDelete, "session/:sessionId/local_storage",
|
| - CommandNames::kClearLocalStorage),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteClearStorage, kLocalStorage))),
|
| CommandMapping(kGet, "session/:sessionId/local_storage/size",
|
| - CommandNames::kGetLocalStorageSize),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteGetStorageSize, kLocalStorage))),
|
| CommandMapping(kGet, "session/:sessionId/session_storage/key/:key",
|
| - CommandNames::kGetSessionStorageItem),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteGetStorageItem, kSessionStorage))),
|
| CommandMapping(kDelete, "session/:sessionId/session_storage/key/:key",
|
| - CommandNames::kRemoveSessionStorageItem),
|
| + WrapToCommand(
|
| + base::Bind(
|
| + &ExecuteRemoveStorageItem, kSessionStorage))),
|
| CommandMapping(kGet, "session/:sessionId/session_storage",
|
| - CommandNames::kGetSessionStorageKey),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteGetStorageKeys, kSessionStorage))),
|
| CommandMapping(kPost, "session/:sessionId/session_storage",
|
| - CommandNames::kSetSessionStorageItem),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteSetStorageItem, kSessionStorage))),
|
| CommandMapping(kDelete, "session/:sessionId/session_storage",
|
| - CommandNames::kClearSessionStorage),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteClearStorage, kSessionStorage))),
|
| CommandMapping(kGet, "session/:sessionId/session_storage/size",
|
| - CommandNames::kGetSessionStorageSize),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteGetStorageSize, kSessionStorage))),
|
| CommandMapping(kGet, "session/:sessionId/orientation",
|
| - CommandNames::kGetScreenOrientation),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/orientation",
|
| - CommandNames::kSetScreenOrientation),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/click",
|
| - CommandNames::kMouseClick),
|
| + WrapToCommand(base::Bind(&ExecuteMouseClick))),
|
| CommandMapping(kPost, "session/:sessionId/doubleclick",
|
| - CommandNames::kMouseDoubleClick),
|
| + WrapToCommand(base::Bind(&ExecuteMouseDoubleClick))),
|
| CommandMapping(kPost, "session/:sessionId/buttondown",
|
| - CommandNames::kMouseButtonDown),
|
| + WrapToCommand(base::Bind(&ExecuteMouseButtonDown))),
|
| CommandMapping(kPost, "session/:sessionId/buttonup",
|
| - CommandNames::kMouseButtonUp),
|
| + WrapToCommand(base::Bind(&ExecuteMouseButtonUp))),
|
| CommandMapping(kPost, "session/:sessionId/moveto",
|
| - CommandNames::kMouseMoveTo),
|
| + WrapToCommand(base::Bind(&ExecuteMouseMoveTo))),
|
| CommandMapping(kPost, "session/:sessionId/keys",
|
| - CommandNames::kSendKeysToActiveElement),
|
| + WrapToCommand(
|
| + base::Bind(&ExecuteSendKeysToActiveElement))),
|
| CommandMapping(kGet, "session/:sessionId/ime/available_engines",
|
| - CommandNames::kImeGetAvailableEngines),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kGet, "session/:sessionId/ime/active_engine",
|
| - CommandNames::kImeGetActiveEngine),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kGet, "session/:sessionId/ime/activated",
|
| - CommandNames::kImeIsActivated),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/ime/deactivate",
|
| - CommandNames::kImeDeactivate),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/ime/activate",
|
| - CommandNames::kImeActivateEngine),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/touch/click",
|
| - CommandNames::kTouchSingleTap),
|
| + WrapToCommand(base::Bind(&ExecuteTouchSingleTap))),
|
| CommandMapping(kPost, "session/:sessionId/touch/down",
|
| - CommandNames::kTouchDown),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/touch/up",
|
| - CommandNames::kTouchUp),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/touch/move",
|
| - CommandNames::kTouchMove),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/touch/scroll",
|
| - CommandNames::kTouchScroll),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/touch/doubleclick",
|
| - CommandNames::kTouchDoubleTap),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/touch/longclick",
|
| - CommandNames::kTouchLongPress),
|
| + base::Bind(&UnimplementedCommand)),
|
| CommandMapping(kPost, "session/:sessionId/touch/flick",
|
| - CommandNames::kTouchFlick),
|
| - CommandMapping(kPost, "session/:sessionId/log", CommandNames::kGetLog),
|
| + base::Bind(&UnimplementedCommand)),
|
| + CommandMapping(kPost, "session/:sessionId/log",
|
| + WrapToCommand(base::Bind(&ExecuteGetLog))),
|
| CommandMapping(kGet, "session/:sessionId/log/types",
|
| - CommandNames::kGetAvailableLogTypes),
|
| - CommandMapping(kPost, "logs", CommandNames::kGetSessionLogs),
|
| - CommandMapping(kGet, "status", CommandNames::kStatus),
|
| + WrapToCommand(base::Bind(&ExecuteGetAvailableLogTypes))),
|
| + CommandMapping(kPost, "logs", base::Bind(&UnimplementedCommand)),
|
| + CommandMapping(kGet, "status", base::Bind(&ExecuteGetStatus)),
|
|
|
| // Custom Chrome commands:
|
| // Allow quit all to be called with GET or POST.
|
| - CommandMapping(kGet, kShutdownPath, CommandNames::kQuitAll),
|
| - CommandMapping(kPost, kShutdownPath, CommandNames::kQuitAll),
|
| + CommandMapping(kGet, kShutdownPath,
|
| + base::Bind(&ExecuteQuitAll,
|
| + base::Bind(&ExecuteQuit, true, &session_map_),
|
| + &session_map_)),
|
| + CommandMapping(kPost, kShutdownPath,
|
| + base::Bind(&ExecuteQuitAll,
|
| + base::Bind(&ExecuteQuit, true, &session_map_),
|
| + &session_map_)),
|
| CommandMapping(kGet, "session/:sessionId/is_loading",
|
| - CommandNames::kIsLoading),
|
| + WrapToCommand(base::Bind(&ExecuteIsLoading))),
|
| };
|
| - return scoped_ptr<CommandMap>(
|
| + this->command_map_.reset(
|
| new CommandMap(commands, commands + arraysize(commands)));
|
| }
|
|
|
| -HttpHandler::HttpHandler(Log* log,
|
| - scoped_ptr<CommandExecutor> executor,
|
| - scoped_ptr<CommandMap> command_map,
|
| - const std::string& url_base)
|
| - : log_(log),
|
| - executor_(executor.Pass()),
|
| - command_map_(command_map.Pass()),
|
| - url_base_(url_base) {
|
| - executor_->Init();
|
| -}
|
| -
|
| HttpHandler::~HttpHandler() {}
|
|
|
| void HttpHandler::Handle(const HttpRequest& request,
|
| @@ -292,6 +368,23 @@ bool HttpHandler::ShouldShutdown(const HttpRequest& request) {
|
| return request.path == url_base_ + kShutdownPath;
|
| }
|
|
|
| +Command HttpHandler::WrapToCommand(
|
| + const SessionCommand& session_command) {
|
| + return base::Bind(&ExecuteSessionCommand, &session_map_, session_command);
|
| +}
|
| +
|
| +Command HttpHandler::WrapToCommand(
|
| + const WindowCommand& window_command) {
|
| + return WrapToCommand(
|
| + base::Bind(&ExecuteWindowCommand, window_command));
|
| +}
|
| +
|
| +Command HttpHandler::WrapToCommand(
|
| + const ElementCommand& element_command) {
|
| + return WrapToCommand(
|
| + base::Bind(&ExecuteElementCommand, element_command));
|
| +}
|
| +
|
| void HttpHandler::HandleInternal(const HttpRequest& request,
|
| HttpResponse* response) {
|
| std::string path = request.path;
|
| @@ -339,29 +432,40 @@ bool HttpHandler::HandleWebDriverCommand(
|
| params.MergeDictionary(body_params);
|
| }
|
|
|
| - StatusCode status = kOk;
|
| scoped_ptr<base::Value> value;
|
| std::string out_session_id;
|
| - executor_->ExecuteCommand(
|
| - iter->name, params, session_id, &status, &value, &out_session_id);
|
| + Status status = iter->command.Run(
|
| + params, session_id, &value, &out_session_id);
|
|
|
| - if (status == kUnknownCommand) {
|
| + if (status.code() == kUnknownCommand) {
|
| *response = HttpResponse(HttpResponse::kNotImplemented);
|
| - response->set_body("unimplemented command: " + iter->name);
|
| + response->set_body("unimplemented command: " + trimmed_path);
|
| return true;
|
| }
|
|
|
| - if (iter->name == CommandNames::kNewSession && status == kOk) {
|
| + if (iter->path_pattern == internal::kNewSessionPathPattern && status.IsOk()) {
|
| // Creating a session involves a HTTP request to /session, which is
|
| // supposed to redirect to /session/:sessionId, which returns the
|
| // session info.
|
| *response = HttpResponse(HttpResponse::kSeeOther);
|
| response->AddHeader("Location", url_base_ + "session/" + out_session_id);
|
| return true;
|
| + } else if (status.IsError()) {
|
| + status.AddDetails(base::StringPrintf(
|
| + "Driver info: chromedriver=%s,platform=%s %s %s",
|
| + kChromeDriverVersion,
|
| + base::SysInfo::OperatingSystemName().c_str(),
|
| + base::SysInfo::OperatingSystemVersion().c_str(),
|
| + base::SysInfo::OperatingSystemArchitecture().c_str()));
|
| + scoped_ptr<base::DictionaryValue> error(new base::DictionaryValue());
|
| + error->SetString("message", status.message());
|
| + value.reset(error.release());
|
| }
|
| + if (!value)
|
| + value.reset(base::Value::CreateNullValue());
|
|
|
| base::DictionaryValue body_params;
|
| - body_params.SetInteger("status", status);
|
| + body_params.SetInteger("status", status.code());
|
| body_params.Set("value", value.release());
|
| body_params.SetString("sessionId", out_session_id);
|
| std::string body;
|
| @@ -376,6 +480,8 @@ bool HttpHandler::HandleWebDriverCommand(
|
|
|
| namespace internal {
|
|
|
| +const char kNewSessionPathPattern[] = "session";
|
| +
|
| bool MatchesCommand(HttpMethod method,
|
| const std::string& path,
|
| const CommandMapping& command,
|
| @@ -410,4 +516,4 @@ bool MatchesCommand(HttpMethod method,
|
| return true;
|
| }
|
|
|
| -} // namespace
|
| +} // namespace internal
|
|
|