From 9957d48f4812e1d502e506b5b45d180230d85e6f Mon Sep 17 00:00:00 2001 From: Timothy Flynn Date: Tue, 1 Aug 2023 18:49:32 -0400 Subject: [PATCH] LibWeb: Implement URL.createObjectURL and URL.revokeObjectURL --- Userland/Libraries/LibWeb/URL/URL.cpp | 33 +++++++++++++++++++++++++++ Userland/Libraries/LibWeb/URL/URL.h | 3 +++ Userland/Libraries/LibWeb/URL/URL.idl | 4 ++++ 3 files changed, 40 insertions(+) diff --git a/Userland/Libraries/LibWeb/URL/URL.cpp b/Userland/Libraries/LibWeb/URL/URL.cpp index 076e1ad87f..207d404721 100644 --- a/Userland/Libraries/LibWeb/URL/URL.cpp +++ b/Userland/Libraries/LibWeb/URL/URL.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -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 URL::create_object_url(JS::VM& vm, JS::NonnullGCPtr 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 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 record’s 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 settings’s 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 const& base) { diff --git a/Userland/Libraries/LibWeb/URL/URL.h b/Userland/Libraries/LibWeb/URL/URL.h index 32cdf99343..da2e105a84 100644 --- a/Userland/Libraries/LibWeb/URL/URL.h +++ b/Userland/Libraries/LibWeb/URL/URL.h @@ -24,6 +24,9 @@ public: virtual ~URL() override; + static WebIDL::ExceptionOr create_object_url(JS::VM&, JS::NonnullGCPtr object); + static WebIDL::ExceptionOr revoke_object_url(JS::VM&, StringView url); + static bool can_parse(JS::VM&, String const& url, Optional const& base = {}); WebIDL::ExceptionOr href() const; diff --git a/Userland/Libraries/LibWeb/URL/URL.idl b/Userland/Libraries/LibWeb/URL/URL.idl index 702e551c1a..fa8a4f980e 100644 --- a/Userland/Libraries/LibWeb/URL/URL.idl +++ b/Userland/Libraries/LibWeb/URL/URL.idl @@ -1,3 +1,4 @@ +#import #import // https://url.spec.whatwg.org/#url @@ -21,4 +22,7 @@ interface URL { attribute USVString hash; USVString toJSON(); + + static DOMString createObjectURL(Blob obj); // FIXME: Should be (Blob or MediaSource). + static undefined revokeObjectURL(DOMString url); };