From 4aa6be1baed1875ab997867ec9c2b1ae0e27ac91 Mon Sep 17 00:00:00 2001 From: brave-builds <45370463+brave-builds@users.noreply.github.com> Date: Tue, 8 Oct 2024 22:37:34 +0200 Subject: [PATCH] [iOS] Fix potential crash when launching the app from a shortcuts widget (uplift to 1.71.x) (#25866) Uplift of #25862 (squashed) to beta --- .../BrowserViewController.swift | 9 ++++++++- .../Browser/Search/SearchEngines.swift | 19 ++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BrowserViewController.swift b/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BrowserViewController.swift index 2956017fca11..0dcf758480e7 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BrowserViewController.swift +++ b/ios/brave-ios/Sources/Brave/Frontend/Browser/BrowserViewController/BrowserViewController.swift @@ -3417,7 +3417,14 @@ extension BrowserViewController { } executeAfterSetup { - NavigationPath.handle(nav: path, with: self) + Task { @MainActor in + if self.profile.searchEngines.orderedEngines.isEmpty { + // Wait until search engines are ready + await self.profile.searchEngines.waitForSearchEngines() + } + + NavigationPath.handle(nav: path, with: self) + } } } diff --git a/ios/brave-ios/Sources/Brave/Frontend/Browser/Search/SearchEngines.swift b/ios/brave-ios/Sources/Brave/Frontend/Browser/Search/SearchEngines.swift index 64297eb2b6c5..1d46c7494003 100644 --- a/ios/brave-ios/Sources/Brave/Frontend/Browser/Search/SearchEngines.swift +++ b/ios/brave-ios/Sources/Brave/Frontend/Browser/Search/SearchEngines.swift @@ -74,9 +74,15 @@ public class SearchEngines { setInitialDefaultEngine(engine.legacyName ?? engine.rawValue) } + private var loadingStream: AsyncStream? + public func loadSearchEngines() async { + let loading = AsyncStream.makeStream() + loadingStream = loading.stream + await loadCustomEngines() orderedEngines = await getOrderedEngines() + loading.continuation.yield() recordSearchEngineP3A() if let defaultEngine = defaultEngine(forType: .standard) { @@ -84,6 +90,17 @@ public class SearchEngines { } } + /// Waits until a previous call to `loadSearchEngines` completes + public func waitForSearchEngines() async { + if !orderedEngines.isEmpty { + return + } + guard let loadingStream else { return } + for await _ in loadingStream { + return + } + } + /// If no engine type is specified this method returns search engine for regular browsing. func defaultEngine(forType engineType: DefaultEngineType) -> OpenSearchEngine? { if let name = engineType.option.value, @@ -97,7 +114,7 @@ public class SearchEngines { let defaultEngineName = initialSearchEngines.defaultSearchEngine.rawValue let defaultEngine = orderedEngines.first(where: { $0.engineID == defaultEngineName }) - return defaultEngine ?? orderedEngines[0] + return defaultEngine ?? orderedEngines.first } /// Initialize default engine and set order of remaining search engines.