Skip to content

Commit

Permalink
Merge branch 'main' into add-load-with-URLRequest
Browse files Browse the repository at this point in the history
  • Loading branch information
Kyome22 committed May 15, 2024
2 parents 3bdba7e + fae50c0 commit f24c85d
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 20 deletions.
22 changes: 22 additions & 0 deletions Sources/WebUI/SetUpWebViewProxyAction.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import SwiftUI
import WebKit

struct SetUpWebViewProxyAction {
let action: (WKWebView) -> Void

func callAsFunction(_ webView: WKWebView) {
action(webView)
}
}

private struct SetUpWebViewProxyActionKey: EnvironmentKey {
static var defaultValue = SetUpWebViewProxyAction(action: { _ in })
}

extension EnvironmentValues {
var setUpWebViewProxy: SetUpWebViewProxyAction {
get { self[SetUpWebViewProxyActionKey.self] }
set { self[SetUpWebViewProxyActionKey.self] = newValue }
}
}

5 changes: 3 additions & 2 deletions Sources/WebUI/WebView+Extension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,16 @@ extension WebView: View {
}

struct _WebView: ViewRepresentable {
@Environment(\.webViewProxy) private var proxy: WebViewProxy
@Environment(\.setUpWebViewProxy) private var setUpWebViewProxy

let parent: WebView

@MainActor
private func makeEnhancedWKWebView() -> EnhancedWKWebView {
let webView = EnhancedWKWebView(frame: .zero, configuration: parent.configuration)
setUpWebViewProxy(webView)
parent.applyModifiers(to: webView)
proxy.setUp(webView)
parent.loadInitialURL(in: webView)
return webView
}

Expand Down
12 changes: 8 additions & 4 deletions Sources/WebUI/WebView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import WebKit
public struct WebView {
let configuration: WKWebViewConfiguration

private let url: URL?
private let initialURL: URL?

private var uiDelegate: (any WKUIDelegate)?
private var navigationDelegate: (any WKNavigationDelegate)?
Expand All @@ -29,7 +29,7 @@ public struct WebView {
/// - url: The initial URL to load.
/// - configuration: The configuration for the new web view.
public init(url: URL? = nil, configuration: WKWebViewConfiguration = .init()) {
self.url = url
self.initialURL = url
self.configuration = configuration
}

Expand Down Expand Up @@ -106,8 +106,12 @@ public struct WebView {
webView.allowsBackForwardNavigationGestures = allowsBackForwardNavigationGestures
webView.allowsLinkPreview = allowsLinkPreview
webView.isRefreshable = isRefreshable
if let url {
webView.load(URLRequest(url: url))
}

@MainActor
func loadInitialURL(in webView: EnhancedWKWebView) {
if let initialURL {
webView.load(URLRequest(url: initialURL))
}
}
}
11 changes: 0 additions & 11 deletions Sources/WebUI/WebViewProxy.swift
Original file line number Diff line number Diff line change
Expand Up @@ -147,14 +147,3 @@ public final class WebViewProxy: ObservableObject {
}
}
}

private struct WebViewProxyKey: EnvironmentKey {
static let defaultValue = WebViewProxy()
}

extension EnvironmentValues {
var webViewProxy: WebViewProxy {
get { self[WebViewProxyKey.self] }
set { self[WebViewProxyKey.self] = newValue }
}
}
2 changes: 1 addition & 1 deletion Sources/WebUI/WebViewReader.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,6 @@ public struct WebViewReader<Content: View>: View {
/// The content and behavior of the view.
public var body: some View {
content(proxy)
.environment(\.webViewProxy, proxy)
.environment(\.setUpWebViewProxy, SetUpWebViewProxyAction(action: proxy.setUp))
}
}
12 changes: 10 additions & 2 deletions Tests/WebUITests/WebViewTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,19 @@ final class WebViewTests: XCTestCase {
}

@MainActor
func test_applyModifiers_init_with_specified_URL() {
func test_loadInitialURL_do_not_load_URL_if_URL_is_not_specified_in_init() {
let sut = WebView()
let webViewMock = WKWebViewMock()
sut.loadInitialURL(in: webViewMock)
XCTAssertNil(webViewMock.loadedURL)
}

@MainActor
func test_loadInitialURL_load_URL_if_URL_is_specified_in_init() {
let url = URL(string: "https://www.example.com")!
let sut = WebView(url: url)
let webViewMock = WKWebViewMock()
sut.applyModifiers(to: webViewMock)
sut.loadInitialURL(in: webViewMock)
XCTAssertEqual(webViewMock.loadedURL, url)
}
}

0 comments on commit f24c85d

Please sign in to comment.