LibDevTools: Share storage field descriptor creation

Storage actors all describe table columns with the same DevTools field
object shape. Extract a helper for constructing those objects so that
cookies, local storage, session storage, and soon IndexedDB, do not each
spell out the JSON fields by hand.
This commit is contained in:
Sam Atkins 2026-06-12 11:27:57 +01:00 committed by Jelle Raaijmakers
parent 61a53553ab
commit a3e85ada85
4 changed files with 39 additions and 40 deletions

View file

@ -270,37 +270,22 @@ void CookiesActor::handle_message(Message const& message)
void CookiesActor::get_fields(Message const& message)
{
enum class FieldState : u8 {
Immutable,
Editable,
Hidden,
Private,
};
auto make_field = [](StringView name, FieldState state) {
JsonObject field;
field.set("name"sv, name);
field.set("editable"sv, state == FieldState::Editable);
field.set("hidden"sv, state == FieldState::Hidden);
field.set("private"sv, state == FieldState::Private);
return field;
};
JsonArray fields;
fields.must_append(make_field("uniqueKey"sv, FieldState::Private));
fields.must_append(make_field("name"sv, FieldState::Editable));
fields.must_append(make_field("value"sv, FieldState::Editable));
fields.must_append(make_field("host"sv, FieldState::Editable));
fields.must_append(make_field("path"sv, FieldState::Editable));
fields.must_append(make_field("expires"sv, FieldState::Editable));
fields.must_append(make_field("size"sv, FieldState::Immutable));
fields.must_append(make_field("isHttpOnly"sv, FieldState::Editable));
fields.must_append(make_field("isSecure"sv, FieldState::Editable));
fields.must_append(make_field("sameSite"sv, FieldState::Immutable));
fields.must_append(make_field("lastAccessed"sv, FieldState::Immutable));
fields.must_append(make_field("creationTime"sv, FieldState::Hidden));
fields.must_append(make_field("updateTime"sv, FieldState::Hidden));
fields.must_append(make_field("hostOnly"sv, FieldState::Hidden));
fields.must_append(make_field("partitionKey"sv, FieldState::Immutable));
fields.must_append(define_storage_field("uniqueKey"sv, StorageFieldType::Private));
fields.must_append(define_storage_field("name"sv, StorageFieldType::Mutable));
fields.must_append(define_storage_field("value"sv, StorageFieldType::Mutable));
fields.must_append(define_storage_field("host"sv, StorageFieldType::Mutable));
fields.must_append(define_storage_field("path"sv, StorageFieldType::Mutable));
fields.must_append(define_storage_field("expires"sv, StorageFieldType::Mutable));
fields.must_append(define_storage_field("size"sv, StorageFieldType::Immutable));
fields.must_append(define_storage_field("isHttpOnly"sv, StorageFieldType::Mutable));
fields.must_append(define_storage_field("isSecure"sv, StorageFieldType::Mutable));
fields.must_append(define_storage_field("sameSite"sv, StorageFieldType::Immutable));
fields.must_append(define_storage_field("lastAccessed"sv, StorageFieldType::Immutable));
fields.must_append(define_storage_field("creationTime"sv, StorageFieldType::Hidden));
fields.must_append(define_storage_field("updateTime"sv, StorageFieldType::Hidden));
fields.must_append(define_storage_field("hostOnly"sv, StorageFieldType::Hidden));
fields.must_append(define_storage_field("partitionKey"sv, StorageFieldType::Immutable));
JsonObject response;
response.set("value"sv, move(fields));

View file

@ -17,14 +17,6 @@ namespace DevTools {
static constexpr auto max_store_object_count = 50uz;
static JsonObject storage_field(StringView name)
{
JsonObject field;
field.set("name"sv, name);
field.set("editable"sv, true);
return field;
}
static JsonObject serialize_storage_item(DevToolsDelegate::StorageItem const& item)
{
JsonObject object;
@ -161,8 +153,8 @@ void StorageActor::handle_message(Message const& message)
void StorageActor::get_fields(Message const& message)
{
JsonArray fields;
fields.must_append(storage_field("name"sv));
fields.must_append(storage_field("value"sv));
fields.must_append(define_storage_field("name"sv, StorageFieldType::Mutable));
fields.must_append(define_storage_field("value"sv, StorageFieldType::Mutable));
JsonObject response;
response.set("value"sv, move(fields));

View file

@ -11,6 +11,20 @@
namespace DevTools {
JsonObject define_storage_field(StringView name, StorageFieldType state)
{
JsonObject field;
field.set("name"sv, name);
field.set("editable"sv, state == StorageFieldType::Mutable);
if (state == StorageFieldType::Hidden)
field.set("hidden"sv, true);
else if (state == StorageFieldType::Private)
field.set("private"sv, true);
return field;
}
Optional<String> storage_host_for_url(String const& url_string)
{
auto url = URL::Parser::basic_parse(url_string);

View file

@ -17,6 +17,14 @@ namespace DevTools {
DEVTOOLS_API Optional<String> storage_host_for_url(String const&);
DEVTOOLS_API Optional<String> storage_host_name(String const&);
enum class StorageFieldType : u8 {
Immutable,
Mutable,
Hidden,
Private,
};
JsonObject define_storage_field(StringView name, StorageFieldType);
JsonObject to_storage_operation_result(Optional<String> const& error_string);
JsonObject to_storage_operation_result(ErrorOr<void> const& result);