From c490033c5225b27891bc0f3c8d94408e423c263f Mon Sep 17 00:00:00 2001 From: Josh Matthews Date: Sat, 6 Sep 2025 02:55:20 -0400 Subject: [PATCH] indexeddb: Support enabling IndexedDB after startup (#39177) The servodriver harness requires preference-gated web platform features to be toggleable at any point in the browsing session's lifetime, rather than at startup. To support toggling IndexedDB, we need to ensure the IDB manager thread is always started. Testing: Verified when running `./mach test-wpt /IndexedDB --headless --product servodriver`. We don't run servodriver in CI yet. Fixes: #39175 --------- Signed-off-by: Josh Matthews --- components/net/indexeddb/idb_thread.rs | 3 --- components/script/dom/idbfactory.rs | 8 ++++++-- components/script/dom/idbopendbrequest.rs | 20 ++++++++++++++------ 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/components/net/indexeddb/idb_thread.rs b/components/net/indexeddb/idb_thread.rs index 57de888a71e..3cea4e948b9 100644 --- a/components/net/indexeddb/idb_thread.rs +++ b/components/net/indexeddb/idb_thread.rs @@ -224,9 +224,6 @@ impl IndexedDBManager { impl IndexedDBManager { fn start(&mut self) { - if !pref!(dom_indexeddb_enabled) { - return; - } loop { // FIXME:(arihant2math) No message *most likely* means that // the ipc sender has been dropped, so we break the look diff --git a/components/script/dom/idbfactory.rs b/components/script/dom/idbfactory.rs index da9d77c5320..39d801be1b9 100644 --- a/components/script/dom/idbfactory.rs +++ b/components/script/dom/idbfactory.rs @@ -58,7 +58,9 @@ impl IDBFactoryMethods for IDBFactory { let request = IDBOpenDBRequest::new(&self.global(), CanGc::note()); // Step 5: Runs in parallel - request.open_database(name, version); + if request.open_database(name, version).is_err() { + return Err(Error::Operation); + } // Step 6 Ok(request) @@ -81,7 +83,9 @@ impl IDBFactoryMethods for IDBFactory { let request = IDBOpenDBRequest::new(&self.global(), CanGc::note()); // Step 4: Runs in parallel - request.delete_database(name.to_string()); + if request.delete_database(name.to_string()).is_err() { + return Err(Error::Operation); + } // Step 5: Return request Ok(request) diff --git a/components/script/dom/idbopendbrequest.rs b/components/script/dom/idbopendbrequest.rs index 5373546f86c..62fe1b648b8 100644 --- a/components/script/dom/idbopendbrequest.rs +++ b/components/script/dom/idbopendbrequest.rs @@ -224,7 +224,7 @@ impl IDBOpenDBRequest { self.idbrequest.set_error(error, can_gc); } - pub fn open_database(&self, name: DOMString, version: Option) { + pub fn open_database(&self, name: DOMString, version: Option) -> Result<(), ()> { let global = self.global(); let (sender, receiver) = ipc::channel(global.time_profiler_chan().clone()).unwrap(); @@ -286,13 +286,17 @@ impl IDBOpenDBRequest { }), ); - global + if global .resource_threads() .send(IndexedDBThreadMsg::Sync(open_operation)) - .unwrap(); + .is_err() + { + return Err(()); + } + Ok(()) } - pub fn delete_database(&self, name: String) { + pub fn delete_database(&self, name: String) -> Result<(), ()> { let global = self.global(); let (sender, receiver) = ipc::channel(global.time_profiler_chan().clone()).unwrap(); @@ -317,10 +321,14 @@ impl IDBOpenDBRequest { }), ); - global + if global .resource_threads() .send(IndexedDBThreadMsg::Sync(delete_operation)) - .unwrap(); + .is_err() + { + return Err(()); + } + Ok(()) } pub fn dispatch_success(&self, result: &IDBDatabase) {