TimeoutsConfiguration.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. * Copyright (c) 2022, Linus Groh <linusg@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include <AK/JsonObject.h>
  7. #include <LibJS/Runtime/Value.h>
  8. #include <LibWeb/WebDriver/TimeoutsConfiguration.h>
  9. namespace Web::WebDriver {
  10. // https://w3c.github.io/webdriver/#dfn-timeouts-object
  11. JsonObject timeouts_object(TimeoutsConfiguration const& timeouts)
  12. {
  13. // 1. Let serialized be an empty map.
  14. JsonObject serialized;
  15. // 2. Set serialized["script"] to timeouts' script timeout.
  16. serialized.set("script"sv, timeouts.script_timeout.has_value() ? *timeouts.script_timeout : JsonValue {});
  17. // 3. Set serialized["pageLoad"] to timeouts' page load timeout.
  18. serialized.set("pageLoad"sv, timeouts.page_load_timeout.has_value() ? *timeouts.page_load_timeout : JsonValue {});
  19. // 4. Set serialized["implicit"] to timeouts' implicit wait timeout.
  20. serialized.set("implicit"sv, timeouts.implicit_wait_timeout.has_value() ? *timeouts.implicit_wait_timeout : JsonValue {});
  21. // 5. Return convert an Infra value to a JSON-compatible JavaScript value with serialized.
  22. return serialized;
  23. }
  24. // https://w3c.github.io/webdriver/#dfn-deserialize-as-timeouts-configuration
  25. ErrorOr<TimeoutsConfiguration, Error> json_deserialize_as_a_timeouts_configuration(JsonValue const& timeouts)
  26. {
  27. // 2. Let configuration be a new timeouts configuration.
  28. TimeoutsConfiguration configuration {};
  29. TRY(json_deserialize_as_a_timeouts_configuration_into(timeouts, configuration));
  30. // 4. Return success with data configuration.
  31. return configuration;
  32. }
  33. // https://w3c.github.io/webdriver/#dfn-deserialize-as-timeouts-configuration
  34. ErrorOr<void, Error> json_deserialize_as_a_timeouts_configuration_into(JsonValue const& timeouts, TimeoutsConfiguration& configuration)
  35. {
  36. // 1. Set timeouts to the result of converting a JSON-derived JavaScript value to an Infra value with timeouts.
  37. if (!timeouts.is_object())
  38. return Error::from_code(ErrorCode::InvalidArgument, "Payload is not a JSON object");
  39. // 3. For each key → value in timeouts:
  40. TRY(timeouts.as_object().try_for_each_member([&](auto const& key, JsonValue const& value) -> ErrorOr<void, Error> {
  41. Optional<u64> parsed_value;
  42. // 1. If «"script", "pageLoad", "implicit"» does not contain key, then continue.
  43. if (!key.is_one_of("script"sv, "pageLoad"sv, "implicit"sv))
  44. return {};
  45. // 2. If value is neither null nor a number greater than or equal to 0 and less than or equal to the maximum
  46. // safe integer return error with error code invalid argument.
  47. if (!value.is_null()) {
  48. auto duration = value.get_integer<u64>();
  49. if (!duration.has_value() || *duration > JS::MAX_ARRAY_LIKE_INDEX)
  50. return Error::from_code(ErrorCode::InvalidArgument, "Invalid timeout value");
  51. parsed_value = static_cast<u64>(*duration);
  52. }
  53. // 3. Run the substeps matching key:
  54. // -> "script"
  55. if (key == "script"sv) {
  56. // Set configuration's script timeout to value.
  57. configuration.script_timeout = parsed_value;
  58. }
  59. // -> "pageLoad"
  60. else if (key == "pageLoad"sv) {
  61. // Set configuration's page load timeout to value.
  62. configuration.page_load_timeout = parsed_value;
  63. }
  64. // -> "implicit"
  65. else if (key == "implicit"sv) {
  66. // Set configuration's implicit wait timeout to value.
  67. configuration.implicit_wait_timeout = parsed_value;
  68. }
  69. return {};
  70. }));
  71. return {};
  72. }
  73. }