From ded644ef2197c7363323a73390235edce480d30f Mon Sep 17 00:00:00 2001 From: Fernando Olivares Date: Sun, 5 Nov 2023 23:07:27 -0600 Subject: [PATCH] Persist visit options if a response is present --- Source/Session/Session.swift | 6 +++++- Source/Session/VisitOptionsHandler.swift | 24 ++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 Source/Session/VisitOptionsHandler.swift diff --git a/Source/Session/Session.swift b/Source/Session/Session.swift index 248ebb8..577e190 100644 --- a/Source/Session/Session.swift +++ b/Source/Session/Session.swift @@ -14,6 +14,9 @@ public class Session: NSObject { private lazy var bridge = WebViewBridge(webView: webView) private var initialized = false private var refreshing = false + + /// Options behave differently if a response is provided. + private let visitOptionsHandler = VisitOptionsHandler() /// Automatically creates a web view with the passed-in configuration public convenience init(webViewConfiguration: WKWebViewConfiguration? = nil) { @@ -61,7 +64,8 @@ public class Session: NSObject { initialized = false } - let visit = makeVisit(for: visitable, options: options ?? VisitOptions()) + let processedOptions = visitOptionsHandler.process(options) + let visit = makeVisit(for: visitable, options: processedOptions) currentVisit?.cancel() currentVisit = visit diff --git a/Source/Session/VisitOptionsHandler.swift b/Source/Session/VisitOptionsHandler.swift new file mode 100644 index 0000000..e3e9656 --- /dev/null +++ b/Source/Session/VisitOptionsHandler.swift @@ -0,0 +1,24 @@ +import Foundation + +class VisitOptionsHandler { + + private var unhandledVisitOptions: VisitOptions? + + /// If a form submission provides a response HTML, save the options and pass them to the next visit proposal. + func process(_ options: VisitOptions?) -> VisitOptions { + + if let options, options.response != nil { + /// Options are provided for the next visit. + unhandledVisitOptions = options + return options + } else if let unhandledVisitOptions { + /// Next visit is happening. Use the previous visit options. + self.unhandledVisitOptions = nil + return unhandledVisitOptions + } else { + /// No options are unhandled. + return options ?? VisitOptions() + } + } + +}