@@ -216,10 +216,13 @@ final class BrowserWindowController: NSWindowController, NSWindowDelegate,
216216 private var toastHide : DispatchWorkItem ?
217217 private var lastProgress : CGFloat = 0
218218 private var onStartPage = false
219+ private var pendingRestoredStartupURL : URL ?
219220 private var agentControlEnabled = false
220221 var onClose : ( ( ) -> Void ) ?
221222
222- init ( url: URL ? , size: NSSize ? , snap: SnapJob ? , isPrimary: Bool ) {
223+ init (
224+ url: URL ? , restoredStartupURL: URL ? = nil , size: NSSize ? , snap: SnapJob ? , isPrimary: Bool
225+ ) {
223226 let diagnosticsBridge = WebKitQABridge ( )
224227 qaBridge = diagnosticsBridge
225228 let conf = WKWebViewConfiguration ( )
@@ -300,7 +303,12 @@ final class BrowserWindowController: NSWindowController, NSWindowDelegate,
300303
301304 installMouseMonitor ( )
302305
303- if let url { navigate ( to: url) } else { loadStartPage ( ) }
306+ if let url {
307+ pendingRestoredStartupURL = restoredStartupURL
308+ load ( url)
309+ } else {
310+ loadStartPage ( )
311+ }
304312 }
305313
306314 required init ? ( coder: NSCoder ) { fatalError ( " not used " ) }
@@ -434,6 +442,11 @@ final class BrowserWindowController: NSWindowController, NSWindowDelegate,
434442 // MARK: Navigation
435443
436444 func navigate( to url: URL ) {
445+ pendingRestoredStartupURL = nil
446+ load ( url)
447+ }
448+
449+ private func load( _ url: URL ) {
437450 onStartPage = false
438451 if url. isFileURL {
439452 webView. loadFileURL ( url, allowingReadAccessTo: url. deletingLastPathComponent ( ) )
@@ -458,6 +471,7 @@ final class BrowserWindowController: NSWindowController, NSWindowDelegate,
458471 }
459472
460473 func loadStartPage( ) {
474+ pendingRestoredStartupURL = nil
461475 onStartPage = true
462476 webView. loadHTMLString ( startPageHTML, baseURL: nil )
463477 }
@@ -638,7 +652,10 @@ final class BrowserWindowController: NSWindowController, NSWindowDelegate,
638652
639653 func webView( _ webView: WKWebView , didCommit navigation: WKNavigation ! ) {
640654 let u = webView. url? . absoluteString
641- if u != nil && u != " about:blank " { onStartPage = false }
655+ if u != nil && u != " about:blank " {
656+ pendingRestoredStartupURL = nil
657+ onStartPage = false
658+ }
642659 }
643660
644661 func webView( _ webView: WKWebView , didFinish navigation: WKNavigation ! ) {
@@ -667,6 +684,15 @@ final class BrowserWindowController: NSWindowController, NSWindowDelegate,
667684 if e. code == NSURLErrorCancelled || e. code == 102 { return }
668685 qaBridge. store. append ( kind: " request-failed " , message: e. localizedDescription,
669686 url: webView. url? . absoluteString)
687+ if let restoredURL = pendingRestoredStartupURL {
688+ pendingRestoredStartupURL = nil
689+ if UserDefaults . standard. string ( forKey: " LastURL " ) == restoredURL. absoluteString {
690+ UserDefaults . standard. removeObject ( forKey: " LastURL " )
691+ }
692+ loadStartPage ( )
693+ showToast ( " Previous page unavailable " )
694+ return
695+ }
670696 if launchOptions. snap != nil {
671697 fputs ( " headless: load failed: \( e. localizedDescription) \n " , stderr)
672698 exit ( 1 )
@@ -793,14 +819,20 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
793819 NSApp . setActivationPolicy ( . regular)
794820 buildMenu ( )
795821
796- let url : URL ? = {
797- if isAgentHost { return nil }
798- if let u = launchOptions. url { return u }
799- if launchOptions. snap != nil { return nil }
800- if let s = UserDefaults . standard. string ( forKey: " LastURL " ) { return URL ( string: s) }
801- return nil
822+ let restoredStartupURL : URL ? = {
823+ guard !isAgentHost, launchOptions. url == nil , launchOptions. snap == nil ,
824+ let value = UserDefaults . standard. string ( forKey: " LastURL " ) else { return nil }
825+ return URL ( string: value)
802826 } ( )
803- openWindow ( url: url, size: launchOptions. size, snap: launchOptions. snap, isPrimary: true , sessionName: " default " )
827+ let url = isAgentHost ? nil : launchOptions. url ?? restoredStartupURL
828+ openWindow (
829+ url: url,
830+ restoredStartupURL: restoredStartupURL,
831+ size: launchOptions. size,
832+ snap: launchOptions. snap,
833+ isPrimary: true ,
834+ sessionName: " default "
835+ )
804836 do {
805837 try agentServer. start { [ weak self] request in
806838 self ? . handleAgentRequest ( request) ?? CommandResponse . failure (
@@ -823,12 +855,19 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
823855 @discardableResult
824856 func openWindow(
825857 url: URL ? ,
858+ restoredStartupURL: URL ? = nil ,
826859 size: NSSize ? = nil ,
827860 snap: SnapJob ? = nil ,
828861 isPrimary: Bool = false ,
829862 sessionName: String ? = nil
830863 ) -> BrowserWindowController {
831- let controller = BrowserWindowController ( url: url, size: size, snap: snap, isPrimary: isPrimary)
864+ let controller = BrowserWindowController (
865+ url: url,
866+ restoredStartupURL: restoredStartupURL,
867+ size: size,
868+ snap: snap,
869+ isPrimary: isPrimary
870+ )
832871 controller. onClose = { [ weak self, weak controller] in
833872 guard let self, let controller else { return }
834873 self . controllers. removeAll { $0 === controller }
0 commit comments