WebDriverConnection.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  1. /*
  2. * Copyright (c) 2022, Florent Castelli <florent.castelli@gmail.com>
  3. * Copyright (c) 2022, Sam Atkins <atkinssj@serenityos.org>
  4. * Copyright (c) 2022, Tobias Christiansen <tobyase@serenityos.org>
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #include "WebDriverConnection.h"
  9. #include "BrowserWindow.h"
  10. #include <AK/Vector.h>
  11. #include <LibWeb/Cookie/Cookie.h>
  12. #include <LibWeb/Cookie/ParsedCookie.h>
  13. #include <LibWebView/WebContentClient.h>
  14. namespace Browser {
  15. WebDriverConnection::WebDriverConnection(NonnullOwnPtr<Core::Stream::LocalSocket> socket, NonnullRefPtr<BrowserWindow> browser_window)
  16. : IPC::ConnectionToServer<WebDriverSessionClientEndpoint, WebDriverSessionServerEndpoint>(*this, move(socket))
  17. , m_browser_window(move(browser_window))
  18. {
  19. }
  20. void WebDriverConnection::quit()
  21. {
  22. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: quit");
  23. if (auto browser_window = m_browser_window.strong_ref())
  24. browser_window->close();
  25. }
  26. Messages::WebDriverSessionClient::GetUrlResponse WebDriverConnection::get_url()
  27. {
  28. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: get_url");
  29. if (auto browser_window = m_browser_window.strong_ref())
  30. return { browser_window->active_tab().url() };
  31. return { URL("") };
  32. }
  33. void WebDriverConnection::set_url(AK::URL const& url)
  34. {
  35. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: set_url {}", url);
  36. if (auto browser_window = m_browser_window.strong_ref())
  37. browser_window->active_tab().load(url);
  38. }
  39. Messages::WebDriverSessionClient::GetTitleResponse WebDriverConnection::get_title()
  40. {
  41. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: get_title");
  42. if (auto browser_window = m_browser_window.strong_ref())
  43. return { browser_window->active_tab().title() };
  44. return { "" };
  45. }
  46. void WebDriverConnection::refresh()
  47. {
  48. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: refresh");
  49. if (auto browser_window = m_browser_window.strong_ref())
  50. browser_window->active_tab().reload();
  51. }
  52. void WebDriverConnection::back()
  53. {
  54. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: back");
  55. if (auto browser_window = m_browser_window.strong_ref())
  56. browser_window->active_tab().go_back();
  57. }
  58. void WebDriverConnection::forward()
  59. {
  60. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: forward");
  61. if (auto browser_window = m_browser_window.strong_ref())
  62. browser_window->active_tab().go_forward();
  63. }
  64. Messages::WebDriverSessionClient::GetWindowRectResponse WebDriverConnection::get_window_rect()
  65. {
  66. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: get_window_rect");
  67. if (auto browser_window = m_browser_window.strong_ref())
  68. return { browser_window->rect() };
  69. return { {} };
  70. }
  71. void WebDriverConnection::restore_window()
  72. {
  73. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: restore_window");
  74. if (auto browser_window = m_browser_window.strong_ref()) {
  75. browser_window->show();
  76. browser_window->move_to_front();
  77. }
  78. }
  79. void WebDriverConnection::set_window_size(Gfx::IntSize const& size)
  80. {
  81. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: set_window_size {}", size);
  82. if (auto browser_window = m_browser_window.strong_ref())
  83. browser_window->resize(size);
  84. }
  85. void WebDriverConnection::set_window_position(Gfx::IntPoint const& position)
  86. {
  87. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: set_window_position {}", position);
  88. if (auto browser_window = m_browser_window.strong_ref())
  89. browser_window->move_to(position);
  90. }
  91. void WebDriverConnection::maximize_window()
  92. {
  93. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: maximize_window");
  94. if (auto browser_window = m_browser_window.strong_ref())
  95. browser_window->set_maximized(true);
  96. }
  97. void WebDriverConnection::minimize_window()
  98. {
  99. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: minimize_window");
  100. if (auto browser_window = m_browser_window.strong_ref())
  101. browser_window->set_minimized(true);
  102. }
  103. Messages::WebDriverSessionClient::ExecuteScriptResponse WebDriverConnection::execute_script(String const& body, Vector<String> const& json_arguments, Optional<u64> const& timeout, bool async)
  104. {
  105. dbgln("WebDriverConnection: execute_script");
  106. if (auto browser_window = m_browser_window.strong_ref()) {
  107. auto& tab = browser_window->active_tab();
  108. if (tab.webdriver_endpoints().on_execute_script) {
  109. auto response = tab.webdriver_endpoints().on_execute_script(body, json_arguments, timeout, async);
  110. // WebContentServer's and WebDriverSessionClient's ExecuteScriptResponse have an identical
  111. // structure but are distinct types, so we have to convert here.
  112. return { response.result_type(), response.json_result() };
  113. }
  114. }
  115. return { {} };
  116. }
  117. Messages::WebDriverSessionClient::GetAllCookiesResponse WebDriverConnection::get_all_cookies()
  118. {
  119. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: get_cookies");
  120. if (auto browser_window = m_browser_window.strong_ref()) {
  121. if (browser_window->active_tab().on_get_cookies_entries) {
  122. return { browser_window->active_tab().on_get_cookies_entries() };
  123. }
  124. }
  125. return { {} };
  126. }
  127. Messages::WebDriverSessionClient::GetNamedCookieResponse WebDriverConnection::get_named_cookie(String const& name)
  128. {
  129. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: get_named_cookie {}", name);
  130. if (auto browser_window = m_browser_window.strong_ref()) {
  131. if (browser_window->active_tab().on_get_cookies_entries) {
  132. for (auto cookie : browser_window->active_tab().on_get_cookies_entries()) {
  133. if (cookie.name == name)
  134. return { cookie };
  135. }
  136. return Optional<Web::Cookie::Cookie> {};
  137. }
  138. }
  139. return { {} };
  140. }
  141. void WebDriverConnection::add_cookie(Web::Cookie::ParsedCookie const& cookie)
  142. {
  143. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: add_cookie {}", cookie.name);
  144. if (auto browser_window = m_browser_window.strong_ref()) {
  145. auto& tab = browser_window->active_tab();
  146. if (tab.on_set_cookie) {
  147. // FIXME: The spec doesn't say anything about the source
  148. // but can we assume a cookie created through a HTTP-request to the WebDriver
  149. // to be (source) from an HTTP-API?
  150. tab.on_set_cookie(tab.url(), cookie, Web::Cookie::Source::Http);
  151. }
  152. }
  153. }
  154. void WebDriverConnection::update_cookie(Web::Cookie::Cookie const& cookie)
  155. {
  156. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: update_cookie {}", cookie.name);
  157. if (auto browser_window = m_browser_window.strong_ref()) {
  158. auto& tab = browser_window->active_tab();
  159. if (tab.on_update_cookie) {
  160. tab.on_update_cookie(tab.url(), cookie);
  161. }
  162. }
  163. }
  164. Messages::WebDriverSessionClient::GetDocumentElementResponse WebDriverConnection::get_document_element()
  165. {
  166. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: get_document_element");
  167. if (auto browser_window = m_browser_window.strong_ref()) {
  168. auto& tab = browser_window->active_tab();
  169. if (tab.webdriver_endpoints().on_get_document_element)
  170. return { tab.webdriver_endpoints().on_get_document_element() };
  171. }
  172. return { {} };
  173. }
  174. Messages::WebDriverSessionClient::QuerySelectorAllResponse WebDriverConnection::query_selector_all(i32 start_node_id, String const& selector)
  175. {
  176. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: query_selector_all");
  177. if (auto browser_window = m_browser_window.strong_ref()) {
  178. auto& tab = browser_window->active_tab();
  179. if (tab.webdriver_endpoints().on_query_selector_all)
  180. return { tab.webdriver_endpoints().on_query_selector_all(start_node_id, selector) };
  181. }
  182. return { {} };
  183. }
  184. Messages::WebDriverSessionClient::GetElementAttributeResponse WebDriverConnection::get_element_attribute(i32 element_id, String const& name)
  185. {
  186. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: get_element_attribute");
  187. if (auto browser_window = m_browser_window.strong_ref()) {
  188. auto& tab = browser_window->active_tab();
  189. if (tab.webdriver_endpoints().on_get_element_attribute)
  190. return { tab.webdriver_endpoints().on_get_element_attribute(element_id, name) };
  191. }
  192. return { {} };
  193. }
  194. Messages::WebDriverSessionClient::GetElementPropertyResponse WebDriverConnection::get_element_property(i32 element_id, String const& name)
  195. {
  196. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: get_element_property");
  197. if (auto browser_window = m_browser_window.strong_ref()) {
  198. auto& tab = browser_window->active_tab();
  199. if (tab.webdriver_endpoints().on_get_element_property)
  200. return { tab.webdriver_endpoints().on_get_element_property(element_id, name) };
  201. }
  202. return { {} };
  203. }
  204. Messages::WebDriverSessionClient::GetActiveDocumentsTypeResponse WebDriverConnection::get_active_documents_type()
  205. {
  206. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: get_active_documents_type");
  207. if (auto browser_window = m_browser_window.strong_ref()) {
  208. auto& tab = browser_window->active_tab();
  209. if (tab.webdriver_endpoints().on_get_active_documents_type)
  210. return { tab.webdriver_endpoints().on_get_active_documents_type() };
  211. }
  212. return { "" };
  213. }
  214. Messages::WebDriverSessionClient::GetComputedValueForElementResponse WebDriverConnection::get_computed_value_for_element(i32 element_id, String const& property_name)
  215. {
  216. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: get_computed_value_for_element");
  217. if (auto browser_window = m_browser_window.strong_ref()) {
  218. auto& tab = browser_window->active_tab();
  219. if (tab.webdriver_endpoints().on_get_computed_value_for_element)
  220. return { tab.webdriver_endpoints().on_get_computed_value_for_element(element_id, property_name) };
  221. }
  222. return { "" };
  223. }
  224. Messages::WebDriverSessionClient::GetElementTextResponse WebDriverConnection::get_element_text(i32 element_id)
  225. {
  226. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: get_element_text");
  227. if (auto browser_window = m_browser_window.strong_ref()) {
  228. auto& tab = browser_window->active_tab();
  229. if (tab.webdriver_endpoints().on_get_element_text)
  230. return { tab.webdriver_endpoints().on_get_element_text(element_id) };
  231. }
  232. return { "" };
  233. }
  234. Messages::WebDriverSessionClient::GetElementTagNameResponse WebDriverConnection::get_element_tag_name(i32 element_id)
  235. {
  236. dbgln("WebDriverConnection: get_computed_value_for_element");
  237. if (auto browser_window = m_browser_window.strong_ref()) {
  238. auto& tab = browser_window->active_tab();
  239. if (tab.webdriver_endpoints().on_get_element_tag_name)
  240. return { tab.webdriver_endpoints().on_get_element_tag_name(element_id) };
  241. }
  242. return { "" };
  243. }
  244. Messages::WebDriverSessionClient::TakeScreenshotResponse WebDriverConnection::take_screenshot()
  245. {
  246. dbgln_if(WEBDRIVER_DEBUG, "WebDriverConnection: take_screenshot");
  247. if (auto browser_window = m_browser_window.strong_ref()) {
  248. auto& tab = browser_window->active_tab();
  249. if (tab.on_take_screenshot)
  250. return { tab.on_take_screenshot() };
  251. }
  252. return { {} };
  253. }
  254. }