5
  • Immediately exiting Orion after closing last tab causes it to reappear

  • BugsMobileDone

What

  • Immediately exiting the Orion app after closing the last tab via Grid View, causes the previously closed tab to reappear on re-open.

How

  1. Open Orion.
  2. Create a new tab.
  3. Search something in the new tab to make it distinct from a new tab.
  4. Open Grid View.
  5. Close the only visible tab.
  6. Immediately exit the app.
  7. Reopen Orion.
  8. Note that we start in Grid Overview with no tabs shows, bottom bar displays "1 Tab".
  9. Press "+" to create a new tab.
  10. Note that the Grid Overview icon shows "2".
  11. Press the square with the "2" to return to Grid Overview.
  12. Note that previously closed tab is displayed.

Why

  • Potentially there is a race-condition between closing the tab and exiting the app.
    • If so, it might make sense to "tag" the app as "closing", so that it can be cleaned up on next open instead of reappearing.

Debug Log

[2025-03-08 19:00:30] TabViewModel: processAction action: takeScreenshot(tabRootView: Optional(<Orion.NewTabRootView: 0x11b4a9200; frame = (0 0; 393 659); backgroundColor = <UIDynamicSystemColor: 0x300e7d840; name = systemGray6Color>; layer = <CALayer: 0x301bd8dc0>>))
[2025-03-08 19:00:30] UIView.showHideAnimated: <Orion.GaussianBlurView: 0x11b7a6800; baseClass = UIVisualEffectView; frame = (0 0; 0 0); layer = <CALayer: 0x301a77360>> effect=<UIBlurEffect: 0x301911ba0> style=UIBlurEffectStyleRegular, show: true, checkCurrent: false
[2025-03-08 19:00:31] PGSideMenu: gestureRecognizerShouldBegin false 2
[2025-03-08 19:00:32] SceneDelegate: sceneDidEnterBackground
[2025-03-08 19:00:32] BrowserContainerVC: storeSessionURLs
[2025-03-08 19:00:32] PGSideMenu: gestureRecognizerShouldBegin false 2
[2025-03-08 19:00:34] SceneDelegate: sceneWillEnterForeground
[2025-03-08 19:00:37] BrowserContainerVC: addTab: configuration: nil
[2025-03-08 19:00:37] NewTabViewController ID 3: init w/ config nil
[2025-03-08 19:00:37] BrowserContainerVC: storeSessionURLs
[2025-03-08 19:00:37] TabViewModel: processAction action: updateToolsbar
[2025-03-08 19:00:37] NewTabViewController ID 2: processViewModel w/ state: updateToolsbar(tabHasURL: true, backNavigation: Orion.NewTabViewModel.BackNavigation.regular)
[2025-03-08 19:00:37] TabViewModel: processAction action: updateLocationBar
[2025-03-08 19:00:37] NewTabViewController ID 2: processViewModel w/ state: updateLocationBar(viewModel: Orion.WebPageModel, tabsCount: 2)
[2025-03-08 19:00:37] TabViewModel: processAction action: updateTabCount
[2025-03-08 19:00:37] NewTabViewController ID 2: processViewModel w/ state: updateTabCount(2)
[2025-03-08 19:00:37] TabViewModel: processAction action: updateTabCount
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateTabCount(2)
[2025-03-08 19:00:37] NewTabRootView ID 3: hideToolbarOnScrollSettingChanged
[2025-03-08 19:00:37] TabViewModel: commonInit configuration: TabConfiguration(url: nil, webContextView: nil, index: nil, openerTabId: nil, startLoading: false, successorId: nil, tabId: nil, isPinned: false, isDiscarded: false, isSelected: false, isPrivate: false, title: nil, cookieStoreId: nil, sessionState: nil, navigationType: nil, referer: nil, isRestoring: false, childrenTabId: nil, isExpanded: false, lastAccessed: nil, interactionState: nil, iCloudTabIdentifier: nil, parentICloudTabIdentifier: nil, localTabIdentifier: nil, parentLocalTabIdentifier: nil), internalPageType: Optional(Orion.NewInternalPageType.newTab), tabCreatedWithStartPage: true, browserTab.url: nil
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: pageLoadingProgressChanged(progress: 0.1, animated: false)
[2025-03-08 19:00:37] TabViewModel: WebPageDelegate: urlUpdated: orion://newtab/, webPage: Orion.WebPageModel
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: urlDidChange
[2025-03-08 19:00:37] TabViewModel: processAction action: updateWebsiteAddress
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateWebsiteAddress(text: "")
[2025-03-08 19:00:37] UIView.showHideAnimated: <UIButton: 0x12baec000; frame = (0 0; 0 0); opaque = NO; tintColor = <UIDynamicCatalogSystemColor: 0x300ebc980; name = secondaryLabelColor>; gestureRecognizers = <NSArray: 0x301a4e5a0>; layer = <CALayer: 0x301a4e640>> configuration=<UIButtonConfiguration: 0x12238c8c0> baseStyle=plain macStyle=automatic buttonSize=medium cornerStyle=dynamic image=<UIImage:0x302969d40 symbol(system: arrow.clockwise)> contentInsets={0, 0, 0, 0} imagePlacement=leading imagePadding=0 titlePadding=1 titleAlignment=automatic automaticallyUpdateForSelection background=<UIBackgroundConfiguration: 0x30202c9c0; Base Style = Custom; cornerRadius = 5.95>, show: false, checkCurrent: false
[2025-03-08 19:00:37] UIView.showHideAnimated: <UIButton: 0x103e1bc00; frame = (-8.33333 0; 17.3333 44); opaque = NO; tintColor = <UIDynamicCatalogSystemColor: 0x300e61c00; name = labelColor>; gestureRecognizers = <NSArray: 0x3015ae310>; layer = <CALayer: 0x301b0bcc0>> configuration=<UIButtonConfiguration: 0x103fe9b80> baseStyle=plain macStyle=automatic buttonSize=medium cornerStyle=dynamic image=<UIImage:0x302969d40 symbol(system: arrow.clockwise)> contentInsets={0, 0, 0, 0} imagePlacement=leading imagePadding=0 titlePadding=1 titleAlignment=automatic automaticallyUpdateForSelection background=<UIBackgroundConfiguration: 0x3020fc000; Base Style = Custom; cornerRadius = 5.95>, show: false, checkCurrent: false
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateWebsiteAddress(text: "orion://newtab/")
[2025-03-08 19:00:37] TabViewModel: WebPageDelegate: isLoading: true, webPage: Orion.WebPageModel
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: pageLoadingStatusChanged
[2025-03-08 19:00:37] NewTabViewController ID 3: updateBarsItems
[2025-03-08 19:00:37] TabViewModel: processAction action: updateWebsiteAddress
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateWebsiteAddress(text: "")
[2025-03-08 19:00:37] TabViewModel: processAction action: updateLocationBar
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateLocationBar(viewModel: Orion.WebPageModel, tabsCount: 2)
[2025-03-08 19:00:37] TabViewModel: processAction action: updateToolsbar
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateToolsbar(tabHasURL: false, backNavigation: Orion.NewTabViewModel.BackNavigation.forbidden)
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: faviconUpdated(image: nil)
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: restoreToolbars
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: removeReaderModeHighlightFromURLBar
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: pageLoadingProgressChanged(progress: 0.15, animated: false)
[2025-03-08 19:00:37] NewTabRootView ID 3: hideToolbarOnScrollSettingChanged
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: faviconUpdated(image: Optional(<UIImage:0x302939b90 named(main: orion.toolbar.startpage) {16, 16} renderingMode=alwaysTemplate>))
[2025-03-08 19:00:37] NewTabViewController ID 3: updateBarsItems
[2025-03-08 19:00:37] TabViewModel: processAction action: updateWebsiteAddress
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateWebsiteAddress(text: "")
[2025-03-08 19:00:37] TabViewModel: processAction action: updateLocationBar
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateLocationBar(viewModel: Orion.WebPageModel, tabsCount: 2)
[2025-03-08 19:00:37] TabViewModel: processAction action: updateToolsbar
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateToolsbar(tabHasURL: false, backNavigation: Orion.NewTabViewModel.BackNavigation.forbidden)
[2025-03-08 19:00:37] BrowserContainerVC: storeSessionURLs
[2025-03-08 19:00:37] TabViewModel: openStartURLIfNeeded: webPageModel: Orion.WebPageModel, hasURL: false, configuration: TabConfiguration(url: nil, webContextView: nil, index: nil, openerTabId: nil, startLoading: false, successorId: nil, tabId: nil, isPinned: false, isDiscarded: false, isSelected: false, isPrivate: false, title: nil, cookieStoreId: nil, sessionState: nil, navigationType: nil, referer: nil, isRestoring: false, childrenTabId: nil, isExpanded: false, lastAccessed: nil, interactionState: nil, iCloudTabIdentifier: nil, parentICloudTabIdentifier: nil, localTabIdentifier: nil, parentLocalTabIdentifier: nil)
[2025-03-08 19:00:37] TabViewModel: processAction action: configureContentBlocker(enabled: true)
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: pageLoadingProgressChanged(progress: 0.5, animated: true)
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: pageLoadingProgressChanged(progress: 1.0, animated: true)
[2025-03-08 19:00:37] TabViewModel: WebPageDelegate: isLoading: false, webPage: Orion.WebPageModel
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: pageLoadingStatusChanged
[2025-03-08 19:00:37] NewTabViewController ID 3: updateBarsItems
[2025-03-08 19:00:37] TabViewModel: processAction action: updateWebsiteAddress
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateWebsiteAddress(text: "")
[2025-03-08 19:00:37] TabViewModel: processAction action: updateLocationBar
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateLocationBar(viewModel: Orion.WebPageModel, tabsCount: 2)
[2025-03-08 19:00:37] TabViewModel: processAction action: updateToolsbar
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateToolsbar(tabHasURL: false, backNavigation: Orion.NewTabViewModel.BackNavigation.forbidden)
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: faviconUpdated(image: nil)
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: removeReaderModeHighlightFromURLBar
[2025-03-08 19:00:37] BrowserContainerVC: storeSessionURLs
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: updateWebsiteTitle
[2025-03-08 19:00:37] NewTabViewController ID 3: processViewModel w/ state: pageLoadingProgressChanged(progress: 0.0, animated: false)
[2025-03-08 19:00:38] TabViewModel: processAction action: takeScreenshot(tabRootView: Optional(<Orion.NewTabRootView: 0x12232d000; frame = (0 0; 393 659); backgroundColor = <UIDynamicSystemColor: 0x300e7d840; name = systemGray6Color>; layer = <CALayer: 0x301a59040>>))
[2025-03-08 19:00:38] TabViewModel: processAction action: takeScreenshot(tabRootView: Optional(<Orion.NewTabRootView: 0x12232d000; frame = (0 0; 393 659); backgroundColor = <UIDynamicSystemColor: 0x300e7d840; name = systemGray6Color>; layer = <CALayer: 0x301a59040>>))
[2025-03-08 19:00:38] UIView.showHideAnimated: <Orion.GaussianBlurView: 0x122350a00; baseClass = UIVisualEffectView; frame = (0 0; 0 0); layer = <CALayer: 0x301ba9980>> effect=<UIBlurEffect: 0x3019217c0> style=UIBlurEffectStyleRegular, show: true, checkCurrent: false
[2025-03-08 19:00:42] BrowserContainerVC: storeSessionURLs
[2025-03-08 19:00:43] BrowserContainerVC: openOptionsPopover, hasURL: false
[2025-03-08 19:00:43] NewTabViewController ID 3: updatePopoverSourceView

Expected behavior

  • Last tab closed via Grid View should never reappear.

Additional Details

  • No extensions present.
  • I was unable to reproduce in Safari.
  • FYI, I have not tested on a clean profile as this is my main browser.
    • Please let me know if there is a straightforward way to enter a debug mode, enter a separate profile that would allow for quickly testing, or add a secondary "clean" orion for debug purposes.
      • Would be happy to regularly provide this information without resetting my personal configuration each time.
  • Feel free to reach out to me if you need additional information.

Device Information

  • App version: 1.3.18 (6) (WebKit 8620.2.4.10.7)
  • System version: 18.3.1

    @unsearchable Was able to reproduce the other issue we discussed. Not sure if this is the only way to trigger it, but it is one way.

      Great finding!

      Indeed it seems to be related with the tab + quick app close - or rather sending the app to background.

      Tried now a bunch of times, and when I closed the tab and immediately sent Orion to background (aka closed), I got the problem almost every time. Reopening orion after such scenario shows the grid view for me, with "like there's no tab", but I can see that the tab counter shows 1. Clicking on * will now reopen last tab and open second one.

      What's worth to add is that it doesn't always have to be a tab closed followed by app closing. It may be related to tabs closed quickly one after another as well, see attached video:

      Nice find! I did not catch this scenario, but thought there might be some more cases where the tab would reappear. I think this is the one that I encounter more often. Hopefully they have the same root cause and can be resolved together!

      I was able to consistently reproduce the scenario you presented as well.

      21 days later
      15 days later
      No one is typing