From 5f597e503f33620cc3a10474cb5500d710eb7039 Mon Sep 17 00:00:00 2001 From: Fernando Olivares Date: Mon, 23 Sep 2024 11:23:36 -0600 Subject: [PATCH 1/3] Add @preconcurrency --- Source/Bridge/Bridge.swift | 2 +- Source/Turbo/Navigator/WKUIController.swift | 2 +- Source/Turbo/Session/Session.swift | 2 +- Source/Turbo/Visit/ColdBootVisit.swift | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Bridge/Bridge.swift b/Source/Bridge/Bridge.swift index b454c43..912d84a 100644 --- a/Source/Bridge/Bridge.swift +++ b/Source/Bridge/Bridge.swift @@ -171,7 +171,7 @@ public final class Bridge: Bridgable { } } -extension Bridge: ScriptMessageHandlerDelegate { +extension Bridge: @preconcurrency ScriptMessageHandlerDelegate { @MainActor func scriptMessageHandlerDidReceiveMessage(_ scriptMessage: WKScriptMessage) { if let event = scriptMessage.body as? String, event == "ready" { diff --git a/Source/Turbo/Navigator/WKUIController.swift b/Source/Turbo/Navigator/WKUIController.swift index 16dfb22..08a2c06 100644 --- a/Source/Turbo/Navigator/WKUIController.swift +++ b/Source/Turbo/Navigator/WKUIController.swift @@ -1,5 +1,5 @@ import Foundation -import WebKit +@preconcurrency import WebKit public protocol WKUIControllerDelegate: AnyObject { func present(_ alert: UIAlertController, animated: Bool) diff --git a/Source/Turbo/Session/Session.swift b/Source/Turbo/Session/Session.swift index 98f5172..9ae501f 100644 --- a/Source/Turbo/Session/Session.swift +++ b/Source/Turbo/Session/Session.swift @@ -1,5 +1,5 @@ import UIKit -import WebKit +@preconcurrency import WebKit /// A Session represents the main interface for managing /// a Hotwire app in a web view. Each Session manages a single web view diff --git a/Source/Turbo/Visit/ColdBootVisit.swift b/Source/Turbo/Visit/ColdBootVisit.swift index 01b10ba..bff4476 100644 --- a/Source/Turbo/Visit/ColdBootVisit.swift +++ b/Source/Turbo/Visit/ColdBootVisit.swift @@ -1,5 +1,5 @@ import Foundation -import WebKit +@preconcurrency import WebKit /// A "Cold Boot" visit is the initial visit to load the page, including all resources. /// Subsequent visits go through Turbo and use `JavaScriptVisit`. From 6c5d9f278ce5bc7a33440cd16ae0253cd554017c Mon Sep 17 00:00:00 2001 From: Fernando Olivares Date: Mon, 23 Sep 2024 12:00:03 -0600 Subject: [PATCH 2/3] Fix unit tests that required @MainActor --- Tests/Turbo/SessionTests.swift | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Tests/Turbo/SessionTests.swift b/Tests/Turbo/SessionTests.swift index 4ea6f08..c089cc1 100644 --- a/Tests/Turbo/SessionTests.swift +++ b/Tests/Turbo/SessionTests.swift @@ -52,6 +52,7 @@ class SessionTests: XCTestCase { XCTAssertTrue(sessionDelegate.sessionDidStartRequestCalled) } + @MainActor func test_coldBootVisit_whenVisitSucceeds_callsSessionDidLoadWebViewDelegateMethod() async { await visit("/") @@ -106,6 +107,7 @@ class SessionTests: XCTestCase { XCTAssertEqual(error as? TurboError, TurboError.pageLoadFailure) } + @MainActor func test_coldBootVisit_Turbolinks5Compatibility_loadsThePageAndSetsTheAdapter() async throws { await visit("/turbolinks") @@ -115,6 +117,7 @@ class SessionTests: XCTestCase { XCTAssertTrue(try XCTUnwrap(result as? Bool)) } + @MainActor func test_coldBootVisit_Turbolinks5_3Compatibility_loadsThePageAndSetsTheAdapter() async throws { await visit("/turbolinks-5.3") From 2a04f41a216aa15858c055f040bcf1b18fab0aee Mon Sep 17 00:00:00 2001 From: Fernando Olivares Date: Mon, 23 Sep 2024 12:18:00 -0600 Subject: [PATCH 3/3] Reset TestSessionDelegate after every unit test --- Tests/Turbo/SessionTests.swift | 3 ++- Tests/Turbo/Test.swift | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Tests/Turbo/SessionTests.swift b/Tests/Turbo/SessionTests.swift index c089cc1..c131e30 100644 --- a/Tests/Turbo/SessionTests.swift +++ b/Tests/Turbo/SessionTests.swift @@ -28,7 +28,8 @@ class SessionTests: XCTestCase { override func tearDown() { session.webView.configuration.userContentController.removeScriptMessageHandler(forName: "turbo") - + sessionDelegate.reset() + server.stopAndWait() eventLoop.stop() } diff --git a/Tests/Turbo/Test.swift b/Tests/Turbo/Test.swift index 9d6f407..faa1281 100644 --- a/Tests/Turbo/Test.swift +++ b/Tests/Turbo/Test.swift @@ -40,17 +40,27 @@ class TestVisitable: UIViewController, Visitable { } class TestSessionDelegate: NSObject, SessionDelegate { - var sessionDidLoadWebViewCalled = false { didSet { didChange?() }} + var sessionDidLoadWebViewCalled = false var sessionDidStartRequestCalled = false var sessionDidFinishRequestCalled = false var failedRequestError: Error? = nil - var sessionDidFailRequestCalled = false { didSet { didChange?() }} + var sessionDidFailRequestCalled = false var sessionDidProposeVisitCalled = false var didChange: (() -> Void)? + + func reset() { + sessionDidLoadWebViewCalled = false + sessionDidStartRequestCalled = false + sessionDidFinishRequestCalled = false + failedRequestError = nil + sessionDidFailRequestCalled = false + sessionDidProposeVisitCalled = false + } func sessionDidLoadWebView(_ session: Session) { sessionDidLoadWebViewCalled = true + didChange?() } func sessionDidStartRequest(_ session: Session) { @@ -69,6 +79,7 @@ class TestSessionDelegate: NSObject, SessionDelegate { func session(_ session: Session, didFailRequestForVisitable visitable: Visitable, error: Error) { sessionDidFailRequestCalled = true + didChange?() failedRequestError = error }