mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 20:32:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			92 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
	
		
			2.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | ||
|  * Copyright (c) 2023, Tim Flynn <trflynn89@serenityos.org>
 | ||
|  *
 | ||
|  * SPDX-License-Identifier: BSD-2-Clause
 | ||
|  */
 | ||
| 
 | ||
| #include <AK/StringBuilder.h>
 | ||
| #include <AK/URL.h>
 | ||
| #include <LibWeb/Crypto/Crypto.h>
 | ||
| #include <LibWeb/FileAPI/Blob.h>
 | ||
| #include <LibWeb/FileAPI/BlobURLStore.h>
 | ||
| #include <LibWeb/HTML/Origin.h>
 | ||
| #include <LibWeb/HTML/Scripting/Environments.h>
 | ||
| 
 | ||
| namespace Web::FileAPI {
 | ||
| 
 | ||
| BlobURLStore& blob_url_store()
 | ||
| {
 | ||
|     static HashMap<String, BlobURLEntry> store;
 | ||
|     return store;
 | ||
| }
 | ||
| 
 | ||
| // https://w3c.github.io/FileAPI/#unicodeBlobURL
 | ||
| ErrorOr<String> 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<String> add_entry_to_blob_url_store(JS::NonnullGCPtr<Blob> 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<void> 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 }.to_string());
 | ||
| 
 | ||
|     // 3. Remove store[url string].
 | ||
|     store.remove(url_string);
 | ||
|     return {};
 | ||
| }
 | ||
| 
 | ||
| }
 | 
