Skip to content

Commit

Permalink
Merge pull request #38 from cybozu/fix-memory-leak-issue
Browse files Browse the repository at this point in the history
Fix memory leak issue
  • Loading branch information
b1ackturtle authored Jan 3, 2025
2 parents f1b1ac9 + 3a5c52e commit 5434320
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 16 deletions.
28 changes: 14 additions & 14 deletions Sources/WebUI/WebViewProxy.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,15 +35,15 @@ public final class WebViewProxy: ObservableObject {

deinit {
tasks.forEach { $0.cancel() }
tasks.removeAll()
}

func setUp(_ webView: Remakeable<EnhancedWKWebView>) {
self.webView = webView
observe(webView.wrappedValue)

webView.onRemake { [weak self] in
guard let self else { return }
observe($0)
self?.observe($0)
}
}

Expand All @@ -52,34 +52,34 @@ public final class WebViewProxy: ObservableObject {
tasks.removeAll()

tasks = [
Task { @MainActor in
Task { @MainActor [weak self] in
for await value in webView.publisher(for: \.title).bufferedValues() {
self.title = value
self?.title = value
}
},
Task { @MainActor in
Task { @MainActor [weak self] in
for await value in webView.publisher(for: \.url).bufferedValues() {
self.url = value
self?.url = value
}
},
Task { @MainActor in
Task { @MainActor [weak self] in
for await value in webView.publisher(for: \.isLoading).bufferedValues() {
self.isLoading = value
self?.isLoading = value
}
},
Task { @MainActor in
Task { @MainActor [weak self] in
for await value in webView.publisher(for: \.estimatedProgress).bufferedValues() {
self.estimatedProgress = value
self?.estimatedProgress = value
}
},
Task { @MainActor in
Task { @MainActor [weak self] in
for await value in webView.publisher(for: \.canGoBack).bufferedValues() {
self.canGoBack = value
self?.canGoBack = value
}
},
Task { @MainActor in
Task { @MainActor [weak self] in
for await value in webView.publisher(for: \.canGoForward).bufferedValues() {
self.canGoForward = value
self?.canGoForward = value
}
}
]
Expand Down
4 changes: 2 additions & 2 deletions Sources/WebUI/WebViewReader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ public struct WebViewReader<Content: View>: View {
/// The content and behavior of the view.
public var body: some View {
content(proxy)
.environment(\.setUpWebViewProxy, SetUpWebViewProxyAction(action: {
proxy.setUp($0)
.environment(\.setUpWebViewProxy, SetUpWebViewProxyAction(action: { [weak proxy] in
proxy?.setUp($0)
}))
}
}
22 changes: 22 additions & 0 deletions Tests/WebUITests/WebViewReaderTests.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
@testable import WebUI
import os
import SwiftUI
import XCTest

final class WebViewReaderTests: XCTestCase {
@MainActor
func test_WebViewProxy_will_also_be_destroyed_if_WebViewReader_is_destroyed() {
let proxyClient = OSAllocatedUnfairLock<WebViewProxy?>(initialState: nil)
let sut = WebViewReader { proxy in
WebView()
.onAppear {
proxyClient.withLock { $0 = proxy }
}
}
UIHostingController(rootView: sut)._render(seconds: 0)
let actual = proxyClient.withLock(\.self)
addTeardownBlock { [weak actual] in
XCTAssertNil(actual)
}
}
}

0 comments on commit 5434320

Please sign in to comment.