Skip to content

Commit 98ca018

Browse files
authored
Merge pull request #253 from hotwired/bridge-delegate-destination-lifecycle
Keep bridge destinations active while attached
2 parents 65e5e21 + e87b2fd commit 98ca018

3 files changed

Lines changed: 17 additions & 13 deletions

File tree

‎Source/Bridge/BridgeDelegate.swift‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ public final class BridgeDelegate: BridgingDelegate {
5252
public func webViewDidBecomeActive(_ webView: WKWebView) {
5353
bridge = Bridge.getBridgeFor(webView)
5454
bridge?.delegate = self
55-
destinationIsActive = true
5655

5756
if bridge == nil {
5857
logger.warning("bridgeNotInitializedForWebView")
@@ -62,7 +61,6 @@ public final class BridgeDelegate: BridgingDelegate {
6261
public func webViewDidBecomeDeactivated() {
6362
bridge?.delegate = nil
6463
bridge = nil
65-
destinationIsActive = false
6664
}
6765

6866
@discardableResult
@@ -84,19 +82,16 @@ public final class BridgeDelegate: BridgingDelegate {
8482

8583
public func onViewDidLoad() {
8684
logger.debug("[Bridge] bridgeDestinationViewDidLoad: \(self.resolvedLocation)")
87-
destinationIsActive = true
8885
activeComponents.forEach { $0.viewDidLoad() }
8986
}
9087

9188
public func onViewWillAppear() {
9289
logger.debug("[Bridge] bridgeDestinationViewWillAppear: \(self.resolvedLocation)")
93-
destinationIsActive = true
9490
activeComponents.forEach { $0.viewWillAppear() }
9591
}
9692

9793
public func onViewDidAppear() {
9894
logger.debug("[Bridge] bridgeDestinationViewDidAppear: \(self.resolvedLocation)")
99-
destinationIsActive = true
10095
activeComponents.forEach { $0.viewDidAppear() }
10196
}
10297

@@ -107,7 +102,6 @@ public final class BridgeDelegate: BridgingDelegate {
107102

108103
public func onViewDidDisappear() {
109104
activeComponents.forEach { $0.viewDidDisappear() }
110-
destinationIsActive = false
111105
logger.debug("[Bridge] bridgeDestinationViewDidDisappear: \(self.resolvedLocation)")
112106
}
113107

@@ -147,14 +141,20 @@ public final class BridgeDelegate: BridgingDelegate {
147141
// MARK: Private
148142

149143
private var initializedComponents: [String: BridgeComponent] = [:]
150-
private var destinationIsActive = false
151144
private let componentTypes: [BridgeComponent.Type]
145+
private var destinationIsActive: Bool {
146+
bridge != nil
147+
}
152148
private var resolvedLocation: String {
153149
webView?.url?.absoluteString ?? location
154150
}
155151

156152
private var activeComponents: [BridgeComponent] {
157-
return initializedComponents.values.filter { _ in destinationIsActive }
153+
guard destinationIsActive else {
154+
return []
155+
}
156+
157+
return Array(initializedComponents.values)
158158
}
159159

160160
private func getOrCreateComponent(name: String) -> BridgeComponent? {

‎Tests/Bridge/BridgeDelegate+DestinationTests.swift‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,21 @@ class BridgeDelegateDestinationTests: XCTestCase {
5757
XCTAssertNotNil(component)
5858
}
5959

60-
func testBridgeDestinationIsInactiveAfterViewDidDisappear() {
60+
func testBridgeDestinationRemainsActiveAfterViewDidDisappearWhenWebViewIsStillActive() {
61+
// Tab bar destinations can receive view disappearance callbacks while
62+
// their web view remains active and attached to the bridge.
6163
delegate.onViewDidLoad()
6264
delegate.onViewDidDisappear()
6365
delegate.bridgeDidReceiveMessage(.test)
6466

6567
let component: BridgeComponentSpy? = delegate.component()
66-
XCTAssertNil(component)
68+
XCTAssertNotNil(component)
6769
}
6870

6971
func testBridgeDestinationIsActiveAfterWebViewDidBecomeActive() {
70-
delegate.webViewDidBecomeActive(WKWebView())
72+
let webView = WKWebView()
73+
Bridge.initialize(webView)
74+
delegate.webViewDidBecomeActive(webView)
7175
delegate.bridgeDidReceiveMessage(.test)
7276

7377
let component: BridgeComponentSpy? = delegate.component()

‎Tests/Bridge/BridgeDelegateTests.swift‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ class BridgeDelegateTests: XCTestCase {
125125
XCTAssertNotNil(component?.delegate)
126126
}
127127

128-
func testBridgeIgnoresMessageForInactiveDestination() {
128+
func testBridgeIgnoresMessageAfterWebViewBecomesDeactivated() {
129129
let message = Message(id: "1",
130130
component: "one",
131131
event: "connect",
@@ -137,7 +137,7 @@ class BridgeDelegateTests: XCTestCase {
137137
var component: OneBridgeComponent? = delegate.component()
138138
XCTAssertNotNil(component)
139139

140-
delegate.onViewDidDisappear()
140+
delegate.webViewDidBecomeDeactivated()
141141
XCTAssertFalse(delegate.bridgeDidReceiveMessage(message))
142142

143143
component = delegate.component()

0 commit comments

Comments
 (0)