mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-08-04 23:30:20 +00:00
AK+Everywhere: Remove now-unecessary use of ByteString with JSON types
This removes JsonObject::get_byte_string and JsonObject::to_byte_string.
This commit is contained in:
parent
4791ec35bf
commit
2c03de60da
Notes:
github-actions[bot]
2025-02-21 00:28:59 +00:00
Author: https://github.com/trflynn89
Commit: 2c03de60da
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/3631
Reviewed-by: https://github.com/awesomekling ✅
17 changed files with 67 additions and 86 deletions
|
@ -123,13 +123,6 @@ Optional<String const&> JsonObject::get_string(StringView key) const
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
Optional<ByteString> JsonObject::get_byte_string(StringView key) const
|
|
||||||
{
|
|
||||||
if (auto value = get_string(key); value.has_value())
|
|
||||||
return value->to_byte_string();
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
Optional<JsonObject&> JsonObject::get_object(StringView key)
|
Optional<JsonObject&> JsonObject::get_object(StringView key)
|
||||||
{
|
{
|
||||||
auto maybe_value = get(key);
|
auto maybe_value = get(key);
|
||||||
|
@ -282,9 +275,4 @@ bool JsonObject::remove(StringView key)
|
||||||
return m_members.remove(key);
|
return m_members.remove(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteString JsonObject::to_byte_string() const
|
|
||||||
{
|
|
||||||
return serialized<StringBuilder>();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,7 +77,6 @@ public:
|
||||||
Optional<bool> get_bool(StringView key) const;
|
Optional<bool> get_bool(StringView key) const;
|
||||||
|
|
||||||
Optional<String const&> get_string(StringView key) const;
|
Optional<String const&> get_string(StringView key) const;
|
||||||
Optional<ByteString> get_byte_string(StringView key) const;
|
|
||||||
|
|
||||||
Optional<JsonObject&> get_object(StringView key);
|
Optional<JsonObject&> get_object(StringView key);
|
||||||
Optional<JsonObject const&> get_object(StringView key) const;
|
Optional<JsonObject const&> get_object(StringView key) const;
|
||||||
|
@ -114,8 +113,6 @@ public:
|
||||||
template<typename Builder>
|
template<typename Builder>
|
||||||
void serialize(Builder&) const;
|
void serialize(Builder&) const;
|
||||||
|
|
||||||
[[nodiscard]] ByteString to_byte_string() const;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
OrderedHashMap<String, JsonValue> m_members;
|
OrderedHashMap<String, JsonValue> m_members;
|
||||||
};
|
};
|
||||||
|
|
|
@ -754,7 +754,7 @@ void ArgsParser::autocomplete(FILE* file, StringView program_name, ReadonlySpan<
|
||||||
object.set("invariant_offset"sv, has_invariant ? option_to_complete.length() : 0u);
|
object.set("invariant_offset"sv, has_invariant ? option_to_complete.length() : 0u);
|
||||||
object.set("display_trivia"sv, StringView { option.help_string, strlen(option.help_string) });
|
object.set("display_trivia"sv, StringView { option.help_string, strlen(option.help_string) });
|
||||||
object.set("trailing_trivia"sv, option.argument_mode == OptionArgumentMode::Required ? " "sv : ""sv);
|
object.set("trailing_trivia"sv, option.argument_mode == OptionArgumentMode::Required ? " "sv : ""sv);
|
||||||
outln(file, "{}", object.to_byte_string());
|
outln(file, "{}", object.serialized<StringBuilder>());
|
||||||
};
|
};
|
||||||
|
|
||||||
if (option_to_complete.starts_with("--"sv)) {
|
if (option_to_complete.starts_with("--"sv)) {
|
||||||
|
|
|
@ -376,12 +376,12 @@ inline JSFileResult TestRunner::run_file_test(ByteString const& test_path)
|
||||||
VERIFY(suite_value.is_object());
|
VERIFY(suite_value.is_object());
|
||||||
|
|
||||||
suite_value.as_object().for_each_member([&](String const& test_name, JsonValue const& test_value) {
|
suite_value.as_object().for_each_member([&](String const& test_name, JsonValue const& test_value) {
|
||||||
Test::Case test { test_name, Test::Result::Fail, "", 0 };
|
Test::Case test { test_name, Test::Result::Fail, {}, 0 };
|
||||||
|
|
||||||
VERIFY(test_value.is_object());
|
VERIFY(test_value.is_object());
|
||||||
VERIFY(test_value.as_object().has("result"sv));
|
VERIFY(test_value.as_object().has("result"sv));
|
||||||
|
|
||||||
auto result = test_value.as_object().get_byte_string("result"sv);
|
auto result = test_value.as_object().get_string("result"sv);
|
||||||
VERIFY(result.has_value());
|
VERIFY(result.has_value());
|
||||||
auto result_string = result.value();
|
auto result_string = result.value();
|
||||||
if (result_string == "pass") {
|
if (result_string == "pass") {
|
||||||
|
@ -392,9 +392,9 @@ inline JSFileResult TestRunner::run_file_test(ByteString const& test_path)
|
||||||
m_counts.tests_failed++;
|
m_counts.tests_failed++;
|
||||||
suite.most_severe_test_result = Test::Result::Fail;
|
suite.most_severe_test_result = Test::Result::Fail;
|
||||||
VERIFY(test_value.as_object().has("details"sv));
|
VERIFY(test_value.as_object().has("details"sv));
|
||||||
auto details = test_value.as_object().get_byte_string("details"sv);
|
auto details = test_value.as_object().get_string("details"sv);
|
||||||
VERIFY(result.has_value());
|
VERIFY(result.has_value());
|
||||||
test.details = details.value();
|
test.details = details.release_value();
|
||||||
} else if (result_string == "xfail") {
|
} else if (result_string == "xfail") {
|
||||||
test.result = Test::Result::ExpectedFail;
|
test.result = Test::Result::ExpectedFail;
|
||||||
m_counts.tests_expected_failed++;
|
m_counts.tests_expected_failed++;
|
||||||
|
@ -430,7 +430,7 @@ inline JSFileResult TestRunner::run_file_test(ByteString const& test_path)
|
||||||
Test::Suite suite { test_path, "<top-level>"_string };
|
Test::Suite suite { test_path, "<top-level>"_string };
|
||||||
suite.most_severe_test_result = Result::Crashed;
|
suite.most_severe_test_result = Result::Crashed;
|
||||||
|
|
||||||
Test::Case test_case { "<top-level>"_string, Test::Result::Fail, "", 0 };
|
Test::Case test_case { "<top-level>"_string, Test::Result::Fail, {}, 0 };
|
||||||
auto error = top_level_result.release_error().release_value().release_value();
|
auto error = top_level_result.release_error().release_value().release_value();
|
||||||
if (error.is_object()) {
|
if (error.is_object()) {
|
||||||
StringBuilder detail_builder;
|
StringBuilder detail_builder;
|
||||||
|
@ -453,9 +453,9 @@ inline JSFileResult TestRunner::run_file_test(ByteString const& test_path)
|
||||||
detail_builder.append(error_as_error.stack_string());
|
detail_builder.append(error_as_error.stack_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
test_case.details = detail_builder.to_byte_string();
|
test_case.details = MUST(detail_builder.to_string());
|
||||||
} else {
|
} else {
|
||||||
test_case.details = error.to_string_without_side_effects().to_byte_string();
|
test_case.details = error.to_string_without_side_effects();
|
||||||
}
|
}
|
||||||
|
|
||||||
suite.tests.append(move(test_case));
|
suite.tests.append(move(test_case));
|
||||||
|
|
|
@ -26,7 +26,7 @@ enum class Result {
|
||||||
struct Case {
|
struct Case {
|
||||||
String name;
|
String name;
|
||||||
Result result;
|
Result result;
|
||||||
ByteString details;
|
String details;
|
||||||
u64 duration_us;
|
u64 duration_us;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -274,7 +274,7 @@ inline void TestRunner::print_test_results_as_json() const
|
||||||
root.set("files_total"sv, m_counts.files_total);
|
root.set("files_total"sv, m_counts.files_total);
|
||||||
root.set("duration"sv, m_total_elapsed_time_in_ms / 1000.0);
|
root.set("duration"sv, m_total_elapsed_time_in_ms / 1000.0);
|
||||||
}
|
}
|
||||||
outln("{}", root.to_byte_string());
|
outln("{}", root.serialized<StringBuilder>());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,8 @@
|
||||||
namespace Web::Bindings {
|
namespace Web::Bindings {
|
||||||
|
|
||||||
#define JWK_PARSE_STRING_PROPERTY(name) \
|
#define JWK_PARSE_STRING_PROPERTY(name) \
|
||||||
if (json_object.has_string(#name##sv)) { \
|
if (auto value = json_object.get_string(#name##sv); value.has_value()) { \
|
||||||
key.name = MUST(String::from_byte_string(*json_object.get_byte_string(#name##sv))); \
|
key.name = value.release_value(); \
|
||||||
}
|
}
|
||||||
|
|
||||||
JS::ThrowCompletionOr<JsonWebKey> JsonWebKey::parse(JS::Realm& realm, ReadonlyBytes data)
|
JS::ThrowCompletionOr<JsonWebKey> JsonWebKey::parse(JS::Realm& realm, ReadonlyBytes data)
|
||||||
|
|
|
@ -546,7 +546,7 @@ template<typename Generator>
|
||||||
static void generate_tree(StringBuilder& builder, JsonObject const& node, Generator&& generator)
|
static void generate_tree(StringBuilder& builder, JsonObject const& node, Generator&& generator)
|
||||||
{
|
{
|
||||||
if (auto children = node.get_array("children"sv); children.has_value() && !children->is_empty()) {
|
if (auto children = node.get_array("children"sv); children.has_value() && !children->is_empty()) {
|
||||||
auto name = node.get_byte_string("name"sv).value_or({});
|
auto name = node.get_string("name"sv).value_or({});
|
||||||
builder.append("<details>"sv);
|
builder.append("<details>"sv);
|
||||||
|
|
||||||
builder.append("<summary>"sv);
|
builder.append("<summary>"sv);
|
||||||
|
@ -570,8 +570,8 @@ String InspectorClient::generate_dom_tree(JsonObject const& dom_tree)
|
||||||
StringBuilder builder;
|
StringBuilder builder;
|
||||||
|
|
||||||
generate_tree(builder, dom_tree, [&](JsonObject const& node) {
|
generate_tree(builder, dom_tree, [&](JsonObject const& node) {
|
||||||
auto type = node.get_byte_string("type"sv).value_or("unknown"sv);
|
auto type = node.get_string("type"sv).value_or("unknown"_string);
|
||||||
auto name = node.get_byte_string("name"sv).value_or({});
|
auto name = node.get_string("name"sv).value_or({});
|
||||||
|
|
||||||
StringBuilder data_attributes;
|
StringBuilder data_attributes;
|
||||||
auto append_data_attribute = [&](auto name, auto value) {
|
auto append_data_attribute = [&](auto name, auto value) {
|
||||||
|
@ -592,10 +592,9 @@ String InspectorClient::generate_dom_tree(JsonObject const& dom_tree)
|
||||||
append_data_attribute("id"sv, node_id);
|
append_data_attribute("id"sv, node_id);
|
||||||
|
|
||||||
if (type == "text"sv) {
|
if (type == "text"sv) {
|
||||||
auto deprecated_text = node.get_byte_string("text"sv).release_value();
|
auto deprecated_text = escape_html_entities(*node.get_string("text"sv));
|
||||||
deprecated_text = escape_html_entities(deprecated_text);
|
|
||||||
|
|
||||||
auto text = MUST(Web::Infra::strip_and_collapse_whitespace(deprecated_text));
|
auto text = MUST(Web::Infra::strip_and_collapse_whitespace(deprecated_text));
|
||||||
|
|
||||||
builder.appendff("<span data-node-type=\"text\" class=\"hoverable editable\" {}>", data_attributes.string_view());
|
builder.appendff("<span data-node-type=\"text\" class=\"hoverable editable\" {}>", data_attributes.string_view());
|
||||||
|
|
||||||
if (text.is_empty())
|
if (text.is_empty())
|
||||||
|
@ -608,8 +607,7 @@ String InspectorClient::generate_dom_tree(JsonObject const& dom_tree)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == "comment"sv) {
|
if (type == "comment"sv) {
|
||||||
auto comment = node.get_byte_string("data"sv).release_value();
|
auto comment = escape_html_entities(*node.get_string("data"sv));
|
||||||
comment = escape_html_entities(comment);
|
|
||||||
|
|
||||||
builder.appendff("<span class=\"hoverable comment\" {}>", data_attributes.string_view());
|
builder.appendff("<span class=\"hoverable comment\" {}>", data_attributes.string_view());
|
||||||
builder.append("<span><!--</span>"sv);
|
builder.append("<span><!--</span>"sv);
|
||||||
|
@ -620,7 +618,7 @@ String InspectorClient::generate_dom_tree(JsonObject const& dom_tree)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type == "shadow-root"sv) {
|
if (type == "shadow-root"sv) {
|
||||||
auto mode = node.get_byte_string("mode"sv).release_value();
|
auto mode = node.get_string("mode"sv).release_value();
|
||||||
|
|
||||||
builder.appendff("<span class=\"hoverable internal\" {}>", data_attributes.string_view());
|
builder.appendff("<span class=\"hoverable internal\" {}>", data_attributes.string_view());
|
||||||
builder.appendff("{} ({})", name, mode);
|
builder.appendff("{} ({})", name, mode);
|
||||||
|
@ -636,8 +634,8 @@ String InspectorClient::generate_dom_tree(JsonObject const& dom_tree)
|
||||||
m_body_or_frameset_node_id = node_id;
|
m_body_or_frameset_node_id = node_id;
|
||||||
|
|
||||||
auto tag = name;
|
auto tag = name;
|
||||||
if (node.get_byte_string("namespace"sv) == Web::Namespace::HTML.bytes_as_string_view())
|
if (node.get_string("namespace"sv) == Web::Namespace::HTML.bytes_as_string_view())
|
||||||
tag = tag.to_lowercase();
|
tag = MUST(tag.to_lowercase());
|
||||||
|
|
||||||
builder.appendff("<span class=\"hoverable\" {}>", data_attributes.string_view());
|
builder.appendff("<span class=\"hoverable\" {}>", data_attributes.string_view());
|
||||||
builder.append("<span><</span>"sv);
|
builder.append("<span><</span>"sv);
|
||||||
|
@ -693,12 +691,11 @@ String InspectorClient::generate_accessibility_tree(JsonObject const& accessibil
|
||||||
StringBuilder builder;
|
StringBuilder builder;
|
||||||
|
|
||||||
generate_tree(builder, accessibility_tree, [&](JsonObject const& node) {
|
generate_tree(builder, accessibility_tree, [&](JsonObject const& node) {
|
||||||
auto type = node.get_byte_string("type"sv).value_or("unknown"sv);
|
auto type = node.get_string("type"sv).value_or("unknown"_string);
|
||||||
auto role = node.get_byte_string("role"sv).value_or({});
|
auto role = node.get_string("role"sv).value_or({});
|
||||||
|
|
||||||
if (type == "text"sv) {
|
if (type == "text"sv) {
|
||||||
auto text = node.get_byte_string("text"sv).release_value();
|
auto text = escape_html_entities(*node.get_string("text"sv));
|
||||||
text = escape_html_entities(text);
|
|
||||||
|
|
||||||
builder.appendff("<span class=\"hoverable\">");
|
builder.appendff("<span class=\"hoverable\">");
|
||||||
builder.append(MUST(Web::Infra::strip_and_collapse_whitespace(text)));
|
builder.append(MUST(Web::Infra::strip_and_collapse_whitespace(text)));
|
||||||
|
@ -708,16 +705,16 @@ String InspectorClient::generate_accessibility_tree(JsonObject const& accessibil
|
||||||
|
|
||||||
if (type != "element"sv) {
|
if (type != "element"sv) {
|
||||||
builder.appendff("<span class=\"hoverable internal\">");
|
builder.appendff("<span class=\"hoverable internal\">");
|
||||||
builder.appendff(role.to_lowercase());
|
builder.appendff(MUST(role.to_lowercase()));
|
||||||
builder.append("</span>"sv);
|
builder.append("</span>"sv);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto name = node.get_byte_string("name"sv).value_or({});
|
auto name = node.get_string("name"sv).value_or({});
|
||||||
auto description = node.get_byte_string("description"sv).value_or({});
|
auto description = node.get_string("description"sv).value_or({});
|
||||||
|
|
||||||
builder.appendff("<span class=\"hoverable\">");
|
builder.appendff("<span class=\"hoverable\">");
|
||||||
builder.append(role.to_lowercase());
|
builder.append(MUST(role.to_lowercase()));
|
||||||
builder.appendff(" name: \"{}\", description: \"{}\"", name, description);
|
builder.appendff(" name: \"{}\", description: \"{}\"", name, description);
|
||||||
builder.append("</span>"sv);
|
builder.append("</span>"sv);
|
||||||
});
|
});
|
||||||
|
|
|
@ -29,8 +29,8 @@ namespace Web::ARIA {
|
||||||
JsonObject const& value_object = value.as_object();
|
JsonObject const& value_object = value.as_object();
|
||||||
|
|
||||||
auto class_definition_generator = generator.fork();
|
auto class_definition_generator = generator.fork();
|
||||||
class_definition_generator.set("spec_link"sv, value_object.get_byte_string("specLink"sv).value());
|
class_definition_generator.set("spec_link"sv, value_object.get_string("specLink"sv).release_value());
|
||||||
class_definition_generator.set("description"sv, value_object.get_byte_string("description"sv).value());
|
class_definition_generator.set("description"sv, value_object.get_string("description"sv).release_value());
|
||||||
class_definition_generator.set("name"sv, name);
|
class_definition_generator.set("name"sv, name);
|
||||||
class_definition_generator.append(R"~~~(
|
class_definition_generator.append(R"~~~(
|
||||||
// @spec_link@
|
// @spec_link@
|
||||||
|
|
|
@ -126,7 +126,7 @@ RefPtr<CalculationNode> Parser::parse_math_function(Function const& function, Ca
|
||||||
functions_data.for_each_member([&](auto& name, JsonValue const& value) -> void {
|
functions_data.for_each_member([&](auto& name, JsonValue const& value) -> void {
|
||||||
auto& function_data = value.as_object();
|
auto& function_data = value.as_object();
|
||||||
auto& parameters = function_data.get_array("parameters"sv).value();
|
auto& parameters = function_data.get_array("parameters"sv).value();
|
||||||
auto parameter_validation_rule = function_data.get_byte_string("parameter-validation"sv);
|
auto parameter_validation_rule = function_data.get_string("parameter-validation"sv);
|
||||||
bool requires_same_parameters = parameter_validation_rule.has_value() ? (parameter_validation_rule == "same"sv) : true;
|
bool requires_same_parameters = parameter_validation_rule.has_value() ? (parameter_validation_rule == "same"sv) : true;
|
||||||
|
|
||||||
auto function_generator = generator.fork();
|
auto function_generator = generator.fork();
|
||||||
|
@ -158,7 +158,7 @@ RefPtr<CalculationNode> Parser::parse_math_function(Function const& function, Ca
|
||||||
// Generate some type checks
|
// Generate some type checks
|
||||||
VERIFY(parameters.size() == 1);
|
VERIFY(parameters.size() == 1);
|
||||||
auto& parameter_data = parameters[0].as_object();
|
auto& parameter_data = parameters[0].as_object();
|
||||||
auto parameter_type_string = parameter_data.get_byte_string("type"sv).value();
|
auto parameter_type_string = parameter_data.get_string("type"sv).value();
|
||||||
function_generator.set("type_check", generate_calculation_type_check("argument_type"sv, parameter_type_string));
|
function_generator.set("type_check", generate_calculation_type_check("argument_type"sv, parameter_type_string));
|
||||||
function_generator.append(R"~~~(
|
function_generator.append(R"~~~(
|
||||||
if (!(@type_check@)) {
|
if (!(@type_check@)) {
|
||||||
|
@ -221,11 +221,11 @@ RefPtr<CalculationNode> Parser::parse_math_function(Function const& function, Ca
|
||||||
size_t parameter_index = 0;
|
size_t parameter_index = 0;
|
||||||
parameters.for_each([&](JsonValue const& parameter_value) {
|
parameters.for_each([&](JsonValue const& parameter_value) {
|
||||||
auto& parameter = parameter_value.as_object();
|
auto& parameter = parameter_value.as_object();
|
||||||
auto parameter_type_string = parameter.get_byte_string("type"sv).value();
|
auto parameter_type_string = parameter.get_string("type"sv).value();
|
||||||
auto parameter_required = parameter.get_bool("required"sv).value();
|
auto parameter_required = parameter.get_bool("required"sv).value();
|
||||||
|
|
||||||
auto parameter_generator = function_generator.fork();
|
auto parameter_generator = function_generator.fork();
|
||||||
parameter_generator.set("parameter_name", parameter.get_byte_string("name"sv).value());
|
parameter_generator.set("parameter_name", parameter.get_string("name"sv).value());
|
||||||
parameter_generator.set("parameter_index", String::number(parameter_index));
|
parameter_generator.set("parameter_index", String::number(parameter_index));
|
||||||
|
|
||||||
bool parameter_is_calculation;
|
bool parameter_is_calculation;
|
||||||
|
@ -235,7 +235,7 @@ RefPtr<CalculationNode> Parser::parse_math_function(Function const& function, Ca
|
||||||
parameter_generator.set("parse_function", "parse_rounding_strategy(arguments[argument_index])"_string);
|
parameter_generator.set("parse_function", "parse_rounding_strategy(arguments[argument_index])"_string);
|
||||||
parameter_generator.set("check_function", ".has_value()"_string);
|
parameter_generator.set("check_function", ".has_value()"_string);
|
||||||
parameter_generator.set("release_function", ".release_value()"_string);
|
parameter_generator.set("release_function", ".release_value()"_string);
|
||||||
if (auto default_value = parameter.get_byte_string("default"sv); default_value.has_value()) {
|
if (auto default_value = parameter.get_string("default"sv); default_value.has_value()) {
|
||||||
parameter_generator.set("parameter_default", MUST(String::formatted(" = RoundingStrategy::{}", title_casify(default_value.value()))));
|
parameter_generator.set("parameter_default", MUST(String::formatted(" = RoundingStrategy::{}", title_casify(default_value.value()))));
|
||||||
} else {
|
} else {
|
||||||
parameter_generator.set("parameter_default", ""_string);
|
parameter_generator.set("parameter_default", ""_string);
|
||||||
|
@ -250,7 +250,7 @@ RefPtr<CalculationNode> Parser::parse_math_function(Function const& function, Ca
|
||||||
|
|
||||||
// NOTE: We have exactly one default value in the data right now, and it's a `<calc-constant>`,
|
// NOTE: We have exactly one default value in the data right now, and it's a `<calc-constant>`,
|
||||||
// so that's all we handle.
|
// so that's all we handle.
|
||||||
if (auto default_value = parameter.get_byte_string("default"sv); default_value.has_value()) {
|
if (auto default_value = parameter.get_string("default"sv); default_value.has_value()) {
|
||||||
parameter_generator.set("parameter_default", MUST(String::formatted(" = ConstantCalculationNode::create(CalculationNode::constant_type_from_string(\"{}\"sv).value())", default_value.value())));
|
parameter_generator.set("parameter_default", MUST(String::formatted(" = ConstantCalculationNode::create(CalculationNode::constant_type_from_string(\"{}\"sv).value())", default_value.value())));
|
||||||
} else {
|
} else {
|
||||||
parameter_generator.set("parameter_default", ""_string);
|
parameter_generator.set("parameter_default", ""_string);
|
||||||
|
@ -343,7 +343,7 @@ RefPtr<CalculationNode> Parser::parse_math_function(Function const& function, Ca
|
||||||
parameter_index = 0;
|
parameter_index = 0;
|
||||||
parameters.for_each([&](JsonValue const& parameter_value) {
|
parameters.for_each([&](JsonValue const& parameter_value) {
|
||||||
auto& parameter = parameter_value.as_object();
|
auto& parameter = parameter_value.as_object();
|
||||||
auto parameter_type_string = parameter.get_byte_string("type"sv).value();
|
auto parameter_type_string = parameter.get_string("type"sv).value();
|
||||||
|
|
||||||
auto parameter_generator = function_generator.fork();
|
auto parameter_generator = function_generator.fork();
|
||||||
parameter_generator.set("parameter_index"sv, String::number(parameter_index));
|
parameter_generator.set("parameter_index"sv, String::number(parameter_index));
|
||||||
|
|
|
@ -140,9 +140,9 @@ bool media_feature_type_is_range(MediaFeatureID media_feature_id)
|
||||||
auto member_generator = generator.fork();
|
auto member_generator = generator.fork();
|
||||||
member_generator.set("name:titlecase", title_casify(name));
|
member_generator.set("name:titlecase", title_casify(name));
|
||||||
VERIFY(feature.has("type"sv));
|
VERIFY(feature.has("type"sv));
|
||||||
auto feature_type = feature.get_byte_string("type"sv);
|
auto feature_type = feature.get_string("type"sv);
|
||||||
VERIFY(feature_type.has_value());
|
VERIFY(feature_type.has_value());
|
||||||
member_generator.set("is_range", feature_type.value() == "range" ? "true"_string : "false"_string);
|
member_generator.set("is_range", feature_type.value() == "range"sv ? "true"_string : "false"_string);
|
||||||
member_generator.append(R"~~~(
|
member_generator.append(R"~~~(
|
||||||
case MediaFeatureID::@name:titlecase@:
|
case MediaFeatureID::@name:titlecase@:
|
||||||
return @is_range@;)~~~");
|
return @is_range@;)~~~");
|
||||||
|
|
|
@ -420,7 +420,7 @@ Optional<PropertyID> property_id_from_camel_case_string(StringView string)
|
||||||
auto member_generator = generator.fork();
|
auto member_generator = generator.fork();
|
||||||
member_generator.set("name", name);
|
member_generator.set("name", name);
|
||||||
member_generator.set("name:camelcase", camel_casify(name));
|
member_generator.set("name:camelcase", camel_casify(name));
|
||||||
if (auto legacy_alias_for = value.as_object().get_byte_string("legacy-alias-for"sv); legacy_alias_for.has_value()) {
|
if (auto legacy_alias_for = value.as_object().get_string("legacy-alias-for"sv); legacy_alias_for.has_value()) {
|
||||||
member_generator.set("name:titlecase", title_casify(legacy_alias_for.value()));
|
member_generator.set("name:titlecase", title_casify(legacy_alias_for.value()));
|
||||||
} else {
|
} else {
|
||||||
member_generator.set("name:titlecase", title_casify(name));
|
member_generator.set("name:titlecase", title_casify(name));
|
||||||
|
@ -449,7 +449,7 @@ Optional<PropertyID> property_id_from_string(StringView string)
|
||||||
|
|
||||||
auto member_generator = generator.fork();
|
auto member_generator = generator.fork();
|
||||||
member_generator.set("name", name);
|
member_generator.set("name", name);
|
||||||
if (auto legacy_alias_for = value.as_object().get_byte_string("legacy-alias-for"sv); legacy_alias_for.has_value()) {
|
if (auto legacy_alias_for = value.as_object().get_string("legacy-alias-for"sv); legacy_alias_for.has_value()) {
|
||||||
member_generator.set("name:titlecase", title_casify(legacy_alias_for.value()));
|
member_generator.set("name:titlecase", title_casify(legacy_alias_for.value()));
|
||||||
} else {
|
} else {
|
||||||
member_generator.set("name:titlecase", title_casify(name));
|
member_generator.set("name:titlecase", title_casify(name));
|
||||||
|
@ -552,7 +552,7 @@ AnimationType animation_type_from_longhand_property(PropertyID property_id)
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto animation_type = value.as_object().get_byte_string("animation-type"sv).value();
|
auto animation_type = value.as_object().get_string("animation-type"sv).value();
|
||||||
member_generator.set("value", title_casify(animation_type));
|
member_generator.set("value", title_casify(animation_type));
|
||||||
member_generator.append(R"~~~(
|
member_generator.append(R"~~~(
|
||||||
case PropertyID::@name:titlecase@:
|
case PropertyID::@name:titlecase@:
|
||||||
|
@ -681,7 +681,7 @@ NonnullRefPtr<CSSStyleValue> property_initial_value(PropertyID property_id)
|
||||||
dbgln("No initial value specified for property '{}'", name);
|
dbgln("No initial value specified for property '{}'", name);
|
||||||
VERIFY_NOT_REACHED();
|
VERIFY_NOT_REACHED();
|
||||||
}
|
}
|
||||||
auto initial_value = object.get_byte_string("initial"sv);
|
auto initial_value = object.get_string("initial"sv);
|
||||||
VERIFY(initial_value.has_value());
|
VERIFY(initial_value.has_value());
|
||||||
auto& initial_value_string = initial_value.value();
|
auto& initial_value_string = initial_value.value();
|
||||||
|
|
||||||
|
@ -921,7 +921,7 @@ Optional<ValueType> property_resolves_percentages_relative_to(PropertyID propert
|
||||||
if (is_legacy_alias(value.as_object()))
|
if (is_legacy_alias(value.as_object()))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (auto resolved_type = value.as_object().get_byte_string("percentages-resolve-to"sv); resolved_type.has_value()) {
|
if (auto resolved_type = value.as_object().get_string("percentages-resolve-to"sv); resolved_type.has_value()) {
|
||||||
auto property_generator = generator.fork();
|
auto property_generator = generator.fork();
|
||||||
property_generator.set("name:titlecase", title_casify(name));
|
property_generator.set("name:titlecase", title_casify(name));
|
||||||
property_generator.set("resolved_type:titlecase", title_casify(resolved_type.value()));
|
property_generator.set("resolved_type:titlecase", title_casify(resolved_type.value()));
|
||||||
|
@ -1057,7 +1057,7 @@ bool is_animatable_property(JsonObject& properties, StringView property_name)
|
||||||
auto property = properties.get_object(property_name);
|
auto property = properties.get_object(property_name);
|
||||||
VERIFY(property.has_value());
|
VERIFY(property.has_value());
|
||||||
|
|
||||||
if (auto animation_type = property.value().get_byte_string("animation-type"sv); animation_type.has_value()) {
|
if (auto animation_type = property.value().get_string("animation-type"sv); animation_type.has_value()) {
|
||||||
return animation_type != "none";
|
return animation_type != "none";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -149,14 +149,14 @@ PseudoClassMetadata pseudo_class_metadata(PseudoClass pseudo_class)
|
||||||
pseudo_classes_data.for_each_member([&](auto& name, JsonValue const& value) {
|
pseudo_classes_data.for_each_member([&](auto& name, JsonValue const& value) {
|
||||||
auto member_generator = generator.fork();
|
auto member_generator = generator.fork();
|
||||||
auto& pseudo_class = value.as_object();
|
auto& pseudo_class = value.as_object();
|
||||||
auto argument_string = pseudo_class.get_byte_string("argument"sv).value();
|
auto argument_string = pseudo_class.get_string("argument"sv).value();
|
||||||
|
|
||||||
bool is_valid_as_identifier = argument_string.is_empty();
|
bool is_valid_as_identifier = argument_string.is_empty();
|
||||||
bool is_valid_as_function = !argument_string.is_empty();
|
bool is_valid_as_function = !argument_string.is_empty();
|
||||||
|
|
||||||
if (argument_string.ends_with('?')) {
|
if (argument_string.ends_with('?')) {
|
||||||
is_valid_as_identifier = true;
|
is_valid_as_identifier = true;
|
||||||
argument_string = argument_string.substring(0, argument_string.length() - 1);
|
argument_string = MUST(argument_string.substring_from_byte_offset(0, argument_string.byte_count() - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
String parameter_type = "None"_string;
|
String parameter_type = "None"_string;
|
||||||
|
|
|
@ -6,14 +6,13 @@
|
||||||
|
|
||||||
#include <LibTest/TestCase.h>
|
#include <LibTest/TestCase.h>
|
||||||
|
|
||||||
#include <AK/ByteString.h>
|
|
||||||
#include <AK/JsonObject.h>
|
#include <AK/JsonObject.h>
|
||||||
#include <AK/JsonValue.h>
|
#include <AK/JsonValue.h>
|
||||||
#include <AK/StringBuilder.h>
|
#include <AK/StringBuilder.h>
|
||||||
|
|
||||||
TEST_CASE(load_form)
|
TEST_CASE(load_form)
|
||||||
{
|
{
|
||||||
ByteString raw_form_json = R"(
|
static constexpr auto raw_form_json = R"(
|
||||||
{
|
{
|
||||||
"name": "Form1",
|
"name": "Form1",
|
||||||
"widgets": [
|
"widgets": [
|
||||||
|
@ -33,13 +32,13 @@ TEST_CASE(load_form)
|
||||||
"visible":true
|
"visible":true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})";
|
})"sv;
|
||||||
|
|
||||||
JsonValue form_json = JsonValue::from_string(raw_form_json).value();
|
JsonValue form_json = JsonValue::from_string(raw_form_json).value();
|
||||||
|
|
||||||
EXPECT(form_json.is_object());
|
EXPECT(form_json.is_object());
|
||||||
|
|
||||||
auto name = form_json.as_object().get_byte_string("name"sv);
|
auto name = form_json.as_object().get_string("name"sv);
|
||||||
EXPECT(name.has_value());
|
EXPECT(name.has_value());
|
||||||
|
|
||||||
EXPECT_EQ(name.value(), "Form1");
|
EXPECT_EQ(name.value(), "Form1");
|
||||||
|
@ -49,7 +48,7 @@ TEST_CASE(load_form)
|
||||||
|
|
||||||
widgets->for_each([&](JsonValue const& widget_value) {
|
widgets->for_each([&](JsonValue const& widget_value) {
|
||||||
auto& widget_object = widget_value.as_object();
|
auto& widget_object = widget_value.as_object();
|
||||||
auto widget_class = widget_object.get_byte_string("class"sv).value();
|
auto widget_class = widget_object.get_string("class"sv).value();
|
||||||
widget_object.for_each_member([&]([[maybe_unused]] auto& property_name, [[maybe_unused]] JsonValue const& property_value) {
|
widget_object.for_each_member([&]([[maybe_unused]] auto& property_name, [[maybe_unused]] JsonValue const& property_value) {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -161,7 +160,7 @@ TEST_CASE(json_duplicate_keys)
|
||||||
json.set("test"sv, "foo"sv);
|
json.set("test"sv, "foo"sv);
|
||||||
json.set("test"sv, "bar"sv);
|
json.set("test"sv, "bar"sv);
|
||||||
json.set("test"sv, "baz"sv);
|
json.set("test"sv, "baz"sv);
|
||||||
EXPECT_EQ(json.to_byte_string(), "{\"test\":\"baz\"}");
|
EXPECT_EQ(json.serialized<StringBuilder>(), "{\"test\":\"baz\"}");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE(json_u64_roundtrip)
|
TEST_CASE(json_u64_roundtrip)
|
||||||
|
@ -346,12 +345,12 @@ private:
|
||||||
|
|
||||||
TEST_CASE(fallible_json_object_for_each)
|
TEST_CASE(fallible_json_object_for_each)
|
||||||
{
|
{
|
||||||
ByteString raw_json = R"(
|
static constexpr auto raw_json = R"(
|
||||||
{
|
{
|
||||||
"name": "anon",
|
"name": "anon",
|
||||||
"home": "/home/anon",
|
"home": "/home/anon",
|
||||||
"default_browser": "Ladybird"
|
"default_browser": "Ladybird"
|
||||||
})";
|
})"sv;
|
||||||
|
|
||||||
auto json = JsonValue::from_string(raw_json).value();
|
auto json = JsonValue::from_string(raw_json).value();
|
||||||
auto const& object = json.as_object();
|
auto const& object = json.as_object();
|
||||||
|
@ -386,12 +385,12 @@ TEST_CASE(fallible_json_object_for_each)
|
||||||
|
|
||||||
TEST_CASE(fallible_json_array_for_each)
|
TEST_CASE(fallible_json_array_for_each)
|
||||||
{
|
{
|
||||||
ByteString raw_json = R"(
|
static constexpr auto raw_json = R"(
|
||||||
[
|
[
|
||||||
"anon",
|
"anon",
|
||||||
"/home/anon",
|
"/home/anon",
|
||||||
"Ladybird"
|
"Ladybird"
|
||||||
])";
|
])"sv;
|
||||||
|
|
||||||
auto json = JsonValue::from_string(raw_json).value();
|
auto json = JsonValue::from_string(raw_json).value();
|
||||||
auto const& array = json.as_array();
|
auto const& array = json.as_array();
|
||||||
|
@ -543,7 +542,7 @@ TEST_CASE(json_array_serialize)
|
||||||
auto array = json_value.as_array();
|
auto array = json_value.as_array();
|
||||||
StringBuilder builder {};
|
StringBuilder builder {};
|
||||||
array.serialize(builder);
|
array.serialize(builder);
|
||||||
EXPECT_EQ(builder.to_byte_string(), raw_json);
|
EXPECT_EQ(builder.string_view(), raw_json);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE(json_array_values)
|
TEST_CASE(json_array_values)
|
||||||
|
|
|
@ -165,7 +165,7 @@ TESTJS_RUN_FILE_FUNCTION(ByteString const& test_file, JS::Realm& realm, JS::Exec
|
||||||
parse_succeeded = !Test::JS::parse_script(test_file, realm).is_error();
|
parse_succeeded = !Test::JS::parse_script(test_file, realm).is_error();
|
||||||
|
|
||||||
bool test_passed = true;
|
bool test_passed = true;
|
||||||
ByteString message;
|
String message;
|
||||||
String expectation_string;
|
String expectation_string;
|
||||||
|
|
||||||
switch (expectation) {
|
switch (expectation) {
|
||||||
|
@ -174,14 +174,14 @@ TESTJS_RUN_FILE_FUNCTION(ByteString const& test_file, JS::Realm& realm, JS::Exec
|
||||||
expectation_string = "File should not parse"_string;
|
expectation_string = "File should not parse"_string;
|
||||||
test_passed = !parse_succeeded;
|
test_passed = !parse_succeeded;
|
||||||
if (!test_passed)
|
if (!test_passed)
|
||||||
message = "Expected the file to fail parsing, but it did not";
|
message = "Expected the file to fail parsing, but it did not"_string;
|
||||||
break;
|
break;
|
||||||
case Pass:
|
case Pass:
|
||||||
case ExplicitPass:
|
case ExplicitPass:
|
||||||
expectation_string = "File should parse"_string;
|
expectation_string = "File should parse"_string;
|
||||||
test_passed = parse_succeeded;
|
test_passed = parse_succeeded;
|
||||||
if (!test_passed)
|
if (!test_passed)
|
||||||
message = "Expected the file to parse, but it did not";
|
message = "Expected the file to parse, but it did not"_string;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,6 +193,6 @@ TESTJS_RUN_FILE_FUNCTION(ByteString const& test_file, JS::Realm& realm, JS::Exec
|
||||||
{},
|
{},
|
||||||
duration_ms,
|
duration_ms,
|
||||||
test_result,
|
test_result,
|
||||||
{ Test::Suite { test_path, "Parse file"_string, test_result, { { move(expectation_string), test_result, message, static_cast<u64>(duration_ms) * 1000u } } } }
|
{ Test::Suite { test_path, "Parse file"_string, test_result, { { move(expectation_string), test_result, move(message), static_cast<u64>(duration_ms) * 1000u } } } }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -162,7 +162,7 @@ static ErrorOr<HashMap<size_t, TestResult>> run_test_files(Span<ByteString> file
|
||||||
auto result_object_or_error = parser.parse();
|
auto result_object_or_error = parser.parse();
|
||||||
if (!result_object_or_error.is_error() && result_object_or_error.value().is_object()) {
|
if (!result_object_or_error.is_error() && result_object_or_error.value().is_object()) {
|
||||||
auto& result_object = result_object_or_error.value().as_object();
|
auto& result_object = result_object_or_error.value().as_object();
|
||||||
if (auto result_string = result_object.get_byte_string("result"sv); result_string.has_value()) {
|
if (auto result_string = result_object.get_string("result"sv); result_string.has_value()) {
|
||||||
auto const& view = result_string.value();
|
auto const& view = result_string.value();
|
||||||
// Timeout and assert fail already are the result of the stopping test
|
// Timeout and assert fail already are the result of the stopping test
|
||||||
if (view == "timeout"sv || view == "assert_fail"sv) {
|
if (view == "timeout"sv || view == "assert_fail"sv) {
|
||||||
|
@ -320,7 +320,7 @@ void write_per_file(HashMap<size_t, TestResult> const& result_map, Vector<ByteSt
|
||||||
complete_results.set("duration"sv, time_taken_in_ms / 1000.);
|
complete_results.set("duration"sv, time_taken_in_ms / 1000.);
|
||||||
complete_results.set("results"sv, result_object);
|
complete_results.set("results"sv, result_object);
|
||||||
|
|
||||||
if (file->write_until_depleted(complete_results.to_byte_string()).is_error())
|
if (file->write_until_depleted(complete_results.to_string()).is_error())
|
||||||
warnln("Failed to write per-file");
|
warnln("Failed to write per-file");
|
||||||
file->close();
|
file->close();
|
||||||
}
|
}
|
||||||
|
|
|
@ -416,7 +416,7 @@ static bool verify_test(ErrorOr<void, TestError>& result, TestMetadata const& me
|
||||||
}
|
}
|
||||||
|
|
||||||
if (metadata.is_async && output.has("output"sv)) {
|
if (metadata.is_async && output.has("output"sv)) {
|
||||||
auto output_messages = output.get_byte_string("output"sv);
|
auto output_messages = output.get_string("output"sv);
|
||||||
VERIFY(output_messages.has_value());
|
VERIFY(output_messages.has_value());
|
||||||
if (output_messages->contains("AsyncTestFailure:InternalError: TODO("sv)) {
|
if (output_messages->contains("AsyncTestFailure:InternalError: TODO("sv)) {
|
||||||
output.set("todo_error"sv, true);
|
output.set("todo_error"sv, true);
|
||||||
|
@ -532,7 +532,7 @@ static bool g_in_assert = false;
|
||||||
assert_fail_result.set("assert_fail"sv, true);
|
assert_fail_result.set("assert_fail"sv, true);
|
||||||
assert_fail_result.set("result"sv, "assert_fail"sv);
|
assert_fail_result.set("result"sv, "assert_fail"sv);
|
||||||
assert_fail_result.set("output"sv, StringView { assert_failed_message, strlen(assert_failed_message) });
|
assert_fail_result.set("output"sv, StringView { assert_failed_message, strlen(assert_failed_message) });
|
||||||
outln(saved_stdout_fd, "RESULT {}{}", assert_fail_result.to_byte_string(), '\0');
|
outln(saved_stdout_fd, "RESULT {}{}", assert_fail_result.serialized<StringBuilder>(), '\0');
|
||||||
// (Attempt to) Ensure that messages are written before quitting.
|
// (Attempt to) Ensure that messages are written before quitting.
|
||||||
fflush(saved_stdout_fd);
|
fflush(saved_stdout_fd);
|
||||||
fflush(stderr);
|
fflush(stderr);
|
||||||
|
@ -733,7 +733,7 @@ int main(int argc, char** argv)
|
||||||
result_object.set("test"sv, path);
|
result_object.set("test"sv, path);
|
||||||
|
|
||||||
ScopeGuard output_guard = [&] {
|
ScopeGuard output_guard = [&] {
|
||||||
outln(saved_stdout_fd, "RESULT {}{}", result_object.to_byte_string(), '\0');
|
outln(saved_stdout_fd, "RESULT {}{}", result_object.serialized<StringBuilder>(), '\0');
|
||||||
fflush(saved_stdout_fd);
|
fflush(saved_stdout_fd);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue