WebContent+WebDriver: Log all unimplemented WebDriver endpoints

It's difficult to know what we need to implement if we silently ignore
these endpoints. Let's log the endpoints and their parameters, and clean
up the wall of FIXME comments to be easier to grok.
This commit is contained in:
Timothy Flynn 2024-09-25 11:26:46 -04:00 committed by Tim Flynn
commit b035f0cd3d
Notes: github-actions[bot] 2024-09-25 18:04:47 +00:00
4 changed files with 152 additions and 269 deletions

View file

@ -47,7 +47,7 @@ endpoint WebDriverClient {
get_computed_label(String element_id) => (Web::WebDriver::Response response) get_computed_label(String element_id) => (Web::WebDriver::Response response)
element_click(String element_id) => (Web::WebDriver::Response response) element_click(String element_id) => (Web::WebDriver::Response response)
element_clear(String element_id) => (Web::WebDriver::Response response) element_clear(String element_id) => (Web::WebDriver::Response response)
element_send_keys(String element_id) => (Web::WebDriver::Response response) element_send_keys(String element_id, JsonValue payload) => (Web::WebDriver::Response response)
get_source() => (Web::WebDriver::Response response) get_source() => (Web::WebDriver::Response response)
execute_script(JsonValue payload) => (Web::WebDriver::Response response) execute_script(JsonValue payload) => (Web::WebDriver::Response response)
execute_async_script(JsonValue payload) => (Web::WebDriver::Response response) execute_async_script(JsonValue payload) => (Web::WebDriver::Response response)
@ -56,7 +56,7 @@ endpoint WebDriverClient {
add_cookie(JsonValue payload) => (Web::WebDriver::Response response) add_cookie(JsonValue payload) => (Web::WebDriver::Response response)
delete_cookie(String name) => (Web::WebDriver::Response response) delete_cookie(String name) => (Web::WebDriver::Response response)
delete_all_cookies() => (Web::WebDriver::Response response) delete_all_cookies() => (Web::WebDriver::Response response)
perform_actions() => (Web::WebDriver::Response response) perform_actions(JsonValue payload) => (Web::WebDriver::Response response)
release_actions() => (Web::WebDriver::Response response) release_actions() => (Web::WebDriver::Response response)
dismiss_alert() => (Web::WebDriver::Response response) dismiss_alert() => (Web::WebDriver::Response response)
accept_alert() => (Web::WebDriver::Response response) accept_alert() => (Web::WebDriver::Response response)
@ -64,6 +64,6 @@ endpoint WebDriverClient {
send_alert_text(JsonValue payload) => (Web::WebDriver::Response response) send_alert_text(JsonValue payload) => (Web::WebDriver::Response response)
take_screenshot() => (Web::WebDriver::Response response) take_screenshot() => (Web::WebDriver::Response response)
take_element_screenshot(String element_id) => (Web::WebDriver::Response response) take_element_screenshot(String element_id) => (Web::WebDriver::Response response)
print_page() => (Web::WebDriver::Response response) print_page(JsonValue payload) => (Web::WebDriver::Response response)
ensure_top_level_browsing_context_is_open() => (Web::WebDriver::Response response) ensure_top_level_browsing_context_is_open() => (Web::WebDriver::Response response)
} }

View file

@ -1349,7 +1349,6 @@ Messages::WebDriverClient::ElementClickResponse WebDriverConnection::element_cli
return Web::WebDriver::Error::from_code(Web::WebDriver::ErrorCode::UnknownError, scroll_or_error.error().string_literal()); return Web::WebDriver::Error::from_code(Web::WebDriver::ErrorCode::UnknownError, scroll_or_error.error().string_literal());
// FIXME: 6. If elements container is still not in view, return error with error code element not interactable. // FIXME: 6. If elements container is still not in view, return error with error code element not interactable.
// FIXME: 7. If elements container is obscured by another element, return error with error code element click intercepted. // FIXME: 7. If elements container is obscured by another element, return error with error code element click intercepted.
// 8. Matching on element: // 8. Matching on element:
@ -1403,38 +1402,24 @@ Messages::WebDriverClient::ElementClickResponse WebDriverConnection::element_cli
} }
// -> Otherwise // -> Otherwise
else { else {
dbgln("FIXME: WebDriverConnection::element_click({})", element->class_name());
// FIXME: 1. Let input state be the result of get the input state given current session and current top-level browsing context. // FIXME: 1. Let input state be the result of get the input state given current session and current top-level browsing context.
// FIXME: 2. Let actions options be a new actions options with the is element origin steps set to represents a web element, and the get element origin steps set to get a WebElement origin. // FIXME: 2. Let actions options be a new actions options with the is element origin steps set to represents a web element, and the get element origin steps set to get a WebElement origin.
// FIXME: 3. Let input id be a the result of generating a UUID. // FIXME: 3. Let input id be a the result of generating a UUID.
// FIXME: 4. Let source be the result of create an input source with input state, and "pointer". // FIXME: 4. Let source be the result of create an input source with input state, and "pointer".
// FIXME: 5. Add an input source with input state, input id and source. // FIXME: 5. Add an input source with input state, input id and source.
// FIXME: 6. Let click point be the elements in-view center point. // FIXME: 6. Let click point be the elements in-view center point.
// FIXME: 7. Let pointer move action be an action object constructed with arguments input id, "pointer", and "pointerMove". // FIXME: 7. Let pointer move action be an action object constructed with arguments input id, "pointer", and "pointerMove".
// FIXME: 8. Set a property x to 0 on pointer move action. // FIXME: 8. Set a property x to 0 on pointer move action.
// FIXME: 9. Set a property y to 0 on pointer move action. // FIXME: 9. Set a property y to 0 on pointer move action.
// FIXME: 10. Set a property origin to element on pointer move action. // FIXME: 10. Set a property origin to element on pointer move action.
// FIXME: 11. Let pointer down action be an action object constructed with arguments input id, "pointer", and "pointerDown". // FIXME: 11. Let pointer down action be an action object constructed with arguments input id, "pointer", and "pointerDown".
// FIXME: 12. Set a property button to 0 on pointer down action. // FIXME: 12. Set a property button to 0 on pointer down action.
// FIXME: 13. Let pointer up action be an action object constructed with arguments input id, "mouse", and "pointerUp" as arguments. // FIXME: 13. Let pointer up action be an action object constructed with arguments input id, "mouse", and "pointerUp" as arguments.
// FIXME: 14. Set a property button to 0 on pointer up action. // FIXME: 14. Set a property button to 0 on pointer up action.
// FIXME: 15. Let actions be the list «pointer move action, pointer down action, pointer move action». // FIXME: 15. Let actions be the list «pointer move action, pointer down action, pointer move action».
// FIXME: 16. Dispatch a list of actions with input state, actions, current browsing context, and actions options. // FIXME: 16. Dispatch a list of actions with input state, actions, current browsing context, and actions options.
// FIXME: 17. Remove an input source with input state and input id. // FIXME: 17. Remove an input source with input state and input id.
} }
@ -1448,305 +1433,208 @@ Messages::WebDriverClient::ElementClickResponse WebDriverConnection::element_cli
} }
// 12.5.2 Element Clear, https://w3c.github.io/webdriver/#dfn-element-clear // 12.5.2 Element Clear, https://w3c.github.io/webdriver/#dfn-element-clear
Messages::WebDriverClient::ElementClearResponse WebDriverConnection::element_clear(String const&) Messages::WebDriverClient::ElementClearResponse WebDriverConnection::element_clear(String const& element_id)
{ {
dbgln("FIXME: WebDriverConnection::element_clear()"); dbgln("FIXME: WebDriverConnection::element_clear({})", element_id);
// FIXME: 1. If element's innerHTML IDL attribute is an empty string do nothing and return.
// FIXME: 2. Run the focusing steps for element.
// FIXME: 3. Set element's innerHTML IDL attribute to an empty string.
// FIXME: 4. Run the unfocusing steps for the element.
// To clear a resettable element:
// FIXME: 1. Let empty be the result of the first matching condition:
// To clear a content editable element:
{ {
// -> element is an input element whose type attribute is in the File Upload state // FIXME: 1. If element's innerHTML IDL attribute is an empty string do nothing and return.
// True if the list of selected files has a length of 0, and false otherwise. // FIXME: 2. Run the focusing steps for element.
// -> otherwise // FIXME: 3. Set element's innerHTML IDL attribute to an empty string.
// True if its value IDL attribute is an empty string, and false otherwise. // FIXME: 4. Run the unfocusing steps for the element.
} }
// FIXME: 2. If element is a candidate for constraint validation it satisfies its constraints, and empty is true, abort these substeps. // To clear a resettable element:
{
// FIXME: 3. Invoke the focusing steps for element. // FIXME: 1. Let empty be the result of the first matching condition:
{
// FIXME: 4. Invoke the clear algorithm for element. // -> element is an input element whose type attribute is in the File Upload state
{
// FIXME: 5. Invoke the unfocusing steps for the element. // True if the list of selected files has a length of 0, and false otherwise.
}
// The remote end steps, given session, URL variables and parameters are: // -> otherwise
{
// True if its value IDL attribute is an empty string, and false otherwise.
}
}
// FIXME: 2. If element is a candidate for constraint validation it satisfies its constraints, and empty is true, abort these substeps.
// FIXME: 3. Invoke the focusing steps for element.
// FIXME: 4. Invoke the clear algorithm for element.
// FIXME: 5. Invoke the unfocusing steps for the element.
}
// FIXME: 1. If session's current browsing context is no longer open, return error with error code no such window. // FIXME: 1. If session's current browsing context is no longer open, return error with error code no such window.
// FIXME: 2. Try to handle any user prompts with session. // FIXME: 2. Try to handle any user prompts with session.
// FIXME: 3. Let element be the result of trying to get a known element with session and element id. // FIXME: 3. Let element be the result of trying to get a known element with session and element id.
// FIXME: 4. If element is not editable, return an error with error code invalid element state. // FIXME: 4. If element is not editable, return an error with error code invalid element state.
// FIXME: 5. Scroll into view the element. // FIXME: 5. Scroll into view the element.
// FIXME: 6. Let timeout be session's session timeouts' implicit wait timeout. // FIXME: 6. Let timeout be session's session timeouts' implicit wait timeout.
// FIXME: 7. Let timer be a new timer. // FIXME: 7. Let timer be a new timer.
// FIXME: 8. If timeout is not null: // FIXME: 8. If timeout is not null:
{ {
// FIXME: 1. Start the timer with timer and timeout. // FIXME: 1. Start the timer with timer and timeout.
} }
// FIXME: 9. Wait for element to become interactable, or timer's timeout fired flag to be set, whichever occurs first. // FIXME: 9. Wait for element to become interactable, or timer's timeout fired flag to be set, whichever occurs first.
// FIXME: 10. If element is not interactable, return error with error code element not interactable. // FIXME: 10. If element is not interactable, return error with error code element not interactable.
// FIXME: 11. Run the substeps of the first matching statement: // FIXME: 11. Run the substeps of the first matching statement:
{ {
// -> element is a mutable form control element // -> element is a mutable form control element
{
// Invoke the steps to clear a resettable element. // Invoke the steps to clear a resettable element.
}
// -> element is a mutable element // -> element is a mutable element
{
// Invoke the steps to clear a content editable element. // Invoke the steps to clear a content editable element.
}
// -> otherwise // -> otherwise
{
// Return error with error code invalid element state. // Return error with error code invalid element state.
}
} }
// FIXME: 12. Return success with data null. // FIXME: 12. Return success with data null.
return Web::WebDriver::Error::from_code(Web::WebDriver::ErrorCode::UnsupportedOperation, "element clear not implemented"sv); return Web::WebDriver::Error::from_code(Web::WebDriver::ErrorCode::UnsupportedOperation, "element clear not implemented"sv);
} }
// 12.5.3 Element Send Keys, https://w3c.github.io/webdriver/#dfn-element-send-keys // 12.5.3 Element Send Keys, https://w3c.github.io/webdriver/#dfn-element-send-keys
Messages::WebDriverClient::ElementSendKeysResponse WebDriverConnection::element_send_keys(String const&) Messages::WebDriverClient::ElementSendKeysResponse WebDriverConnection::element_send_keys(String const& element_id, JsonValue const& payload)
{ {
dbgln("FIXME: WebDriverConnection::element_send_keys()"); dbgln("FIXME: WebDriverConnection::element_send_keys({}, {})", element_id, payload);
// FIXME: 1. If source is not a key input source return error with error code invalid argument.
// FIXME: 2. Let actions options be a new actions options with the is element origin steps set to represents a web element, and the get element origin steps set to get a WebElement origin.
// FIXME: 3. For each entry key in the lexically sorted keys of undo actions:
// To clear the modifier key state given input state, input id, source, undo actions, and browsing context:
{ {
// FIXME: 1. Let action be the value of undo actions equal to the key entry key. // FIXME: 1. If source is not a key input source return error with error code invalid argument.
// FIXME: 2. Let actions options be a new actions options with the is element origin steps set to represents a web element, and the get element origin steps set to get a WebElement origin.
// FIXME: 2. If action is not an action object with type "key" and subtype "keyUp", return error with error code invalid argument. // FIXME: 3. For each entry key in the lexically sorted keys of undo actions:
{
// FIXME: 3. Let actions be the list «action» // FIXME: 1. Let action be the value of undo actions equal to the key entry key.
// FIXME: 2. If action is not an action object with type "key" and subtype "keyUp", return error with error code invalid argument.
// FIXME: 4. Dispatch a list of actions with input state, actions, browsing context, and actions options. // FIXME: 3. Let actions be the list «action»
// FIXME: 4. Dispatch a list of actions with input state, actions, browsing context, and actions options.
}
} }
// To dispatch the events for a typeable string given input state, input id, source, text, and browsing context: // To dispatch the events for a typeable string given input state, input id, source, text, and browsing context:
// FIXME: 1. Let actions options be a new actions options with the is element origin steps set to represents a web element, and the get element origin steps set to get a WebElement origin.
// FIXME: 2. For each char of text:
{ {
// FIXME: 1. Let global key state be the result of get the global key state with input state. // FIXME: 1. Let actions options be a new actions options with the is element origin steps set to represents a web element, and the get element origin steps set to get a WebElement origin.
// FIXME: 2. For each char of text:
// FIXME: 2. Let actions be the list «action». {
// FIXME: 1. Let global key state be the result of get the global key state with input state.
// FIXME: 3. Dispatch a list of actions with input state, actions, and browsing context. // FIXME: 2. Let actions be the list «action».
// FIXME: 3. Dispatch a list of actions with input state, actions, and browsing context.
}
// FIXME: 3. If char is not a shifted character and the shifted state of source is true:
{
// FIXME: 1. Let action be an action object constructed with input id, "key", and "keyUp", and set its value property to U+E008 ("left shift").
// FIXME: 2. Let tick actions be the list «action».
// FIXME: 3. Dispatch a list of actions with input state, actions, browsing context, and actions options.
}
// FIXME: 4. Let keydown action be an action object constructed with arguments input id, "key", and "keyDown".
// FIXME: 5. Set the value property of keydown action to char.
// FIXME: 6. Let keyup action be a copy of keydown action with the subtype property changed to "keyUp".
// FIXME: 7. Let actions be the list «keydown action, keyup action».
// FIXME: 8. Dispatch a list of actions with input state, actions, browsing context, and actions options.
} }
// FIXME: 3. If char is not a shifted character and the shifted state of source is true:
{
// FIXME: 1. Let action be an action object constructed with input id, "key", and "keyUp", and set its value property to U+E008 ("left shift").
// FIXME: 2. Let tick actions be the list «action».
// FIXME: 3. Dispatch a list of actions with input state, actions, browsing context, and actions options.
}
// FIXME: 4. Let keydown action be an action object constructed with arguments input id, "key", and "keyDown".
// FIXME: 5. Set the value property of keydown action to char.
// FIXME: 6. Let keyup action be a copy of keydown action with the subtype property changed to "keyUp".
// FIXME: 7. Let actions be the list «keydown action, keyup action».
// FIXME: 8. Dispatch a list of actions with input state, actions, browsing context, and actions options.
// To dispatch actions for a string given input state, input id, source, text, browsing context, and actions options: // To dispatch actions for a string given input state, input id, source, text, browsing context, and actions options:
// FIXME: 1. Let clusters be an array created by breaking text into extended grapheme clusters.
// FIXME: 2. Let undo actions be an empty map.
// FIXME: 3. Let current typeable text be an empty list.
// FIXME: 4. For each cluster corresponding to an indexed property in clusters run the substeps of the first matching statement:
{ {
// -> cluster is the null key // FIXME: 1. Let clusters be an array created by breaking text into extended grapheme clusters.
// FIXME: 2. Let undo actions be an empty map.
// FIXME: 3. Let current typeable text be an empty list.
// FIXME: 4. For each cluster corresponding to an indexed property in clusters run the substeps of the first matching statement:
{ {
// FIXME: 1. Dispatch the events for a typeable string with input state, input id, source, current typeable text, and browsing context. Empty current typeable text. // -> cluster is the null key
{
// FIXME: 2. Try to clear the modifier key state with input state, input id, source, undo actions and browsing context. // FIXME: 1. Dispatch the events for a typeable string with input state, input id, source, current typeable text, and browsing context. Empty current typeable text.
// FIXME: 2. Try to clear the modifier key state with input state, input id, source, undo actions and browsing context.
// FIXME: 3. Clear undo actions. // FIXME: 3. Clear undo actions.
} }
// -> cluster is a modifier key
// -> cluster is a modifier key {
// FIXME: 1. Dispatch the events for a typeable string with input state, input id, source, current typeable text, and browsing context.
{ // FIXME: 2. Emptycurrent typeable text.
// FIXME: 1. Dispatch the events for a typeable string with input state, input id, source, current typeable text, and browsing context. // FIXME: 3. Let keydown action be an action object constructed with arguments input id, "key", and "keyDown".
// FIXME: 4. Set the value property of keydown action to cluster.
// FIXME: 2. Emptycurrent typeable text. // FIXME: 5. Let actions be the list «keydown action»
// FIXME: 6. Dispatch a list of actions with input state, actions, browsing context, and actions options.
// FIXME: 3. Let keydown action be an action object constructed with arguments input id, "key", and "keyDown". // FIXME: 7. Add an entry to undo actions with key cluster and value being a copy of keydown action with the subtype property modified to "keyUp".
}
// FIXME: 4. Set the value property of keydown action to cluster. // -> cluster is typeable
{
// FIXME: 5. Let actions be the list «keydown action» // Append cluster to current typeable text.
}
// FIXME: 6. Dispatch a list of actions with input state, actions, browsing context, and actions options. // -> otherwise
{
// FIXME: 7. Add an entry to undo actions with key cluster and value being a copy of keydown action with the subtype property modified to "keyUp". // FIXME: 1. Dispatch the events for a typeable string with input state, input id, source, current typeable text, and browsing context.
} // FIXME: 2. Empty current typeable text.
// FIXME: 3. Dispatch a composition event with arguments "compositionstart", undefined, and browsing context.
// -> cluster is typeable // FIXME: 4. Dispatch a composition event with arguments "compositionupdate", cluster, and browsing context.
// FIXME: 5. Dispatch a composition event with arguments "compositionend", cluster, and browsing context.
{ }
// Append cluster to current typeable text.
}
// -> otherwise
{
// FIXME: 1. Dispatch the events for a typeable string with input state, input id, source, current typeable text, and browsing context.
// FIXME: 2. Empty current typeable text.
// FIXME: 3. Dispatch a composition event with arguments "compositionstart", undefined, and browsing context.
// FIXME: 4. Dispatch a composition event with arguments "compositionupdate", cluster, and browsing context.
// FIXME: 5. Dispatch a composition event with arguments "compositionend", cluster, and browsing context.
} }
// FIXME: 5. Dispatch the events for a typeable string with input state, input id and source, current typeable text, and browsing context.
// FIXME: 6. Try to clear the modifier key state with input state, input id, source, undo actions, and browsing context.
} }
// FIXME: 5. Dispatch the events for a typeable string with input state, input id and source, current typeable text, and browsing context.
// FIXME: 6. Try to clear the modifier key state with input state, input id, source, undo actions, and browsing context.
// The remote end steps, given session, URL variables and parameters are:
// FIXME: 1. Let text be the result of getting a property named "text" from parameters. // FIXME: 1. Let text be the result of getting a property named "text" from parameters.
// FIXME: 2. If text is not a String, return an error with error code invalid argument. // FIXME: 2. If text is not a String, return an error with error code invalid argument.
// FIXME: 3. If session's current browsing context is no longer open, return error with error code no such window. // FIXME: 3. If session's current browsing context is no longer open, return error with error code no such window.
// FIXME: 4. Try to handle any user prompts with session. // FIXME: 4. Try to handle any user prompts with session.
// FIXME: 5. Let element be the result of trying to get a known element with session and URL variables[element id]. // FIXME: 5. Let element be the result of trying to get a known element with session and URL variables[element id].
// FIXME: 6. Let file be true if element is input element in the file upload state, or false otherwise. // FIXME: 6. Let file be true if element is input element in the file upload state, or false otherwise.
// FIXME: 7. If file is false or the session's strict file interactability, is true run the following substeps: // FIXME: 7. If file is false or the session's strict file interactability, is true run the following substeps:
{ {
// FIXME: 1. Scroll into view the element. // FIXME: 1. Scroll into view the element.
// FIXME: 2. Let timeout be session's session timeouts' implicit wait timeout. // FIXME: 2. Let timeout be session's session timeouts' implicit wait timeout.
// FIXME: 3. Let timer be a new timer. // FIXME: 3. Let timer be a new timer.
// FIXME: 4. If timeout is not null: // FIXME: 4. If timeout is not null:
{ {
// FIXME: 1. Start the timer with timer and timeout. // FIXME: 1. Start the timer with timer and timeout.
} }
// FIXME: 5. Wait for element to become keyboard-interactable, or timer's timeout fired flag to be set, whichever occurs first. // FIXME: 5. Wait for element to become keyboard-interactable, or timer's timeout fired flag to be set, whichever occurs first.
// FIXME: 6. If element is not keyboard-interactable, return error with error code element not interactable. // FIXME: 6. If element is not keyboard-interactable, return error with error code element not interactable.
// FIXME: 7. If element is not the active element run the focusing steps for the element. // FIXME: 7. If element is not the active element run the focusing steps for the element.
} }
// FIXME: 8. Run the substeps of the first matching condition: // FIXME: 8. Run the substeps of the first matching condition:
// -> file is true
{ {
// FIXME: 1. Let files be the result of splitting text on the newline (\n) character. // -> file is true
{
// FIXME: 2. If files is of 0 length, return an error with error code invalid argument. // FIXME: 1. Let files be the result of splitting text on the newline (\n) character.
// FIXME: 2. If files is of 0 length, return an error with error code invalid argument.
// FIXME: 3. Let multiple equal the result of calling hasAttribute() with "multiple" on element. // FIXME: 3. Let multiple equal the result of calling hasAttribute() with "multiple" on element.
// FIXME: 4. if multiple is false and the length of files is not equal to 1, return an error with error code invalid argument.
// FIXME: 4. if multiple is false and the length of files is not equal to 1, return an error with error code invalid argument. // FIXME: 5. Verify that each file given by the user exists. If any do not, return error with error code invalid argument.
// FIXME: 6. Complete implementation specific steps equivalent to setting the selected files on the input element. If multiple is true files are be appended to element's selected files.
// FIXME: 5. Verify that each file given by the user exists. If any do not, return error with error code invalid argument. // FIXME: 7. Fire these events in order on element:
// FIXME: 1. input
// FIXME: 6. Complete implementation specific steps equivalent to setting the selected files on the input element. If multiple is true files are be appended to element's selected files. // FIXME: 2. change
// FIXME: 8. Return success with data null.
// FIXME: 7. Fire these events in order on element: }
// -> element is a non-typeable form control
// FIXME: 1. input {
// FIXME: 1. If element does not have an own property named value return an error with error code element not interactable
// FIXME: 2. change // FIXME: 2. If element is not mutable return an error with error code element not interactable.
// FIXME: 3. Set a property value to text on element.
// FIXME: 8. Return success with data null. // FIXME: 4. If element is suffering from bad input return an error with error code invalid argument.
// FIXME: 5. Return success with data null.
}
// -> elementis content editable
{
// If element does not currently have focus, set the text insertion caret after any child content.
}
// -> otherwise
{
// FIXME: 1. If element does not currently have focus, let current text length be the length of element's API value.
// FIXME: 2. Set the text insertion caret using set selection range using current text length for both the start and end parameters.
}
} }
// -> element is a non-typeable form control
{
// FIXME: 1. If element does not have an own property named value return an error with error code element not interactable
// FIXME: 2. If element is not mutable return an error with error code element not interactable.
// FIXME: 3. Set a property value to text on element.
// FIXME: 4. If element is suffering from bad input return an error with error code invalid argument.
// FIXME: 5. Return success with data null.
}
// -> elementis content editable
{
// If element does not currently have focus, set the text insertion caret after any child content.
}
// -> otherwise
{
// FIXME: 1. If element does not currently have focus, let current text length be the length of element's API value.
// FIXME: 2. Set the text insertion caret using set selection range using current text length for both the start and end parameters.
}
// FIXME: 9. Let input state be the result of get the input state with session and session's current top-level browsing context. // FIXME: 9. Let input state be the result of get the input state with session and session's current top-level browsing context.
// FIXME: 10. Let input id be a the result of generating a UUID. // FIXME: 10. Let input id be a the result of generating a UUID.
// FIXME: 11. Let source be the result of create an input source with input state, and "key". // FIXME: 11. Let source be the result of create an input source with input state, and "key".
// FIXME: 12. Add an input source with input state, input id and source. // FIXME: 12. Add an input source with input state, input id and source.
// FIXME: 13. Dispatch actions for a string with arguments input state, input id, and source, text, and session's current browsing context. // FIXME: 13. Dispatch actions for a string with arguments input state, input id, and source, text, and session's current browsing context.
// FIXME: 14. Remove an input source with input state and input id. // FIXME: 14. Remove an input source with input state and input id.
// FIXME: 15. Return success with data null. // FIXME: 15. Return success with data null.
return Web::WebDriver::Error::from_code(Web::WebDriver::ErrorCode::UnsupportedOperation, "send keys not implemented"sv); return Web::WebDriver::Error::from_code(Web::WebDriver::ErrorCode::UnsupportedOperation, "send keys not implemented"sv);
@ -2032,38 +1920,33 @@ Messages::WebDriverClient::DeleteAllCookiesResponse WebDriverConnection::delete_
} }
// 15.7 Perform Actions, https://w3c.github.io/webdriver/#perform-actions // 15.7 Perform Actions, https://w3c.github.io/webdriver/#perform-actions
Messages::WebDriverClient::PerformActionsResponse WebDriverConnection::perform_actions() Messages::WebDriverClient::PerformActionsResponse WebDriverConnection::perform_actions(JsonValue const& payload)
{ {
dbgln("FIXME: WebDriverConnection::perform_actions({})", payload);
// FIXME: 1. Let input state be the result of get the input state with session and session's current top-level browsing context. // FIXME: 1. Let input state be the result of get the input state with session and session's current top-level browsing context.
// FIXME: 2. Let actions options be a new actions options with the is element origin steps set to represents a web element, and the get element origin steps set to get a WebElement origin.
// FIXME: 2.Let actions options be a new actions options with the is element origin steps set to represents a web element, and the get element origin steps set to get a WebElement origin. // FIXME: 3. Let actions by tick be the result of trying to extract an action sequence with input state, parameters, and actions options.
// FIXME: 3.Let actions by tick be the result of trying to extract an action sequence with input state, parameters, and actions options.
// FIXME: 4. If session's current browsing context is no longer open, return error with error code no such window. // FIXME: 4. If session's current browsing context is no longer open, return error with error code no such window.
// FIXME: 5. Try to handle any user prompts with session. // FIXME: 5. Try to handle any user prompts with session.
// FIXME: 6. Dispatch actions with input state, actions by tick, current browsing context, and actions options. If this results in an error return that error. // FIXME: 6. Dispatch actions with input state, actions by tick, current browsing context, and actions options. If this results in an error return that error.
// FIXME: 7. Return success with data null. // FIXME: 7. Return success with data null.
return Web::WebDriver::Error::from_code(Web::WebDriver::ErrorCode::UnsupportedOperation, "perform actions not implemented"sv); return Web::WebDriver::Error::from_code(Web::WebDriver::ErrorCode::UnsupportedOperation, "perform actions not implemented"sv);
} }
// 15.8 Release Actions, https://w3c.github.io/webdriver/#release-actions // 15.8 Release Actions, https://w3c.github.io/webdriver/#release-actions
Messages::WebDriverClient::ReleaseActionsResponse WebDriverConnection::release_actions() Messages::WebDriverClient::ReleaseActionsResponse WebDriverConnection::release_actions()
{ {
dbgln("FIXME: WebDriverConnection::release_actions()");
// 1. If the current browsing context is no longer open, return error with error code no such window. // 1. If the current browsing context is no longer open, return error with error code no such window.
TRY(ensure_current_browsing_context_is_open()); TRY(ensure_current_browsing_context_is_open());
// FIXME: 2. Let input state be the result of get the input state with current session and current top-level browsing context. // FIXME: 2. Let input state be the result of get the input state with current session and current top-level browsing context.
// FIXME: 3. Let actions options be a new actions options with the is element origin steps set to represents a web element, and the get element origin steps set to get a WebElement origin. // FIXME: 3. Let actions options be a new actions options with the is element origin steps set to represents a web element, and the get element origin steps set to get a WebElement origin.
// FIXME: 4. Let undo actions be input states input cancel list in reverse order. // FIXME: 4. Let undo actions be input states input cancel list in reverse order.
// FIXME: 5. Try to dispatch tick actions with arguments undo actions, 0, current browsing context, and actions options. // FIXME: 5. Try to dispatch tick actions with arguments undo actions, 0, current browsing context, and actions options.
// FIXME: 6. Reset the input state with current session and current top-level browsing context. // FIXME: 6. Reset the input state with current session and current top-level browsing context.
// 7. Return success with data null. // 7. Return success with data null.
@ -2229,9 +2112,9 @@ Messages::WebDriverClient::TakeElementScreenshotResponse WebDriverConnection::ta
} }
// 18.1 Print Page, https://w3c.github.io/webdriver/#dfn-print-page // 18.1 Print Page, https://w3c.github.io/webdriver/#dfn-print-page
Messages::WebDriverClient::PrintPageResponse WebDriverConnection::print_page() Messages::WebDriverClient::PrintPageResponse WebDriverConnection::print_page(JsonValue const& payload)
{ {
// FIXME: Actually implement this :^) dbgln("FIXME: WebDriverConnection::print_page({})", payload);
return Web::WebDriver::Error::from_code(Web::WebDriver::ErrorCode::UnsupportedOperation, "Print not implemented"sv); return Web::WebDriver::Error::from_code(Web::WebDriver::ErrorCode::UnsupportedOperation, "Print not implemented"sv);
} }

View file

@ -84,7 +84,7 @@ private:
virtual Messages::WebDriverClient::GetComputedLabelResponse get_computed_label(String const& element_id) override; virtual Messages::WebDriverClient::GetComputedLabelResponse get_computed_label(String const& element_id) override;
virtual Messages::WebDriverClient::ElementClickResponse element_click(String const& element_id) override; virtual Messages::WebDriverClient::ElementClickResponse element_click(String const& element_id) override;
virtual Messages::WebDriverClient::ElementClearResponse element_clear(String const& element_id) override; virtual Messages::WebDriverClient::ElementClearResponse element_clear(String const& element_id) override;
virtual Messages::WebDriverClient::ElementSendKeysResponse element_send_keys(String const& element_id) override; virtual Messages::WebDriverClient::ElementSendKeysResponse element_send_keys(String const& element_id, JsonValue const& payload) override;
virtual Messages::WebDriverClient::GetSourceResponse get_source() override; virtual Messages::WebDriverClient::GetSourceResponse get_source() override;
virtual Messages::WebDriverClient::ExecuteScriptResponse execute_script(JsonValue const& payload) override; virtual Messages::WebDriverClient::ExecuteScriptResponse execute_script(JsonValue const& payload) override;
virtual Messages::WebDriverClient::ExecuteAsyncScriptResponse execute_async_script(JsonValue const& payload) override; virtual Messages::WebDriverClient::ExecuteAsyncScriptResponse execute_async_script(JsonValue const& payload) override;
@ -93,7 +93,7 @@ private:
virtual Messages::WebDriverClient::AddCookieResponse add_cookie(JsonValue const& payload) override; virtual Messages::WebDriverClient::AddCookieResponse add_cookie(JsonValue const& payload) override;
virtual Messages::WebDriverClient::DeleteCookieResponse delete_cookie(String const& name) override; virtual Messages::WebDriverClient::DeleteCookieResponse delete_cookie(String const& name) override;
virtual Messages::WebDriverClient::DeleteAllCookiesResponse delete_all_cookies() override; virtual Messages::WebDriverClient::DeleteAllCookiesResponse delete_all_cookies() override;
virtual Messages::WebDriverClient::PerformActionsResponse perform_actions() override; virtual Messages::WebDriverClient::PerformActionsResponse perform_actions(JsonValue const& payload) override;
virtual Messages::WebDriverClient::ReleaseActionsResponse release_actions() override; virtual Messages::WebDriverClient::ReleaseActionsResponse release_actions() override;
virtual Messages::WebDriverClient::DismissAlertResponse dismiss_alert() override; virtual Messages::WebDriverClient::DismissAlertResponse dismiss_alert() override;
virtual Messages::WebDriverClient::AcceptAlertResponse accept_alert() override; virtual Messages::WebDriverClient::AcceptAlertResponse accept_alert() override;
@ -101,7 +101,7 @@ private:
virtual Messages::WebDriverClient::SendAlertTextResponse send_alert_text(JsonValue const& payload) override; virtual Messages::WebDriverClient::SendAlertTextResponse send_alert_text(JsonValue const& payload) override;
virtual Messages::WebDriverClient::TakeScreenshotResponse take_screenshot() override; virtual Messages::WebDriverClient::TakeScreenshotResponse take_screenshot() override;
virtual Messages::WebDriverClient::TakeElementScreenshotResponse take_element_screenshot(String const& element_id) override; virtual Messages::WebDriverClient::TakeElementScreenshotResponse take_element_screenshot(String const& element_id) override;
virtual Messages::WebDriverClient::PrintPageResponse print_page() override; virtual Messages::WebDriverClient::PrintPageResponse print_page(JsonValue const& payload) override;
virtual Messages::WebDriverClient::EnsureTopLevelBrowsingContextIsOpenResponse ensure_top_level_browsing_context_is_open() override; virtual Messages::WebDriverClient::EnsureTopLevelBrowsingContextIsOpenResponse ensure_top_level_browsing_context_is_open() override;
Web::HTML::BrowsingContext& current_browsing_context() { return *m_current_browsing_context; } Web::HTML::BrowsingContext& current_browsing_context() { return *m_current_browsing_context; }

View file

@ -598,11 +598,11 @@ Web::WebDriver::Response Client::element_clear(Web::WebDriver::Parameters parame
// 12.5.3 Element Send Keys, https://w3c.github.io/webdriver/#dfn-element-send-keys // 12.5.3 Element Send Keys, https://w3c.github.io/webdriver/#dfn-element-send-keys
// POST /session/{session id}/element/{element id}/value // POST /session/{session id}/element/{element id}/value
Web::WebDriver::Response Client::element_send_keys(Web::WebDriver::Parameters parameters, JsonValue) Web::WebDriver::Response Client::element_send_keys(Web::WebDriver::Parameters parameters, JsonValue payload)
{ {
dbgln_if(WEBDRIVER_DEBUG, "Handling POST /session/<session_id>/element/<element_id>/value"); dbgln_if(WEBDRIVER_DEBUG, "Handling POST /session/<session_id>/element/<element_id>/value");
auto session = TRY(find_session_with_id(parameters[0])); auto session = TRY(find_session_with_id(parameters[0]));
return session->web_content_connection().element_send_keys(move(parameters[1])); return session->web_content_connection().element_send_keys(move(parameters[1]), move(payload));
} }
// 13.1 Get Page Source, https://w3c.github.io/webdriver/#dfn-get-page-source // 13.1 Get Page Source, https://w3c.github.io/webdriver/#dfn-get-page-source
@ -679,11 +679,11 @@ Web::WebDriver::Response Client::delete_all_cookies(Web::WebDriver::Parameters p
// 15.7 Perform Actions, https://w3c.github.io/webdriver/#perform-actions // 15.7 Perform Actions, https://w3c.github.io/webdriver/#perform-actions
// POST /session/{session id}/actions // POST /session/{session id}/actions
Web::WebDriver::Response Client::perform_actions(Web::WebDriver::Parameters parameters, JsonValue) Web::WebDriver::Response Client::perform_actions(Web::WebDriver::Parameters parameters, JsonValue payload)
{ {
dbgln_if(WEBDRIVER_DEBUG, "Handling POST /session/<session_id>/actions"); dbgln_if(WEBDRIVER_DEBUG, "Handling POST /session/<session_id>/actions");
auto session = TRY(find_session_with_id(parameters[0])); auto session = TRY(find_session_with_id(parameters[0]));
return session->web_content_connection().perform_actions(); return session->web_content_connection().perform_actions(move(payload));
} }
// 15.8 Release Actions, https://w3c.github.io/webdriver/#release-actions // 15.8 Release Actions, https://w3c.github.io/webdriver/#release-actions
@ -751,11 +751,11 @@ Web::WebDriver::Response Client::take_element_screenshot(Web::WebDriver::Paramet
// 18.1 Print Page, https://w3c.github.io/webdriver/#dfn-print-page // 18.1 Print Page, https://w3c.github.io/webdriver/#dfn-print-page
// POST /session/{session id}/print // POST /session/{session id}/print
Web::WebDriver::Response Client::print_page(Web::WebDriver::Parameters parameters, JsonValue) Web::WebDriver::Response Client::print_page(Web::WebDriver::Parameters parameters, JsonValue payload)
{ {
dbgln_if(WEBDRIVER_DEBUG, "Handling POST /session/<session id>/print"); dbgln_if(WEBDRIVER_DEBUG, "Handling POST /session/<session id>/print");
auto session = TRY(find_session_with_id(parameters[0])); auto session = TRY(find_session_with_id(parameters[0]));
return session->web_content_connection().print_page(); return session->web_content_connection().print_page(move(payload));
} }
} }