| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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 = url
- }
- func asWidget<Backend: BaseAppBackend>(backend: Backend) -> Backend.Widget {
- func castBackend_inner<NewBackend: BaseAppBackend & BackendFeatures.WebViews>(_ 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<Backend: BaseAppBackend>(
- _ widget: Backend.Widget,
- proposedSize: ProposedViewSize,
- environment: EnvironmentValues,
- backend: Backend
- ) -> ViewLayoutResult {
- let size = proposedSize.replacingUnspecifiedDimensions(by: Self.idealSize)
- return ViewLayoutResult.leafView(size: size)
- }
- func commit<Backend: BaseAppBackend>(
- _ widget: Backend.Widget,
- layout: ViewLayoutResult,
- environment: EnvironmentValues,
- backend: Backend
- ) {
- func castBackend_inner<NewBackend: BaseAppBackend & BackendFeatures.WebViews>(_ 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)
- }
- }
|