/* * Copyright (c) 2023, Tim Flynn * Copyright (c) 2024, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include #include namespace Web::FileAPI { BlobURLStore& blob_url_store() { static HashMap store; return store; } // https://w3c.github.io/FileAPI/#unicodeBlobURL ErrorOr generate_new_blob_url() { // 1. Let result be the empty string. StringBuilder result; // 2. Append the string "blob:" to result. TRY(result.try_append("blob:"sv)); // 3. Let settings be the current settings object auto& settings = HTML::current_settings_object(); // 4. Let origin be settings’s origin. auto origin = settings.origin(); // 5. Let serialized be the ASCII serialization of origin. auto serialized = origin.serialize(); // 6. If serialized is "null", set it to an implementation-defined value. if (serialized == "null"sv) serialized = "ladybird"sv; // 7. Append serialized to result. TRY(result.try_append(serialized)); // 8. Append U+0024 SOLIDUS (/) to result. TRY(result.try_append('/')); // 9. Generate a UUID [RFC4122] as a string and append it to result. auto uuid = TRY(Crypto::generate_random_uuid()); TRY(result.try_append(uuid)); // 10. Return result. return result.to_string(); } // https://w3c.github.io/FileAPI/#add-an-entry ErrorOr add_entry_to_blob_url_store(JS::NonnullGCPtr object) { // 1. Let store be the user agent’s blob URL store. auto& store = blob_url_store(); // 2. Let url be the result of generating a new blob URL. auto url = TRY(generate_new_blob_url()); // 3. Let entry be a new blob URL entry consisting of object and the current settings object. BlobURLEntry entry { object, HTML::current_settings_object() }; // 4. Set store[url] to entry. TRY(store.try_set(url, move(entry))); // 5. Return url. return url; } // https://w3c.github.io/FileAPI/#removeTheEntry ErrorOr remove_entry_from_blob_url_store(StringView url) { // 1. Let store be the user agent’s blob URL store; auto& store = blob_url_store(); // 2. Let url string be the result of serializing url. auto url_string = TRY(URL::URL { url }.to_string()); // 3. Remove store[url string]. store.remove(url_string); return {}; } // https://w3c.github.io/FileAPI/#lifeTime void run_unloading_cleanup_steps(JS::NonnullGCPtr document) { // 1. Let environment be the Document's relevant settings object. auto& environment = document->relevant_settings_object(); // 2. Let store be the user agent’s blob URL store; auto& store = FileAPI::blob_url_store(); // 3. Remove from store any entries for which the value's environment is equal to environment. store.remove_all_matching([&](auto&, auto& value) { return value.environment == &environment; }); } }