ladybird/Libraries/LibWeb/StorageAPI/StorageKey.cpp
2026-04-14 18:43:28 +02:00

73 lines
2.3 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* Copyright (c) 2024, Andrew Kaster <andrew@ladybird.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
#include <LibIPC/Decoder.h>
#include <LibIPC/Encoder.h>
#include <LibWeb/DOMURL/DOMURL.h>
#include <LibWeb/HTML/Scripting/Environments.h>
#include <LibWeb/StorageAPI/StorageKey.h>
namespace Web::StorageAPI {
// https://storage.spec.whatwg.org/#obtain-a-storage-key
Optional<StorageKey> obtain_a_storage_key(HTML::Environment const& environment)
{
// 1. Let key be the result of running obtain a storage key for non-storage purposes with environment.
auto key = obtain_a_storage_key_for_non_storage_purposes(environment);
// AD-HOC: file:// URLs are opaque, but other browsers support storage on file:// URLs.
if (key.origin.is_opaque_file_origin())
key.origin = URL::Origin { "file"_string, String {}, {} };
// 2. If keys origin is an opaque origin, then return failure.
if (key.origin.is_opaque())
return {};
// FIXME: 3. If the user has disabled storage, then return failure.
// 4. Return key.
return key;
}
StorageKey obtain_a_storage_key_for_non_storage_purposes(URL::Origin const& origin)
{
// NOTE: This function exists as there are cases where we don't have the full environment object, but we still need to obtain a storage key.
return { origin };
}
// https://storage.spec.whatwg.org/#obtain-a-storage-key-for-non-storage-purposes
StorageKey obtain_a_storage_key_for_non_storage_purposes(HTML::Environment const& environment)
{
// 1. Let origin be environments origin if environment is an environment settings object; otherwise environments creation URLs origin.
auto origin = [&]() {
if (auto const* settings = as_if<HTML::EnvironmentSettingsObject>(environment))
return settings->origin();
return environment.creation_url.origin();
}();
// 2. Return a tuple consisting of origin.
return { move(origin) };
}
}
namespace IPC {
template<>
ErrorOr<void> encode(Encoder& encoder, Web::StorageAPI::StorageKey const& key)
{
TRY(encoder.encode(key.origin));
return {};
}
template<>
ErrorOr<Web::StorageAPI::StorageKey> decode(Decoder& decoder)
{
auto origin = TRY(decoder.decode<URL::Origin>());
return Web::StorageAPI::StorageKey { move(origin) };
}
}