Selaa lähdekoodia

LibWeb: Implement URL.createObjectURL and URL.revokeObjectURL

Timothy Flynn 2 vuotta sitten
vanhempi
commit
9957d48f48

+ 33 - 0
Userland/Libraries/LibWeb/URL/URL.cpp

@@ -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 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<String> const& base)
 {

+ 3 - 0
Userland/Libraries/LibWeb/URL/URL.h

@@ -24,6 +24,9 @@ public:
 
     virtual ~URL() override;
 
+    static WebIDL::ExceptionOr<String> create_object_url(JS::VM&, JS::NonnullGCPtr<FileAPI::Blob> object);
+    static WebIDL::ExceptionOr<void> revoke_object_url(JS::VM&, StringView url);
+
     static bool can_parse(JS::VM&, String const& url, Optional<String> const& base = {});
 
     WebIDL::ExceptionOr<String> href() const;

+ 4 - 0
Userland/Libraries/LibWeb/URL/URL.idl

@@ -1,3 +1,4 @@
+#import <FileAPI/Blob.idl>
 #import <URL/URLSearchParams.idl>
 
 // 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);
 };