Skip to content
This repository was archived by the owner on May 10, 2024. It is now read-only.

Commit 9644a66

Browse files
StephenHeapsBrandon-T
authored andcommitted
Isolate Tab to MainActor and Update all Script Injection to be Async-Await
1 parent d9df510 commit 9644a66

File tree

67 files changed

+595
-548
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+595
-548
lines changed

Diff for: App/Client.xcodeproj/xcshareddata/xcschemes/ActionExtension.xcscheme

-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@
7373
savedToolIdentifier = ""
7474
useCustomWorkingDirectory = "NO"
7575
debugDocumentVersioning = "YES"
76-
askForAppToLaunch = "Yes"
7776
launchAutomaticallySubstyle = "2">
7877
<BuildableProductRunnable
7978
runnableDebuggingMode = "0">

Diff for: Sources/Brave/BraveSkus/BraveSkusManager.swift

+69-72
Original file line numberDiff line numberDiff line change
@@ -39,98 +39,95 @@ public class BraveSkusManager {
3939
return
4040
}
4141

42-
manager.credentialSummary(for: domain) { completion in
42+
Task {
43+
_ = await manager.credentialSummary(for: domain)
4344
Logger.module.debug("credentialSummary response")
4445
}
4546
}
4647

4748
// MARK: - Handling SKU methods.
4849

49-
func refreshOrder(for orderId: String, domain: String, resultJSON: @escaping (Any?) -> Void) {
50-
sku.refreshOrder(domain, orderId: orderId) { completion in
51-
do {
52-
guard let data = completion.data(using: .utf8) else { return }
53-
let json = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed)
54-
Logger.module.debug("refreshOrder json parsed successfully")
55-
resultJSON(json)
56-
} catch {
57-
resultJSON(nil)
58-
Logger.module.error("refrshOrder: Failed to decode json: \(error.localizedDescription)")
59-
}
50+
func refreshOrder(for orderId: String, domain: String) async -> Any? {
51+
let response = await sku.refreshOrder(domain, orderId: orderId)
52+
53+
do {
54+
guard let data = response.data(using: .utf8) else { return nil }
55+
let json = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed)
56+
Logger.module.debug("refreshOrder json parsed successfully")
57+
return json
58+
} catch {
59+
Logger.module.error("refrshOrder: Failed to decode json: \(error.localizedDescription)")
60+
return nil
6061
}
6162
}
6263

63-
func fetchOrderCredentials(for orderId: String, domain: String, resultCredential: @escaping (String) -> Void) {
64-
sku.fetchOrderCredentials(domain, orderId: orderId) { completion in
65-
Logger.module.debug("skus fetchOrderCredentials")
66-
resultCredential(completion)
67-
}
64+
func fetchOrderCredentials(for orderId: String, domain: String) async -> String {
65+
let credential = await sku.fetchOrderCredentials(domain, orderId: orderId)
66+
Logger.module.debug("skus fetchOrderCredentials")
67+
return credential
6868
}
6969

70-
func prepareCredentialsPresentation(for domain: String, path: String,
71-
resultCredential: ((String) -> Void)?) {
70+
func prepareCredentialsPresentation(for domain: String, path: String) async -> String {
7271
Logger.module.debug("skus prepareCredentialsPresentation")
73-
sku.prepareCredentialsPresentation(domain, path: path) { credential in
74-
if !credential.isEmpty {
75-
if let vpnCredential = BraveSkusWebHelper.fetchVPNCredential(credential, domain: domain) {
76-
Preferences.VPN.skusCredential.value = credential
77-
Preferences.VPN.skusCredentialDomain.value = domain
78-
Preferences.VPN.expirationDate.value = vpnCredential.expirationDate
79-
80-
BraveVPN.setCustomVPNCredential(vpnCredential)
81-
}
82-
} else {
83-
Logger.module.debug("skus empty credential from prepareCredentialsPresentation call")
72+
73+
let credential = await sku.prepareCredentialsPresentation(domain, path: path)
74+
75+
if !credential.isEmpty {
76+
if let vpnCredential = BraveSkusWebHelper.fetchVPNCredential(credential, domain: domain) {
77+
Preferences.VPN.skusCredential.value = credential
78+
Preferences.VPN.skusCredentialDomain.value = domain
79+
Preferences.VPN.expirationDate.value = vpnCredential.expirationDate
80+
81+
BraveVPN.setCustomVPNCredential(vpnCredential)
8482
}
85-
86-
resultCredential?(credential)
83+
} else {
84+
Logger.module.debug("skus empty credential from prepareCredentialsPresentation call")
8785
}
86+
87+
return credential
8888
}
8989

90-
func credentialSummary(for domain: String, resultJSON: @escaping (Any?) -> Void) {
91-
sku.credentialSummary(domain) { [self] completion in
92-
do {
93-
Logger.module.debug("skus credentialSummary")
94-
95-
guard let data = completion.data(using: .utf8) else {
96-
resultJSON(nil)
97-
return
90+
func credentialSummary(for domain: String) async -> Any? {
91+
let credential = await sku.credentialSummary(domain)
92+
93+
do {
94+
Logger.module.debug("skus credentialSummary")
95+
96+
guard let data = credential.data(using: .utf8) else {
97+
return nil
98+
}
99+
100+
let json = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed)
101+
102+
let jsonDecoder = JSONDecoder()
103+
jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
104+
let credentialSummaryJson = try jsonDecoder.decode(CredentialSummary.self, from: data)
105+
106+
switch credentialSummaryJson.state {
107+
case .valid:
108+
if Preferences.VPN.skusCredential.value == nil {
109+
Logger.module.debug("The credential does NOT exists, calling prepareCredentialsPresentation")
110+
let _ = await prepareCredentialsPresentation(for: domain, path: "*")
111+
} else {
112+
Logger.module.debug("The credential exists, NOT calling prepareCredentialsPresentation")
98113
}
99-
let json = try JSONSerialization.jsonObject(with: data, options: .fragmentsAllowed)
100-
101-
let jsonDecoder = JSONDecoder()
102-
jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
103-
let credentialSummaryJson = try jsonDecoder.decode(CredentialSummary.self, from: data)
104-
105-
switch credentialSummaryJson.state {
106-
case .valid:
107-
if Preferences.VPN.skusCredential.value == nil {
108-
Logger.module.debug("The credential does NOT exists, calling prepareCredentialsPresentation")
109-
self.prepareCredentialsPresentation(for: domain, path: "*") { _ in
110-
// Keep the skus manager alive until preparing credential presentation finishes.
111-
_ = self
112-
}
113-
} else {
114-
Logger.module.debug("The credential exists, NOT calling prepareCredentialsPresentation")
115-
}
116-
case .sessionExpired:
117-
Logger.module.debug("This credential session has expired")
118-
Self.keepShowingSessionExpiredState = true
119-
case .invalid:
120-
if !credentialSummaryJson.active {
121-
Logger.module.debug("The credential summary is not active")
122-
}
123-
124-
if credentialSummaryJson.remainingCredentialCount <= 0 {
125-
Logger.module.debug("The credential summary does not have any remaining credentials")
126-
}
114+
case .sessionExpired:
115+
Logger.module.debug("This credential session has expired")
116+
Self.keepShowingSessionExpiredState = true
117+
case .invalid:
118+
if !credentialSummaryJson.active {
119+
Logger.module.debug("The credential summary is not active")
127120
}
128121

129-
resultJSON(json)
130-
} catch {
131-
resultJSON(nil)
132-
Logger.module.error("refrshOrder: Failed to decode json: \(error.localizedDescription)")
122+
if credentialSummaryJson.remainingCredentialCount <= 0 {
123+
Logger.module.debug("The credential summary does not have any remaining credentials")
124+
}
133125
}
126+
127+
return json
128+
} catch {
129+
Logger.module.error("refrshOrder: Failed to decode json: \(error.localizedDescription)")
130+
return nil
134131
}
135132
}
136133

Diff for: Sources/Brave/Frontend/Browser/BraveGetUA.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,9 @@ class BraveGetUA: TabContentScript {
3030
in: scriptSandbox)
3131
}()
3232

33-
func userContentController(_ userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage, replyHandler: (Any?, String?) -> Void) {
33+
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) async -> (Any?, String?) {
3434
// 🙀 😭 🏃‍♀️💨
35+
return (nil, nil)
3536
}
3637

3738
static var isActivated: Bool {

Diff for: Sources/Brave/Frontend/Browser/BrowserViewController/BVC+ReaderMode.swift

+12-10
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,8 @@ extension BrowserViewController {
118118
/// and be done with it. In the more complicated case, reader mode was already open for this page and we simply
119119
/// navigated away from it. So we look to the left and right in the BackForwardList to see if a readerized version
120120
/// of the current page is there. And if so, we go there.
121-
122-
func enableReaderMode() {
121+
@MainActor
122+
func enableReaderMode() async {
123123
guard let tab = tabManager.selectedTab, let webView = tab.webView else { return }
124124

125125
let backList = webView.backForwardList.backList
@@ -132,19 +132,21 @@ extension BrowserViewController {
132132
if backList.count > 1 && backList.last?.url == readerModeURL {
133133
let playlistItem = tab.playlistItem
134134
webView.go(to: backList.last!)
135-
PlaylistScriptHandler.updatePlaylistTab(tab: tab, item: playlistItem)
135+
await PlaylistScriptHandler.updatePlaylistTab(tab: tab, item: playlistItem)
136136
} else if !forwardList.isEmpty && forwardList.first?.url == readerModeURL {
137137
let playlistItem = tab.playlistItem
138138
webView.go(to: forwardList.first!)
139-
PlaylistScriptHandler.updatePlaylistTab(tab: tab, item: playlistItem)
139+
await PlaylistScriptHandler.updatePlaylistTab(tab: tab, item: playlistItem)
140140
} else {
141141
// Store the readability result in the cache and load it. This will later move to the ReadabilityHelper.
142142
webView.evaluateSafeJavaScript(functionName: "\(ReaderModeNamespace).readerize", contentWorld: ReaderModeScriptHandler.scriptSandbox) { (object, error) -> Void in
143143
if let readabilityResult = ReadabilityResult(object: object as AnyObject?) {
144144
let playlistItem = tab.playlistItem
145145
try? self.readerModeCache.put(currentURL, readabilityResult)
146146
if webView.load(PrivilegedRequest(url: readerModeURL) as URLRequest) != nil {
147-
PlaylistScriptHandler.updatePlaylistTab(tab: tab, item: playlistItem)
147+
Task { @MainActor in
148+
await PlaylistScriptHandler.updatePlaylistTab(tab: tab, item: playlistItem)
149+
}
148150
}
149151
}
150152
}
@@ -155,8 +157,8 @@ extension BrowserViewController {
155157
/// means that there is nothing in the BackForwardList except the internal url for the reader mode page. In that
156158
/// case we simply open a new page with the original url. In the more complicated page, the non-readerized version
157159
/// of the page is either to the left or right in the BackForwardList. If that is the case, we navigate there.
158-
159-
func disableReaderMode() {
160+
@MainActor
161+
func disableReaderMode() async {
160162
if let tab = tabManager.selectedTab,
161163
let webView = tab.webView {
162164
let backList = webView.backForwardList.backList
@@ -167,15 +169,15 @@ extension BrowserViewController {
167169
if backList.count > 1 && backList.last?.url == originalURL {
168170
let playlistItem = tab.playlistItem
169171
webView.go(to: backList.last!)
170-
PlaylistScriptHandler.updatePlaylistTab(tab: tab, item: playlistItem)
172+
await PlaylistScriptHandler.updatePlaylistTab(tab: tab, item: playlistItem)
171173
} else if !forwardList.isEmpty && forwardList.first?.url == originalURL {
172174
let playlistItem = tab.playlistItem
173175
webView.go(to: forwardList.first!)
174-
PlaylistScriptHandler.updatePlaylistTab(tab: tab, item: playlistItem)
176+
await PlaylistScriptHandler.updatePlaylistTab(tab: tab, item: playlistItem)
175177
} else {
176178
let playlistItem = tab.playlistItem
177179
if webView.load(URLRequest(url: originalURL)) != nil {
178-
PlaylistScriptHandler.updatePlaylistTab(tab: tab, item: playlistItem)
180+
await PlaylistScriptHandler.updatePlaylistTab(tab: tab, item: playlistItem)
179181
}
180182
}
181183
}

Diff for: Sources/Brave/Frontend/Browser/BrowserViewController/BVC+ShareActivity.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,9 @@ extension BrowserViewController {
7373
title: Strings.toggleReaderMode,
7474
braveSystemImage: "leo.product.speedreader",
7575
callback: { [weak self] in
76-
self?.toggleReaderMode()
76+
Task { @MainActor in
77+
await self?.toggleReaderMode()
78+
}
7779
}
7880
)
7981
)

Diff for: Sources/Brave/Frontend/Browser/BrowserViewController/BVC+TabManagerDelegate.swift

+2
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ extension BrowserViewController: TabManagerDelegate {
187187
if !privateBrowsingManager.isPrivateBrowsing {
188188
rewards.reportTabClosed(tabId: Int(tab.rewardsId))
189189
}
190+
191+
tab.destroy()
190192
}
191193

192194
func tabManagerDidAddTabs(_ tabManager: TabManager) {

Diff for: Sources/Brave/Frontend/Browser/BrowserViewController/BVC+ToolbarDelegate.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,9 @@ extension BrowserViewController: TopToolbarDelegate {
127127
}
128128

129129
func topToolbarDidPressReaderMode(_ topToolbar: TopToolbarView) {
130-
toggleReaderMode()
130+
Task { @MainActor in
131+
await toggleReaderMode()
132+
}
131133
}
132134

133135
func topToolbarDidPressPlaylistButton(_ urlBar: TopToolbarView) {

Diff for: Sources/Brave/Frontend/Browser/BrowserViewController/BVC+WKNavigationDelegate.swift

+3-1
Original file line numberDiff line numberDiff line change
@@ -1161,6 +1161,7 @@ extension BrowserViewController: WKUIDelegate {
11611161
webView.evaluateSafeJavaScript(functionName: script, contentWorld: .defaultClient, asFunction: false)
11621162
}
11631163

1164+
@MainActor
11641165
func handleAlert<T: JSAlertInfo>(webView: WKWebView, alert: inout T, completionHandler: @escaping () -> Void) {
11651166
guard let promptingTab = tabManager[webView], !promptingTab.blockAllAlerts else {
11661167
suppressJSAlerts(webView: webView)
@@ -1169,9 +1170,10 @@ extension BrowserViewController: WKUIDelegate {
11691170
return
11701171
}
11711172
promptingTab.alertShownCount += 1
1173+
11721174
let suppressBlock: JSAlertInfo.SuppressHandler = { [unowned self] suppress in
11731175
if suppress {
1174-
func suppressDialogues(_: UIAlertAction) {
1176+
@MainActor func suppressDialogues(_: UIAlertAction) {
11751177
self.suppressJSAlerts(webView: webView)
11761178
promptingTab.blockAllAlerts = true
11771179
self.tabManager[webView]?.cancelQueuedAlerts()

Diff for: Sources/Brave/Frontend/Browser/BrowserViewController/BrowserViewController.swift

+11-6
Original file line numberDiff line numberDiff line change
@@ -1945,8 +1945,10 @@ public class BrowserViewController: UIViewController {
19451945

19461946
Task { @MainActor in
19471947
do {
1948-
let result = await BraveCertificateUtils.verifyTrust(serverTrust, host: host, port: port)
1949-
1948+
let result = BraveCertificateUtility.verifyTrust(serverTrust,
1949+
host: host,
1950+
port: port)
1951+
19501952
// Cert is valid!
19511953
if result == 0 {
19521954
tab.secureContentState = .secure
@@ -1959,7 +1961,9 @@ public class BrowserViewController: UIViewController {
19591961
tab.secureContentState = .invalidCert
19601962
}
19611963
} catch {
1962-
tab.secureContentState = .invalidCert
1964+
await MainActor.run {
1965+
tab.secureContentState = .invalidCert
1966+
}
19631967
}
19641968

19651969
self.updateURLBar()
@@ -2331,14 +2335,15 @@ public class BrowserViewController: UIViewController {
23312335
}
23322336
}
23332337

2334-
func toggleReaderMode() {
2338+
@MainActor
2339+
func toggleReaderMode() async {
23352340
guard let tab = tabManager.selectedTab else { return }
23362341
if let readerMode = tab.getContentScript(name: ReaderModeScriptHandler.scriptName) as? ReaderModeScriptHandler {
23372342
switch readerMode.state {
23382343
case .available:
2339-
enableReaderMode()
2344+
await enableReaderMode()
23402345
case .active:
2341-
disableReaderMode()
2346+
await disableReaderMode()
23422347
case .unavailable:
23432348
break
23442349
}

Diff for: Sources/Brave/Frontend/Browser/FaviconHandler.swift

+2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class FaviconHandler {
2323
unregister(tabObservers)
2424
}
2525

26+
@MainActor
2627
func loadFaviconURL(
2728
_ url: URL,
2829
forTab tab: Tab
@@ -34,6 +35,7 @@ class FaviconHandler {
3435
}
3536

3637
extension FaviconHandler: TabEventHandler {
38+
@MainActor
3739
func tab(_ tab: Tab, didLoadPageMetadata metadata: PageMetadata) {
3840
if let currentURL = tab.url {
3941
if let favicon = FaviconFetcher.getIconFromCache(for: currentURL) {

Diff for: Sources/Brave/Frontend/Browser/FingerprintingProtection.swift

+3-2
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,12 @@ class FingerprintingProtection: TabContentScript {
3030
in: scriptSandbox)
3131
}()
3232

33-
func userContentController(_ userContentController: WKUserContentController, didReceiveScriptMessage message: WKScriptMessage, replyHandler: (Any?, String?) -> Void) {
34-
defer { replyHandler(nil, nil) }
33+
@MainActor
34+
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) async -> (Any?, String?) {
3535
if let stats = self.tab?.contentBlocker.stats {
3636
self.tab?.contentBlocker.stats = stats.adding(fingerprintingCount: 1)
3737
BraveGlobalShieldStats.shared.fpProtection += 1
3838
}
39+
return (nil, nil)
3940
}
4041
}

Diff for: Sources/Brave/Frontend/Browser/FrequencyQuery.swift

+1
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class FrequencyQuery {
7575
}
7676
}
7777

78+
@MainActor
7879
private func fetchSitesFromTabs(_ tabs: [Tab]) -> [Site] {
7980
var tabList = [Site]()
8081

Diff for: Sources/Brave/Frontend/Browser/Helpers/BrowserNavigationHelper.swift

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class BrowserNavigationHelper {
7474
open(vc, doneButton: DoneButton(style: .done, position: .left))
7575
}
7676

77+
@MainActor
7778
func openShareSheet() {
7879
guard let bvc = bvc else { return }
7980
dismissView()

0 commit comments

Comments
 (0)