| 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 fb408b6c4f749d4b4719c5a28115dfb56bd6cbce..4699b93b56ace6cb776ec37f7847a118f755723a 100644
|
| --- a/chrome/test/chromedriver/server/http_handler.cc
|
| +++ b/chrome/test/chromedriver/server/http_handler.cc
|
| @@ -23,15 +23,11 @@
|
| #include "chrome/test/chromedriver/chrome/log.h"
|
| #include "chrome/test/chromedriver/chrome/status.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/session_thread_map.h"
|
| #include "chrome/test/chromedriver/util.h"
|
| -#include "chrome/test/chromedriver/window_commands.h"
|
| #include "net/server/http_server_request_info.h"
|
|
|
| #if defined(OS_MACOSX)
|
| @@ -44,12 +40,11 @@ const char kLocalStorage[] = "localStorage";
|
| const char kSessionStorage[] = "sessionStorage";
|
| const char kShutdownPath[] = "shutdown";
|
|
|
| -Status UnimplementedCommand(
|
| +void UnimplementedCommand(
|
| const base::DictionaryValue& params,
|
| const std::string& session_id,
|
| - scoped_ptr<base::Value>* value,
|
| - std::string* out_session_id) {
|
| - return Status(kUnknownCommand);
|
| + const CommandCallback& callback) {
|
| + callback.Run(Status(kUnknownCommand), scoped_ptr<base::Value>(), session_id);
|
| }
|
|
|
| } // namespace
|
| @@ -63,294 +58,411 @@ CommandMapping::~CommandMapping() {}
|
|
|
| HttpHandler::HttpHandler(Log* log, const std::string& url_base)
|
| : log_(log),
|
| - io_thread_("ChromeDriver IO"),
|
| - url_base_(url_base) {
|
| + url_base_(url_base),
|
| + received_shutdown_(false),
|
| + command_map_(new CommandMap()),
|
| + weak_ptr_factory_(this) {}
|
| +
|
| +HttpHandler::HttpHandler(
|
| + const scoped_refptr<base::SingleThreadTaskRunner> io_task_runner,
|
| + Log* log,
|
| + const std::string& url_base)
|
| + : log_(log),
|
| + url_base_(url_base),
|
| + received_shutdown_(false),
|
| + weak_ptr_factory_(this) {
|
| #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());
|
| + context_getter_ = new URLRequestContextGetter(io_task_runner);
|
| socket_factory_ = CreateSyncWebSocketFactory(context_getter_.get());
|
| - adb_.reset(new AdbImpl(io_thread_.message_loop_proxy(), log_));
|
| + adb_.reset(new AdbImpl(io_task_runner, log_));
|
| device_manager_.reset(new DeviceManager(adb_.get()));
|
|
|
| CommandMapping commands[] = {
|
| - CommandMapping(kPost, internal::kNewSessionPathPattern,
|
| + CommandMapping(kPost,
|
| + internal::kNewSessionPathPattern,
|
| base::Bind(&ExecuteNewSession,
|
| - NewSessionParams(log_, &session_map_,
|
| - context_getter_, socket_factory_,
|
| - device_manager_.get()))),
|
| - CommandMapping(kGet, "session/:sessionId",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteGetSessionCapabilities,
|
| - &session_map_))),
|
| - CommandMapping(kDelete, "session/:sessionId",
|
| - base::Bind(&ExecuteQuit, false, &session_map_)),
|
| - CommandMapping(kGet, "session/:sessionId/window_handle",
|
| + NewSessionParams(log_,
|
| + &session_thread_map_,
|
| + context_getter_,
|
| + socket_factory_,
|
| + device_manager_.get()))),
|
| + CommandMapping(kGet,
|
| + "session/:sessionId",
|
| + WrapToCommand(base::Bind(&ExecuteGetSessionCapabilities))),
|
| + CommandMapping(kDelete,
|
| + "session/:sessionId",
|
| + base::Bind(&ExecuteSessionCommand,
|
| + &session_thread_map_,
|
| + base::Bind(&ExecuteQuit, false),
|
| + true)),
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/window_handle",
|
| WrapToCommand(base::Bind(&ExecuteGetCurrentWindowHandle))),
|
| - CommandMapping(kGet, "session/:sessionId/window_handles",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/window_handles",
|
| WrapToCommand(base::Bind(&ExecuteGetWindowHandles))),
|
| - CommandMapping(kPost, "session/:sessionId/url",
|
| + 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",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteAlertCommand,
|
| - base::Bind(&ExecuteDismissAlert)))),
|
| - CommandMapping(kPost, "session/:sessionId/accept_alert",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteAlertCommand,
|
| - base::Bind(&ExecuteAcceptAlert)))),
|
| - CommandMapping(kGet, "session/:sessionId/alert_text",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteAlertCommand,
|
| - base::Bind(&ExecuteGetAlertText)))),
|
| - CommandMapping(kPost, "session/:sessionId/alert_text",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteAlertCommand,
|
| - base::Bind(&ExecuteSetAlertValue)))),
|
| - CommandMapping(kPost, "session/:sessionId/forward",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/alert",
|
| + WrapToCommand(base::Bind(&ExecuteAlertCommand,
|
| + base::Bind(&ExecuteGetAlert)))),
|
| + CommandMapping(
|
| + kPost,
|
| + "session/:sessionId/dismiss_alert",
|
| + WrapToCommand(base::Bind(&ExecuteAlertCommand,
|
| + base::Bind(&ExecuteDismissAlert)))),
|
| + CommandMapping(
|
| + kPost,
|
| + "session/:sessionId/accept_alert",
|
| + WrapToCommand(base::Bind(&ExecuteAlertCommand,
|
| + base::Bind(&ExecuteAcceptAlert)))),
|
| + CommandMapping(
|
| + kGet,
|
| + "session/:sessionId/alert_text",
|
| + WrapToCommand(base::Bind(&ExecuteAlertCommand,
|
| + base::Bind(&ExecuteGetAlertText)))),
|
| + CommandMapping(
|
| + kPost,
|
| + "session/:sessionId/alert_text",
|
| + WrapToCommand(base::Bind(&ExecuteAlertCommand,
|
| + base::Bind(&ExecuteSetAlertValue)))),
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/forward",
|
| WrapToCommand(base::Bind(&ExecuteGoForward))),
|
| - CommandMapping(kPost, "session/:sessionId/back",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/back",
|
| WrapToCommand(base::Bind(&ExecuteGoBack))),
|
| - CommandMapping(kPost, "session/:sessionId/refresh",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/refresh",
|
| WrapToCommand(base::Bind(&ExecuteRefresh))),
|
| - CommandMapping(kPost, "session/:sessionId/execute",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/execute",
|
| WrapToCommand(base::Bind(&ExecuteExecuteScript))),
|
| - CommandMapping(kPost, "session/:sessionId/execute_async",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/execute_async",
|
| WrapToCommand(base::Bind(&ExecuteExecuteAsyncScript))),
|
| - CommandMapping(kGet, "session/:sessionId/url",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/url",
|
| WrapToCommand(base::Bind(&ExecuteGetCurrentUrl))),
|
| - CommandMapping(kGet, "session/:sessionId/title",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/title",
|
| WrapToCommand(base::Bind(&ExecuteGetTitle))),
|
| - CommandMapping(kGet, "session/:sessionId/source",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/source",
|
| WrapToCommand(base::Bind(&ExecuteGetPageSource))),
|
| - CommandMapping(kGet, "session/:sessionId/screenshot",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/screenshot",
|
| WrapToCommand(base::Bind(&ExecuteScreenshot))),
|
| - CommandMapping(kPost, "session/:sessionId/visible",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/visible",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kGet, "session/:sessionId/visible",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/visible",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/element",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/element",
|
| WrapToCommand(base::Bind(&ExecuteFindElement, 50))),
|
| - CommandMapping(kPost, "session/:sessionId/elements",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/elements",
|
| WrapToCommand(base::Bind(&ExecuteFindElements, 50))),
|
| - CommandMapping(kPost, "session/:sessionId/element/active",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/element/active",
|
| WrapToCommand(base::Bind(&ExecuteGetActiveElement))),
|
| - CommandMapping(kPost, "session/:sessionId/element/:id/element",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/element/:id/element",
|
| WrapToCommand(base::Bind(&ExecuteFindChildElement, 50))),
|
| - CommandMapping(kPost, "session/:sessionId/element/:id/elements",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/element/:id/elements",
|
| WrapToCommand(base::Bind(&ExecuteFindChildElements, 50))),
|
| - CommandMapping(kPost, "session/:sessionId/element/:id/click",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/element/:id/click",
|
| WrapToCommand(base::Bind(&ExecuteClickElement))),
|
| - CommandMapping(kPost, "session/:sessionId/element/:id/clear",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/element/:id/clear",
|
| WrapToCommand(base::Bind(&ExecuteClearElement))),
|
| - CommandMapping(kPost, "session/:sessionId/element/:id/submit",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/element/:id/submit",
|
| WrapToCommand(base::Bind(&ExecuteSubmitElement))),
|
| - CommandMapping(kGet, "session/:sessionId/element/:id/text",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/element/:id/text",
|
| WrapToCommand(base::Bind(&ExecuteGetElementText))),
|
| - CommandMapping(kPost, "session/:sessionId/element/:id/value",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/element/:id/value",
|
| WrapToCommand(base::Bind(&ExecuteSendKeysToElement))),
|
| - CommandMapping(kPost, "session/:sessionId/file",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/file",
|
| WrapToCommand(base::Bind(&ExecuteUploadFile))),
|
| - CommandMapping(kGet, "session/:sessionId/element/:id/value",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/element/:id/value",
|
| WrapToCommand(base::Bind(&ExecuteGetElementValue))),
|
| - CommandMapping(kGet, "session/:sessionId/element/:id/name",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/element/:id/name",
|
| WrapToCommand(base::Bind(&ExecuteGetElementTagName))),
|
| - CommandMapping(kGet, "session/:sessionId/element/:id/selected",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/element/:id/selected",
|
| WrapToCommand(base::Bind(&ExecuteIsElementSelected))),
|
| - CommandMapping(kGet, "session/:sessionId/element/:id/enabled",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/element/:id/enabled",
|
| WrapToCommand(base::Bind(&ExecuteIsElementEnabled))),
|
| - CommandMapping(kGet, "session/:sessionId/element/:id/displayed",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/element/:id/displayed",
|
| WrapToCommand(base::Bind(&ExecuteIsElementDisplayed))),
|
| - CommandMapping(kPost, "session/:sessionId/element/:id/hover",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/element/:id/hover",
|
| WrapToCommand(base::Bind(&ExecuteHoverOverElement))),
|
| - CommandMapping(kGet, "session/:sessionId/element/:id/location",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/element/:id/location",
|
| WrapToCommand(base::Bind(&ExecuteGetElementLocation))),
|
| - CommandMapping(kGet, "session/:sessionId/element/:id/location_in_view",
|
| - WrapToCommand(
|
| - base::Bind(
|
| - &ExecuteGetElementLocationOnceScrolledIntoView))),
|
| - CommandMapping(kGet, "session/:sessionId/element/:id/size",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/element/:id/location_in_view",
|
| + WrapToCommand(base::Bind(
|
| + &ExecuteGetElementLocationOnceScrolledIntoView))),
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/element/:id/size",
|
| WrapToCommand(base::Bind(&ExecuteGetElementSize))),
|
| - CommandMapping(kGet, "session/:sessionId/element/:id/attribute/:name",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/element/:id/attribute/:name",
|
| WrapToCommand(base::Bind(&ExecuteGetElementAttribute))),
|
| - CommandMapping(kGet, "session/:sessionId/element/:id/equals/:other",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/element/:id/equals/:other",
|
| WrapToCommand(base::Bind(&ExecuteElementEquals))),
|
| - CommandMapping(kGet, "session/:sessionId/cookie",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/cookie",
|
| WrapToCommand(base::Bind(&ExecuteGetCookies))),
|
| - CommandMapping(kPost, "session/:sessionId/cookie",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/cookie",
|
| WrapToCommand(base::Bind(&ExecuteAddCookie))),
|
| - CommandMapping(kDelete, "session/:sessionId/cookie",
|
| + CommandMapping(kDelete,
|
| + "session/:sessionId/cookie",
|
| WrapToCommand(base::Bind(&ExecuteDeleteAllCookies))),
|
| - CommandMapping(kDelete, "session/:sessionId/cookie/:name",
|
| + CommandMapping(kDelete,
|
| + "session/:sessionId/cookie/:name",
|
| WrapToCommand(base::Bind(&ExecuteDeleteCookie))),
|
| - CommandMapping(kPost, "session/:sessionId/frame",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/frame",
|
| WrapToCommand(base::Bind(&ExecuteSwitchToFrame))),
|
| - CommandMapping(kPost, "session/:sessionId/window",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/window",
|
| WrapToCommand(base::Bind(&ExecuteSwitchToWindow))),
|
| - CommandMapping(kGet, "session/:sessionId/window/:windowHandle/size",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/window/:windowHandle/size",
|
| WrapToCommand(base::Bind(&ExecuteGetWindowSize))),
|
| - CommandMapping(kGet, "session/:sessionId/window/:windowHandle/position",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/window/:windowHandle/position",
|
| WrapToCommand(base::Bind(&ExecuteGetWindowPosition))),
|
| - CommandMapping(kPost, "session/:sessionId/window/:windowHandle/size",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/window/:windowHandle/size",
|
| WrapToCommand(base::Bind(&ExecuteSetWindowSize))),
|
| - CommandMapping(kPost, "session/:sessionId/window/:windowHandle/position",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/window/:windowHandle/position",
|
| WrapToCommand(base::Bind(&ExecuteSetWindowPosition))),
|
| - CommandMapping(kPost, "session/:sessionId/window/:windowHandle/maximize",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/window/:windowHandle/maximize",
|
| WrapToCommand(base::Bind(&ExecuteMaximizeWindow))),
|
| - CommandMapping(kDelete, "session/:sessionId/window",
|
| - WrapToCommand(base::Bind(&ExecuteClose, &session_map_))),
|
| - CommandMapping(kPost, "session/:sessionId/element/:id/drag",
|
| + CommandMapping(kDelete,
|
| + "session/:sessionId/window",
|
| + WrapToCommand(base::Bind(&ExecuteClose))),
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/element/:id/drag",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kGet, "session/:sessionId/element/:id/css/:propertyName",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteGetElementValueOfCSSProperty))),
|
| - CommandMapping(kPost, "session/:sessionId/timeouts/implicit_wait",
|
| + CommandMapping(
|
| + kGet,
|
| + "session/:sessionId/element/:id/css/:propertyName",
|
| + WrapToCommand(base::Bind(&ExecuteGetElementValueOfCSSProperty))),
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/timeouts/implicit_wait",
|
| WrapToCommand(base::Bind(&ExecuteImplicitlyWait))),
|
| - CommandMapping(kPost, "session/:sessionId/timeouts/async_script",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/timeouts/async_script",
|
| WrapToCommand(base::Bind(&ExecuteSetScriptTimeout))),
|
| - CommandMapping(kPost, "session/:sessionId/timeouts",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/timeouts",
|
| WrapToCommand(base::Bind(&ExecuteSetTimeout))),
|
| - CommandMapping(kPost, "session/:sessionId/execute_sql",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/execute_sql",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kGet, "session/:sessionId/location",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/location",
|
| WrapToCommand(base::Bind(&ExecuteGetLocation))),
|
| - CommandMapping(kPost, "session/:sessionId/location",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/location",
|
| WrapToCommand(base::Bind(&ExecuteSetLocation))),
|
| - CommandMapping(kGet, "session/:sessionId/application_cache/status",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/application_cache/status",
|
| base::Bind(&ExecuteGetStatus)),
|
| - CommandMapping(kGet, "session/:sessionId/browser_connection",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/browser_connection",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/browser_connection",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/browser_connection",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kGet, "session/:sessionId/local_storage/key/:key",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteGetStorageItem, kLocalStorage))),
|
| - CommandMapping(kDelete, "session/:sessionId/local_storage/key/:key",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteRemoveStorageItem, kLocalStorage))),
|
| - CommandMapping(kGet, "session/:sessionId/local_storage",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteGetStorageKeys, kLocalStorage))),
|
| - CommandMapping(kPost, "session/:sessionId/local_storage",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteSetStorageItem, kLocalStorage))),
|
| - CommandMapping(kDelete, "session/:sessionId/local_storage",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteClearStorage, kLocalStorage))),
|
| - CommandMapping(kGet, "session/:sessionId/local_storage/size",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteGetStorageSize, kLocalStorage))),
|
| - CommandMapping(kGet, "session/:sessionId/session_storage/key/:key",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteGetStorageItem, kSessionStorage))),
|
| - CommandMapping(kDelete, "session/:sessionId/session_storage/key/:key",
|
| - WrapToCommand(
|
| - base::Bind(
|
| - &ExecuteRemoveStorageItem, kSessionStorage))),
|
| - CommandMapping(kGet, "session/:sessionId/session_storage",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteGetStorageKeys, kSessionStorage))),
|
| - CommandMapping(kPost, "session/:sessionId/session_storage",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteSetStorageItem, kSessionStorage))),
|
| - CommandMapping(kDelete, "session/:sessionId/session_storage",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteClearStorage, kSessionStorage))),
|
| - CommandMapping(kGet, "session/:sessionId/session_storage/size",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteGetStorageSize, kSessionStorage))),
|
| - CommandMapping(kGet, "session/:sessionId/orientation",
|
| + CommandMapping(
|
| + kGet,
|
| + "session/:sessionId/local_storage/key/:key",
|
| + WrapToCommand(base::Bind(&ExecuteGetStorageItem, kLocalStorage))),
|
| + CommandMapping(
|
| + kDelete,
|
| + "session/:sessionId/local_storage/key/:key",
|
| + WrapToCommand(base::Bind(&ExecuteRemoveStorageItem, kLocalStorage))),
|
| + CommandMapping(
|
| + kGet,
|
| + "session/:sessionId/local_storage",
|
| + WrapToCommand(base::Bind(&ExecuteGetStorageKeys, kLocalStorage))),
|
| + CommandMapping(
|
| + kPost,
|
| + "session/:sessionId/local_storage",
|
| + WrapToCommand(base::Bind(&ExecuteSetStorageItem, kLocalStorage))),
|
| + CommandMapping(
|
| + kDelete,
|
| + "session/:sessionId/local_storage",
|
| + WrapToCommand(base::Bind(&ExecuteClearStorage, kLocalStorage))),
|
| + CommandMapping(
|
| + kGet,
|
| + "session/:sessionId/local_storage/size",
|
| + WrapToCommand(base::Bind(&ExecuteGetStorageSize, kLocalStorage))),
|
| + CommandMapping(
|
| + kGet,
|
| + "session/:sessionId/session_storage/key/:key",
|
| + WrapToCommand(base::Bind(&ExecuteGetStorageItem, kSessionStorage))),
|
| + CommandMapping(kDelete,
|
| + "session/:sessionId/session_storage/key/:key",
|
| + WrapToCommand(base::Bind(&ExecuteRemoveStorageItem,
|
| + kSessionStorage))),
|
| + CommandMapping(
|
| + kGet,
|
| + "session/:sessionId/session_storage",
|
| + WrapToCommand(base::Bind(&ExecuteGetStorageKeys, kSessionStorage))),
|
| + CommandMapping(
|
| + kPost,
|
| + "session/:sessionId/session_storage",
|
| + WrapToCommand(base::Bind(&ExecuteSetStorageItem, kSessionStorage))),
|
| + CommandMapping(
|
| + kDelete,
|
| + "session/:sessionId/session_storage",
|
| + WrapToCommand(base::Bind(&ExecuteClearStorage, kSessionStorage))),
|
| + CommandMapping(
|
| + kGet,
|
| + "session/:sessionId/session_storage/size",
|
| + WrapToCommand(base::Bind(&ExecuteGetStorageSize, kSessionStorage))),
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/orientation",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/orientation",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/orientation",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/click",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/click",
|
| WrapToCommand(base::Bind(&ExecuteMouseClick))),
|
| - CommandMapping(kPost, "session/:sessionId/doubleclick",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/doubleclick",
|
| WrapToCommand(base::Bind(&ExecuteMouseDoubleClick))),
|
| - CommandMapping(kPost, "session/:sessionId/buttondown",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/buttondown",
|
| WrapToCommand(base::Bind(&ExecuteMouseButtonDown))),
|
| - CommandMapping(kPost, "session/:sessionId/buttonup",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/buttonup",
|
| WrapToCommand(base::Bind(&ExecuteMouseButtonUp))),
|
| - CommandMapping(kPost, "session/:sessionId/moveto",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/moveto",
|
| WrapToCommand(base::Bind(&ExecuteMouseMoveTo))),
|
| - CommandMapping(kPost, "session/:sessionId/keys",
|
| - WrapToCommand(
|
| - base::Bind(&ExecuteSendKeysToActiveElement))),
|
| - CommandMapping(kGet, "session/:sessionId/ime/available_engines",
|
| + CommandMapping(
|
| + kPost,
|
| + "session/:sessionId/keys",
|
| + WrapToCommand(base::Bind(&ExecuteSendKeysToActiveElement))),
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/ime/available_engines",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kGet, "session/:sessionId/ime/active_engine",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/ime/active_engine",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kGet, "session/:sessionId/ime/activated",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/ime/activated",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/ime/deactivate",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/ime/deactivate",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/ime/activate",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/ime/activate",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/touch/click",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/touch/click",
|
| WrapToCommand(base::Bind(&ExecuteTouchSingleTap))),
|
| - CommandMapping(kPost, "session/:sessionId/touch/down",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/touch/down",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/touch/up",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/touch/up",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/touch/move",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/touch/move",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/touch/scroll",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/touch/scroll",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/touch/doubleclick",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/touch/doubleclick",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/touch/longclick",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/touch/longclick",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/touch/flick",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/touch/flick",
|
| base::Bind(&UnimplementedCommand)),
|
| - CommandMapping(kPost, "session/:sessionId/log",
|
| + CommandMapping(kPost,
|
| + "session/:sessionId/log",
|
| WrapToCommand(base::Bind(&ExecuteGetLog))),
|
| - CommandMapping(kGet, "session/:sessionId/log/types",
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/log/types",
|
| 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,
|
| + CommandMapping(kGet,
|
| + kShutdownPath,
|
| base::Bind(&ExecuteQuitAll,
|
| - base::Bind(&ExecuteQuit, true, &session_map_),
|
| - &session_map_)),
|
| - CommandMapping(kPost, kShutdownPath,
|
| + WrapToCommand(base::Bind(&ExecuteQuit, true)),
|
| + &session_thread_map_)),
|
| + CommandMapping(kPost,
|
| + kShutdownPath,
|
| base::Bind(&ExecuteQuitAll,
|
| - base::Bind(&ExecuteQuit, true, &session_map_),
|
| - &session_map_)),
|
| - CommandMapping(kGet, "session/:sessionId/is_loading",
|
| - WrapToCommand(base::Bind(&ExecuteIsLoading))),
|
| - };
|
| - this->command_map_.reset(
|
| + WrapToCommand(base::Bind(&ExecuteQuit, true)),
|
| + &session_thread_map_)),
|
| + CommandMapping(kGet,
|
| + "session/:sessionId/is_loading",
|
| + WrapToCommand(base::Bind(&ExecuteIsLoading))), };
|
| + command_map_.reset(
|
| new CommandMap(commands, commands + arraysize(commands)));
|
| }
|
|
|
| HttpHandler::~HttpHandler() {}
|
|
|
| void HttpHandler::Handle(const net::HttpServerRequestInfo& request,
|
| - HttpResponse* response) {
|
| - log_->AddEntry(
|
| - Log::kLog,
|
| - base::StringPrintf("received WebDriver request: %s %s %s",
|
| - request.method.c_str(),
|
| - request.path.c_str(),
|
| - request.data.c_str()));
|
| -
|
| - HandleInternal(request, response);
|
| -
|
| - log_->AddEntry(
|
| - Log::kLog,
|
| - base::StringPrintf("sending WebDriver response: %d %s",
|
| - response->status(),
|
| - response->body().c_str()));
|
| + const HttpResponseSenderFunc& send_response_func) {
|
| + CHECK(thread_checker_.CalledOnValidThread());
|
| +
|
| + if (received_shutdown_)
|
| + return;
|
| + if (ShouldShutdown(request))
|
| + received_shutdown_ = true;
|
| +
|
| + std::string path = request.path;
|
| + if (!StartsWithASCII(path, url_base_, true)) {
|
| + scoped_ptr<HttpResponse> response(
|
| + new HttpResponse(HttpResponse::kBadRequest));
|
| + response->set_body("unhandled request");
|
| + send_response_func.Run(response.Pass());
|
| + return;
|
| + }
|
| +
|
| + path.erase(0, url_base_.length());
|
| +
|
| + HandleCommand(request, path, send_response_func);
|
| }
|
|
|
| bool HttpHandler::ShouldShutdown(const net::HttpServerRequestInfo& request) {
|
| @@ -359,7 +471,8 @@ bool HttpHandler::ShouldShutdown(const net::HttpServerRequestInfo& request) {
|
|
|
| Command HttpHandler::WrapToCommand(
|
| const SessionCommand& session_command) {
|
| - return base::Bind(&ExecuteSessionCommand, &session_map_, session_command);
|
| + return base::Bind(
|
| + &ExecuteSessionCommand, &session_thread_map_, session_command, false);
|
| }
|
|
|
| Command HttpHandler::WrapToCommand(
|
| @@ -374,34 +487,26 @@ Command HttpHandler::WrapToCommand(
|
| base::Bind(&ExecuteElementCommand, element_command));
|
| }
|
|
|
| -void HttpHandler::HandleInternal(const net::HttpServerRequestInfo& request,
|
| - HttpResponse* response) {
|
| - std::string path = request.path;
|
| - if (!StartsWithASCII(path, url_base_, true)) {
|
| - *response = HttpResponse(HttpResponse::kBadRequest);
|
| - response->set_body("unhandled request");
|
| - return;
|
| - }
|
| -
|
| - path.erase(0, url_base_.length());
|
| -
|
| - if (!HandleWebDriverCommand(request, path, response)) {
|
| - *response = HttpResponse(HttpResponse::kNotFound);
|
| - response->set_body("unknown command: " + path);
|
| - return;
|
| - }
|
| -}
|
| -
|
| -bool HttpHandler::HandleWebDriverCommand(
|
| +void HttpHandler::HandleCommand(
|
| const net::HttpServerRequestInfo& request,
|
| const std::string& trimmed_path,
|
| - HttpResponse* response) {
|
| + const HttpResponseSenderFunc& send_response_func) {
|
| + log_->AddEntry(Log::kLog,
|
| + base::StringPrintf("handling command: %s %s %s",
|
| + request.method.c_str(),
|
| + trimmed_path.c_str(),
|
| + request.data.c_str()));
|
| +
|
| base::DictionaryValue params;
|
| std::string session_id;
|
| CommandMap::const_iterator iter = command_map_->begin();
|
| while (true) {
|
| if (iter == command_map_->end()) {
|
| - return false;
|
| + scoped_ptr<HttpResponse> response(
|
| + new HttpResponse(HttpResponse::kNotFound));
|
| + response->set_body("unknown command: " + trimmed_path);
|
| + send_response_func.Run(response.Pass());
|
| + return;
|
| }
|
| if (internal::MatchesCommand(
|
| request.method, trimmed_path, *iter, &session_id, ¶ms)) {
|
| @@ -414,40 +519,69 @@ bool HttpHandler::HandleWebDriverCommand(
|
| base::DictionaryValue* body_params;
|
| scoped_ptr<base::Value> parsed_body(base::JSONReader::Read(request.data));
|
| if (!parsed_body || !parsed_body->GetAsDictionary(&body_params)) {
|
| - *response = HttpResponse(HttpResponse::kBadRequest);
|
| + scoped_ptr<HttpResponse> response(
|
| + new HttpResponse(HttpResponse::kBadRequest));
|
| response->set_body("missing command parameters");
|
| - return true;
|
| + send_response_func.Run(response.Pass());
|
| + return;
|
| }
|
| params.MergeDictionary(body_params);
|
| }
|
|
|
| - scoped_ptr<base::Value> value;
|
| - std::string out_session_id;
|
| - Status status = iter->command.Run(
|
| - params, session_id, &value, &out_session_id);
|
| + iter->command.Run(params,
|
| + session_id,
|
| + base::Bind(&HttpHandler::PrepareResponse,
|
| + weak_ptr_factory_.GetWeakPtr(),
|
| + trimmed_path,
|
| + send_response_func));
|
| +}
|
| +
|
| +void HttpHandler::PrepareResponse(
|
| + const std::string& trimmed_path,
|
| + const HttpResponseSenderFunc& send_response_func,
|
| + const Status& status,
|
| + scoped_ptr<base::Value> value,
|
| + const std::string& session_id) {
|
| + CHECK(thread_checker_.CalledOnValidThread());
|
| + scoped_ptr<HttpResponse> response =
|
| + PrepareResponseHelper(trimmed_path, status, value.Pass(), session_id);
|
| + log_->AddEntry(Log::kLog,
|
| + base::StringPrintf("sending response: %d %s",
|
| + response->status(),
|
| + response->body().c_str()));
|
| + send_response_func.Run(response.Pass());
|
| +}
|
|
|
| +scoped_ptr<HttpResponse> HttpHandler::PrepareResponseHelper(
|
| + const std::string& trimmed_path,
|
| + const Status& status,
|
| + scoped_ptr<base::Value> value,
|
| + const std::string& session_id) {
|
| if (status.code() == kUnknownCommand) {
|
| - *response = HttpResponse(HttpResponse::kNotImplemented);
|
| + scoped_ptr<HttpResponse> response(
|
| + new HttpResponse(HttpResponse::kNotImplemented));
|
| response->set_body("unimplemented command: " + trimmed_path);
|
| - return true;
|
| + return response.Pass();
|
| }
|
|
|
| - if (iter->path_pattern == internal::kNewSessionPathPattern && status.IsOk()) {
|
| + if (trimmed_path == 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;
|
| + scoped_ptr<HttpResponse> response(
|
| + new HttpResponse(HttpResponse::kSeeOther));
|
| + response->AddHeader("Location", url_base_ + "session/" + session_id);
|
| + return response.Pass();
|
| } else if (status.IsError()) {
|
| - status.AddDetails(base::StringPrintf(
|
| + Status full_status(status);
|
| + full_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());
|
| + error->SetString("message", full_status.message());
|
| value.reset(error.release());
|
| }
|
| if (!value)
|
| @@ -456,15 +590,15 @@ bool HttpHandler::HandleWebDriverCommand(
|
| base::DictionaryValue body_params;
|
| body_params.SetInteger("status", status.code());
|
| body_params.Set("value", value.release());
|
| - body_params.SetString("sessionId", out_session_id);
|
| + body_params.SetString("sessionId", session_id);
|
| std::string body;
|
| base::JSONWriter::WriteWithOptions(
|
| &body_params, base::JSONWriter::OPTIONS_OMIT_DOUBLE_TYPE_PRESERVATION,
|
| &body);
|
| - *response = HttpResponse(HttpResponse::kOk);
|
| + scoped_ptr<HttpResponse> response(new HttpResponse(HttpResponse::kOk));
|
| response->SetMimeType("application/json; charset=utf-8");
|
| response->set_body(body);
|
| - return true;
|
| + return response.Pass();
|
| }
|
|
|
| namespace internal {
|
|
|