Serenity Operating System
at master 125 lines 6.6 kB view raw
1/* 2 * Copyright (c) 2022, Florent Castelli <florent.castelli@gmail.com> 3 * Copyright (c) 2022, Linus Groh <linusg@serenityos.org> 4 * Copyright (c) 2022-2023, Tim Flynn <trflynn89@serenityos.org> 5 * 6 * SPDX-License-Identifier: BSD-2-Clause 7 */ 8 9#pragma once 10 11#include <AK/Error.h> 12#include <AK/NonnullOwnPtr.h> 13#include <AK/String.h> 14#include <AK/Variant.h> 15#include <AK/Vector.h> 16#include <LibCore/Object.h> 17#include <LibCore/Socket.h> 18#include <LibHTTP/Forward.h> 19#include <LibHTTP/HttpRequest.h> 20#include <LibWeb/WebDriver/Error.h> 21#include <LibWeb/WebDriver/Response.h> 22 23namespace Web::WebDriver { 24 25using Parameters = Vector<String>; 26 27class Client : public Core::Object { 28 C_OBJECT_ABSTRACT(Client); 29 30public: 31 virtual ~Client(); 32 33 // 8. Sessions, https://w3c.github.io/webdriver/#sessions 34 virtual Response new_session(Parameters parameters, JsonValue payload) = 0; 35 virtual Response delete_session(Parameters parameters, JsonValue payload) = 0; 36 virtual Response get_status(Parameters parameters, JsonValue payload) = 0; 37 38 // 9. Timeouts, https://w3c.github.io/webdriver/#timeouts 39 virtual Response get_timeouts(Parameters parameters, JsonValue payload) = 0; 40 virtual Response set_timeouts(Parameters parameters, JsonValue payload) = 0; 41 42 // 10. Navigation, https://w3c.github.io/webdriver/#navigation 43 virtual Response navigate_to(Parameters parameters, JsonValue payload) = 0; 44 virtual Response get_current_url(Parameters parameters, JsonValue payload) = 0; 45 virtual Response back(Parameters parameters, JsonValue payload) = 0; 46 virtual Response forward(Parameters parameters, JsonValue payload) = 0; 47 virtual Response refresh(Parameters parameters, JsonValue payload) = 0; 48 virtual Response get_title(Parameters parameters, JsonValue payload) = 0; 49 50 // 11. Contexts, https://w3c.github.io/webdriver/#contexts 51 virtual Response get_window_handle(Parameters parameters, JsonValue payload) = 0; 52 virtual Response close_window(Parameters parameters, JsonValue payload) = 0; 53 virtual Response switch_to_window(Parameters parameters, JsonValue payload) = 0; 54 virtual Response get_window_handles(Parameters parameters, JsonValue payload) = 0; 55 virtual Response get_window_rect(Parameters parameters, JsonValue payload) = 0; 56 virtual Response set_window_rect(Parameters parameters, JsonValue payload) = 0; 57 virtual Response maximize_window(Parameters parameters, JsonValue payload) = 0; 58 virtual Response minimize_window(Parameters parameters, JsonValue payload) = 0; 59 virtual Response fullscreen_window(Parameters parameters, JsonValue payload) = 0; 60 61 // 12. Elements, https://w3c.github.io/webdriver/#elements 62 virtual Response find_element(Parameters parameters, JsonValue payload) = 0; 63 virtual Response find_elements(Parameters parameters, JsonValue payload) = 0; 64 virtual Response find_element_from_element(Parameters parameters, JsonValue payload) = 0; 65 virtual Response find_elements_from_element(Parameters parameters, JsonValue payload) = 0; 66 virtual Response find_element_from_shadow_root(Parameters parameters, JsonValue payload) = 0; 67 virtual Response find_elements_from_shadow_root(Parameters parameters, JsonValue payload) = 0; 68 virtual Response get_active_element(Parameters parameters, JsonValue payload) = 0; 69 virtual Response get_element_shadow_root(Parameters parameters, JsonValue payload) = 0; 70 virtual Response is_element_selected(Parameters parameters, JsonValue payload) = 0; 71 virtual Response get_element_attribute(Parameters parameters, JsonValue payload) = 0; 72 virtual Response get_element_property(Parameters parameters, JsonValue payload) = 0; 73 virtual Response get_element_css_value(Parameters parameters, JsonValue payload) = 0; 74 virtual Response get_element_text(Parameters parameters, JsonValue payload) = 0; 75 virtual Response get_element_tag_name(Parameters parameters, JsonValue payload) = 0; 76 virtual Response get_element_rect(Parameters parameters, JsonValue payload) = 0; 77 virtual Response is_element_enabled(Parameters parameters, JsonValue payload) = 0; 78 virtual Response get_computed_role(Parameters parameters, JsonValue payload) = 0; 79 virtual Response get_computed_label(Parameters parameters, JsonValue payload) = 0; 80 virtual Response element_click(Parameters parameters, JsonValue payload) = 0; 81 82 // 13. Document, https://w3c.github.io/webdriver/#document 83 virtual Response get_source(Parameters parameters, JsonValue payload) = 0; 84 virtual Response execute_script(Parameters parameters, JsonValue payload) = 0; 85 virtual Response execute_async_script(Parameters parameters, JsonValue payload) = 0; 86 87 // 14. Cookies, https://w3c.github.io/webdriver/#cookies 88 virtual Response get_all_cookies(Parameters parameters, JsonValue payload) = 0; 89 virtual Response get_named_cookie(Parameters parameters, JsonValue payload) = 0; 90 virtual Response add_cookie(Parameters parameters, JsonValue payload) = 0; 91 virtual Response delete_cookie(Parameters parameters, JsonValue payload) = 0; 92 virtual Response delete_all_cookies(Parameters parameters, JsonValue payload) = 0; 93 94 // 16. User prompts, https://w3c.github.io/webdriver/#user-prompts 95 virtual Response dismiss_alert(Parameters parameters, JsonValue payload) = 0; 96 virtual Response accept_alert(Parameters parameters, JsonValue payload) = 0; 97 virtual Response get_alert_text(Parameters parameters, JsonValue payload) = 0; 98 virtual Response send_alert_text(Parameters parameters, JsonValue payload) = 0; 99 100 // 17. Screen capture, https://w3c.github.io/webdriver/#screen-capture 101 virtual Response take_screenshot(Parameters parameters, JsonValue payload) = 0; 102 virtual Response take_element_screenshot(Parameters parameters, JsonValue payload) = 0; 103 104 // 18. Print, https://w3c.github.io/webdriver/#print 105 virtual Response print_page(Parameters parameters, JsonValue payload) = 0; 106 107protected: 108 Client(NonnullOwnPtr<Core::BufferedTCPSocket>, Core::Object* parent); 109 110private: 111 using WrappedError = Variant<AK::Error, WebDriver::Error>; 112 113 void die(); 114 ErrorOr<void, WrappedError> on_ready_to_read(); 115 ErrorOr<JsonValue, WrappedError> read_body_as_json(); 116 ErrorOr<void, WrappedError> handle_request(JsonValue body); 117 ErrorOr<void, WrappedError> send_success_response(JsonValue result); 118 ErrorOr<void, WrappedError> send_error_response(Error const& error); 119 void log_response(unsigned code); 120 121 NonnullOwnPtr<Core::BufferedTCPSocket> m_socket; 122 Optional<HTTP::HttpRequest> m_request; 123}; 124 125}