mirror of
				https://github.com/LadybirdBrowser/ladybird.git
				synced 2025-10-31 13:20:59 +00:00 
			
		
		
		
	 9b79a686eb
			
		
	
	
		9b79a686eb
		
	
	
	
	
		
			
			The main motivation behind this is to remove JS specifics of the Realm from the implementation of the Heap. As a side effect of this change, this is a bit nicer to read than the previous approach, and in my opinion, also makes it a little more clear that this method is specific to a JavaScript Realm.
		
			
				
	
	
		
			78 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2024, stelar7 <dudedbz@gmail.com>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #include <LibWeb/IndexedDB/Internal/ConnectionQueueHandler.h>
 | |
| #include <LibWeb/IndexedDB/Internal/Database.h>
 | |
| 
 | |
| namespace Web::IndexedDB {
 | |
| 
 | |
| using IDBDatabaseMapping = HashMap<StorageAPI::StorageKey, HashMap<String, JS::Handle<Database>>>;
 | |
| static IDBDatabaseMapping m_databases;
 | |
| 
 | |
| JS_DEFINE_ALLOCATOR(Database);
 | |
| 
 | |
| Database::~Database() = default;
 | |
| 
 | |
| JS::NonnullGCPtr<Database> Database::create(JS::Realm& realm, String const& name)
 | |
| {
 | |
|     return realm.create<Database>(realm, name);
 | |
| }
 | |
| 
 | |
| void Database::visit_edges(Visitor& visitor)
 | |
| {
 | |
|     Base::visit_edges(visitor);
 | |
|     visitor.visit(m_associated_connections);
 | |
| }
 | |
| 
 | |
| ConnectionQueue& ConnectionQueueHandler::for_key_and_name(StorageAPI::StorageKey& key, String& name)
 | |
| {
 | |
|     return ConnectionQueueHandler::the().m_open_requests.ensure(key, [] {
 | |
|                                                             return HashMap<String, ConnectionQueue>();
 | |
|                                                         })
 | |
|         .ensure(name, [] {
 | |
|             return ConnectionQueue();
 | |
|         });
 | |
| }
 | |
| 
 | |
| Optional<JS::Handle<Database>> Database::for_key_and_name(StorageAPI::StorageKey& key, String& name)
 | |
| {
 | |
|     return m_databases.ensure(key, [] {
 | |
|                           return HashMap<String, JS::Handle<Database>>();
 | |
|                       })
 | |
|         .get(name);
 | |
| }
 | |
| 
 | |
| ErrorOr<JS::Handle<Database>> Database::create_for_key_and_name(JS::Realm& realm, StorageAPI::StorageKey& key, String& name)
 | |
| {
 | |
|     auto database_mapping = TRY(m_databases.try_ensure(key, [] {
 | |
|         return HashMap<String, JS::Handle<Database>>();
 | |
|     }));
 | |
| 
 | |
|     return database_mapping.try_ensure(name, [&] {
 | |
|         return Database::create(realm, name);
 | |
|     });
 | |
| }
 | |
| 
 | |
| ErrorOr<void> Database::delete_for_key_and_name(StorageAPI::StorageKey& key, String& name)
 | |
| {
 | |
|     // FIXME: Is a missing entry a failure?
 | |
|     auto maybe_database_mapping = m_databases.get(key);
 | |
|     if (!maybe_database_mapping.has_value())
 | |
|         return {};
 | |
| 
 | |
|     auto& database_mapping = maybe_database_mapping.value();
 | |
|     auto maybe_database = database_mapping.get(name);
 | |
|     if (!maybe_database.has_value())
 | |
|         return {};
 | |
| 
 | |
|     auto did_remove = database_mapping.remove(name);
 | |
|     if (!did_remove)
 | |
|         return {};
 | |
| 
 | |
|     return {};
 | |
| }
 | |
| 
 | |
| }
 |