Skip to content

Commit 6ef5ed6

Browse files
authored
Refactor FXIOS-12796 [Swift 6 Migration] Address several global shared singleton warnings (#30314)
* Annotate global singleton types as @unchecked Sendable with FIXMEs. * Make some global singleton types actually Sendable. * Fix a few more Sendable types. * Fix some random warnings on the repo when strict checking is off to resolve warning count issues in Bitrise. * Fix for unit test that didn't make much sense (?) and had a concurrency error.
1 parent cd3ef61 commit 6ef5ed6

File tree

16 files changed

+43
-29
lines changed

16 files changed

+43
-29
lines changed

firefox-ios/Client/Application/WebServer.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ protocol WebServerProtocol {
1313
func start() throws -> Bool
1414
}
1515

16-
class WebServer: WebServerProtocol {
17-
private var logger: Logger
16+
// FIXME: FXIOS-13989 Make truly thread safe
17+
final class WebServer: WebServerProtocol, @unchecked Sendable {
18+
private let logger: Logger
1819
static let WebServerSharedInstance = WebServer()
1920

2021
class var sharedInstance: WebServer {

firefox-ios/Client/ContentBlocker/TrackingProtectionPageStats.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ struct TPPageStats {
4141
}
4242
}
4343

44-
class TPStatsBlocklistChecker {
44+
// FIXME: FXIOS-13985 Make truly thread safe
45+
class TPStatsBlocklistChecker: @unchecked Sendable {
4546
static let shared = TPStatsBlocklistChecker()
4647

4748
// Initialized async, is non-nil when ready to be used.

firefox-ios/Client/FeatureFlags/LegacyFeatureFlagsManager.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ enum FlaggableFeatureCheckOptions {
2626
case userOnly
2727
}
2828

29-
class LegacyFeatureFlagsManager: HasNimbusFeatureFlags {
29+
// FIXME: FXIOS-13986 Make truly thread safe
30+
class LegacyFeatureFlagsManager: HasNimbusFeatureFlags, @unchecked Sendable {
3031
/// This Singleton should only be accessed directly in places where the
3132
/// `FeatureFlaggable` is not available. Otherwise, access to the feature
3233
/// flags system should be done through the protocol, giving access to the

firefox-ios/Client/Frontend/Browser/SearchEngines/DefaultSearchEngineProvider.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import Common
77

88
typealias SearchEngineCompletion = @MainActor @Sendable (SearchEnginePrefs, [OpenSearchEngine]) -> Void
99

10-
protocol SearchEngineProvider {
10+
protocol SearchEngineProvider: Sendable {
1111
/// Takes a list of custom search engines (added by the user) along with an ordered
1212
/// engine name list (to provide sorting) which is stored in Prefs, and returns a
1313
/// a final list of search engines.
@@ -38,7 +38,7 @@ struct SearchEnginePrefs {
3838
let version: SearchEngineOrderingPrefsVersion
3939
}
4040

41-
class DefaultSearchEngineProvider: SearchEngineProvider {
41+
final class DefaultSearchEngineProvider: SearchEngineProvider {
4242
private let logger: Logger
4343

4444
init(logger: Logger = DefaultLogger.shared) {
@@ -101,7 +101,7 @@ class DefaultSearchEngineProvider: SearchEngineProvider {
101101

102102
private func getUnorderedBundledEnginesFor(locale: Locale,
103103
possibleLanguageIdentifier: [String],
104-
completion: @escaping ([OpenSearchEngine]) -> Void ) {
104+
completion: @escaping @Sendable ([OpenSearchEngine]) -> Void ) {
105105
let region = locale.regionCode ?? "US"
106106
let parser = OpenSearchParser(pluginMode: true)
107107

firefox-ios/Client/Frontend/Browser/SearchEngines/OpenSearchParser.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import Fuzi
1010
/// the Firefox-specific search plugin format.
1111
///
1212
/// OpenSearch spec: http://www.opensearch.org/Specifications/OpenSearch/1.1
13-
class OpenSearchParser {
13+
final class OpenSearchParser: Sendable {
1414
private let pluginMode: Bool
1515
private let userInterfaceIdiom: UIUserInterfaceIdiom
1616
private let typeSearch = "text/html"

firefox-ios/Client/Frontend/Browser/SearchEngines/SearchEnginesManager.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ class SearchEnginesManager: SearchEnginesManagerProvider {
291291
}
292292
}
293293

294-
func deleteCustomEngine(_ engine: OpenSearchEngine, completion: @escaping () -> Void) {
294+
func deleteCustomEngine(_ engine: OpenSearchEngine, completion: @escaping @Sendable () -> Void) {
295295
// We can't delete a preinstalled engine or an engine that is currently the default.
296296
guard engine.isCustomEngine && !isEngineDefault(engine) else { return }
297297

firefox-ios/Client/Frontend/Settings/SearchSettingsTableViewController.swift

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -635,11 +635,14 @@ final class SearchSettingsTableViewController: ThemedTableViewController, Featur
635635
let index = indexPath.item + 1
636636
let engine = model.orderedEngines[index]
637637

638-
model.deleteCustomEngine(engine) { [weak self] in
639-
tableView.deleteRows(at: [indexPath], with: .right)
640-
// Change navigationItem's right button item title to Edit and disable the edit button
641-
// once the deletion is done
642-
self?.setEditing(false, animated: true)
638+
model.deleteCustomEngine(engine) {
639+
ensureMainThread { [weak self] in
640+
self?.tableView.deleteRows(at: [indexPath], with: .right)
641+
642+
// Change navigationItem's right button item title to Edit and disable the edit button
643+
// once the deletion is done
644+
self?.setEditing(false, animated: true)
645+
}
643646
}
644647

645648
// End editing if we are no longer edit since we've deleted all editable cells.

firefox-ios/Client/Frontend/TrackingProtection/TrackingProtectionViewController.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,9 @@ class TrackingProtectionViewController: UIViewController,
197197
updateBlockedTrackersCount()
198198
updateConnectionStatus()
199199
applyTheme()
200-
getCertificates(for: model.url) { [weak self] certificates in
200+
getCertificates(for: model.url) { certificates in
201201
if let certificates {
202-
ensureMainThread {
202+
ensureMainThread { [weak self] in
203203
self?.model.certificates = certificates
204204
}
205205
}

firefox-ios/Client/Nimbus/NimbusFeatureFlagLayer.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
import Foundation
66

7-
final class NimbusFeatureFlagLayer {
7+
final class NimbusFeatureFlagLayer: Sendable {
88
// MARK: - Public methods
99
public func checkNimbusConfigFor(_ featureID: NimbusFeatureFlagID,
1010
from nimbus: FxNimbus = FxNimbus.shared

firefox-ios/Client/Nimbus/NimbusManager.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,16 @@ extension HasNimbusSearchBar {
2020
}
2121
}
2222

23-
class NimbusManager {
23+
final class NimbusManager: Sendable {
2424
// MARK: - Singleton
2525

2626
/// To help with access control, we should use protocols to access the required
2727
/// layers. `.shared` should, ideally, never be directly accessed.
2828
static let shared = NimbusManager()
2929

3030
// MARK: - Properties
31-
var featureFlagLayer: NimbusFeatureFlagLayer
32-
var bottomSearchBarLayer: NimbusSearchBarLayer
31+
let featureFlagLayer: NimbusFeatureFlagLayer
32+
let bottomSearchBarLayer: NimbusSearchBarLayer
3333

3434
init(with featureFlagLayer: NimbusFeatureFlagLayer = NimbusFeatureFlagLayer(),
3535
bottomSearchBarLayer: NimbusSearchBarLayer = NimbusSearchBarLayer()

0 commit comments

Comments
 (0)