1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 20:27:45 +00:00

LibWeb: Implement URL.createObjectURL and URL.revokeObjectURL

This commit is contained in:
Timothy Flynn 2023-08-01 18:49:32 -04:00 committed by Linus Groh
parent dd36a0c12d
commit 9957d48f48
3 changed files with 40 additions and 0 deletions

View file

@ -10,6 +10,7 @@
#include <AK/IPv6Address.h>
#include <AK/URLParser.h>
#include <LibWeb/Bindings/Intrinsics.h>
#include <LibWeb/FileAPI/Blob.h>
#include <LibWeb/FileAPI/BlobURLStore.h>
#include <LibWeb/URL/URL.h>
@ -97,6 +98,38 @@ void URL::visit_edges(Cell::Visitor& visitor)
visitor.visit(m_query.ptr());
}
// https://w3c.github.io/FileAPI/#dfn-createObjectURL
WebIDL::ExceptionOr<String> URL::create_object_url(JS::VM& vm, JS::NonnullGCPtr<FileAPI::Blob> object)
{
// The createObjectURL(obj) static method must return the result of adding an entry to the blob URL store for obj.
return TRY_OR_THROW_OOM(vm, FileAPI::add_entry_to_blob_url_store(object));
}
// https://w3c.github.io/FileAPI/#dfn-revokeObjectURL
WebIDL::ExceptionOr<void> URL::revoke_object_url(JS::VM& vm, StringView url)
{
// 1. Let url record be the result of parsing url.
auto url_record = parse(url);
// 2. If url records scheme is not "blob", return.
if (url_record.scheme() != "blob"sv)
return {};
// 3. Let origin be the origin of url record.
auto origin = url_origin(url_record);
// 4. Let settings be the current settings object.
auto& settings = HTML::current_settings_object();
// 5. If origin is not same origin with settingss origin, return.
if (!origin.is_same_origin(settings.origin()))
return {};
// 6. Remove an entry from the Blob URL Store for url.
TRY_OR_THROW_OOM(vm, FileAPI::remove_entry_from_blob_url_store(url));
return {};
}
// https://url.spec.whatwg.org/#dom-url-canparse
bool URL::can_parse(JS::VM&, String const& url, Optional<String> const& base)
{