import Foundation /// A web view. @available(tvOS, unavailable) public struct WebView: ElementaryView { /// The ideal size of a WebView. private static let idealSize = ViewSize(10, 10) @State var currentURL: URL? @Binding var url: URL /// Creates a web view. /// /// - Parameter url: A binding to the web view's URL. public init(_ url: Binding) { _url = url } func asWidget(backend: Backend) -> Backend.Widget { func castBackend_inner(_ backend: NewBackend) -> NewBackend.Widget { return backend.createWebView() } guard let castedBackend = backend as? any (BaseAppBackend & BackendFeatures.WebViews) else { fatalError("Backend does not implement BackendFeatures.WebViews") } return castBackend_inner(castedBackend) as! Backend.Widget } func computeLayout( _ widget: Backend.Widget, proposedSize: ProposedViewSize, environment: EnvironmentValues, backend: Backend ) -> ViewLayoutResult { let size = proposedSize.replacingUnspecifiedDimensions(by: Self.idealSize) return ViewLayoutResult.leafView(size: size) } func commit( _ widget: Backend.Widget, layout: ViewLayoutResult, environment: EnvironmentValues, backend: Backend ) { func castBackend_inner(_ backend: NewBackend) { let widget = widget as! NewBackend.Widget if url != currentURL { backend.navigateWebView(widget, to: url) currentURL = url } backend.updateWebView(widget, environment: environment) { destination in currentURL = destination url = destination } backend.setSize(of: widget, to: layout.size.vector) } guard let castedBackend = backend as? any (BaseAppBackend & BackendFeatures.WebViews) else { fatalError("Backend does not implement BackendFeatures.WebViews") } castBackend_inner(castedBackend) } }