From 861ef37d92c111b8a7ed451edcec47aec229707e Mon Sep 17 00:00:00 2001 From: Matt Reagan Date: Mon, 18 May 2026 10:52:04 -0700 Subject: [PATCH 1/3] [FXIOS-13321] Initial fix for broken Find In Page UI behavior in PBM Clean-up Rename FindInPageBar so it's clear this is a deprecated property Comment [FXIOS-13321] Updates to Find In Page UI fix [FXIOS-13321] Cleanup, fix logic for refactor [FXIOS-13321] Limit to PBM Minor comment cleanup --- .../BrowserViewController+FindInPage.swift | 18 +++++++-------- .../Views/BrowserViewController.swift | 23 ++++++++++++++----- 2 files changed, 26 insertions(+), 15 deletions(-) diff --git a/firefox-ios/Client/Frontend/Browser/BrowserViewController/Extensions/BrowserViewController+FindInPage.swift b/firefox-ios/Client/Frontend/Browser/BrowserViewController/Extensions/BrowserViewController+FindInPage.swift index 853e8d49422ff..41b78dde6a8fc 100644 --- a/firefox-ios/Client/Frontend/Browser/BrowserViewController/Extensions/BrowserViewController+FindInPage.swift +++ b/firefox-ios/Client/Frontend/Browser/BrowserViewController/Extensions/BrowserViewController+FindInPage.swift @@ -34,19 +34,19 @@ extension BrowserViewController { // Used only on iOS 15 private func useCustomFindInteraction(isVisible: Bool, tab: Tab? = nil) { if isVisible { - if findInPageBar == nil { + if iOS15FindInPageBar == nil { setupFindInPage() } - self.findInPageBar?.becomeFirstResponder() - } else if let findInPageBar = self.findInPageBar { + self.iOS15FindInPageBar?.becomeFirstResponder() + } else if let findInPageBar = self.iOS15FindInPageBar { removeFindInPage(findInPageBar, tab: tab) } } private func setupFindInPage() { let findInPageBar = FindInPageBar() - self.findInPageBar = findInPageBar + self.iOS15FindInPageBar = findInPageBar findInPageBar.delegate = self bottomContentStackView.addArrangedViewToBottom(findInPageBar, animated: false, completion: { @@ -74,7 +74,7 @@ extension BrowserViewController { guard let webView = tab?.webView else { return } webView.evaluateJavascriptInDefaultContentWorld("__firefox__.findDone()") bottomContentStackView.removeArrangedView(findInPageBar) - self.findInPageBar = nil + self.iOS15FindInPageBar = nil updateConstraintsForFindInPageChanges() } @@ -93,12 +93,12 @@ extension BrowserViewController: FindInPageBarDelegate, FindInPageHelperDelegate } func findInPage(didFindNextWithText text: String) { - findInPageBar?.endEditing(true) + iOS15FindInPageBar?.endEditing(true) find(text, function: "findNext") } func findInPage(didFindPreviousWithText text: String) { - findInPageBar?.endEditing(true) + iOS15FindInPageBar?.endEditing(true) find(text, function: "findPrevious") } @@ -113,10 +113,10 @@ extension BrowserViewController: FindInPageBarDelegate, FindInPageHelperDelegate } func findInPageHelper(didUpdateCurrentResult currentResult: Int) { - findInPageBar?.currentResult = currentResult + iOS15FindInPageBar?.currentResult = currentResult } func findInPageHelper(didUpdateTotalResults totalResults: Int) { - findInPageBar?.totalResults = totalResults + iOS15FindInPageBar?.totalResults = totalResults } } diff --git a/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift b/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift index c88945398c349..38c516cc0d251 100644 --- a/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift +++ b/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift @@ -101,7 +101,7 @@ class BrowserViewController: UIViewController, var searchController: SearchViewController? var searchSessionState: SearchSessionState? var searchLoader: SearchLoader? - var findInPageBar: FindInPageBar? + var iOS15FindInPageBar: FindInPageBar? /* TODO: Remove once we drop iOS 15 support */ var zoomPageBar: ZoomPageBar? var addressBarPanGestureHandler: AddressBarPanGestureHandler? var microsurvey: MicrosurveyPromptView? @@ -837,9 +837,20 @@ class BrowserViewController: UIViewController, processAppleIntelligenceState() privacyWindowHelper.removeWindow() - if let tab = tabManager.selectedTab, !tab.isFindInPageMode { - // Re-show toolbar which might have been hidden during scrolling (prior to app moving into the background) - scrollController.showToolbars(animated: false) + if let tab = tabManager.selectedTab { + if tab.isFindInPageMode { + if #available(iOS 16, *) { + if tab.isPrivate, let webView = tab.webView, webView.isFindInteractionEnabled { + // Ensure keyboard is available and Find In Page UI is refreshed in PBM + let text = webView.findInteraction?.searchText + updateFindInPageVisibility(isVisible: true) + webView.findInteraction?.searchText = text ?? "" + } + } + } else { + // Re-show toolbar which might have been hidden during scrolling (prior to app moving into the background) + scrollController.showToolbars(animated: false) + } } navigationHandler?.showTermsOfUse(context: .appBecameActive) @@ -4438,7 +4449,7 @@ extension BrowserViewController: LegacyTabDelegate { func tab(_ tab: Tab, didSelectFindInPageForSelection selection: String) { updateFindInPageVisibility(isVisible: true, withSearchText: selection) - findInPageBar?.text = selection + iOS15FindInPageBar?.text = selection } func tab(_ tab: Tab, didSelectSearchWithFirefoxForSelection selection: String) { @@ -5051,7 +5062,7 @@ extension BrowserViewController: KeyboardHelperDelegate { ) } tabManager.selectedTab?.setFindInPage(isBottomSearchBar: isBottomSearchBar, - doesFindInPageBarExist: findInPageBar != nil) + doesFindInPageBarExist: iOS15FindInPageBar != nil) guard isSwipingTabsEnabled else { return } addressBarPanGestureHandler?.enablePanGestureOnHomepageIfNeeded() } From e3901a89e018240abc8785c5bbe581a22a074c80 Mon Sep 17 00:00:00 2001 From: Matt Reagan Date: Wed, 20 May 2026 11:57:03 -0700 Subject: [PATCH 2/3] [FXIOS-13321] Refactor for readability --- .../Views/BrowserViewController.swift | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift b/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift index 38c516cc0d251..959a42fb78777 100644 --- a/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift +++ b/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift @@ -839,14 +839,7 @@ class BrowserViewController: UIViewController, if let tab = tabManager.selectedTab { if tab.isFindInPageMode { - if #available(iOS 16, *) { - if tab.isPrivate, let webView = tab.webView, webView.isFindInteractionEnabled { - // Ensure keyboard is available and Find In Page UI is refreshed in PBM - let text = webView.findInteraction?.searchText - updateFindInPageVisibility(isVisible: true) - webView.findInteraction?.searchText = text ?? "" - } - } + refreshFindInPageUI() } else { // Re-show toolbar which might have been hidden during scrolling (prior to app moving into the background) scrollController.showToolbars(animated: false) @@ -1733,6 +1726,17 @@ class BrowserViewController: UIViewController, hasZoomPageBar: zoomPageBar != nil) } + func refreshFindInPageUI() { + guard #available(iOS 16, *) else { return } + guard let tab = tabManager.selectedTab else { return } + guard tab.isPrivate, let webView = tab.webView, webView.isFindInteractionEnabled else { return } + + // Ensure keyboard is available and Find In Page UI is refreshed in PBM (FXIOS-13321) + let text = webView.findInteraction?.searchText + updateFindInPageVisibility(isVisible: true) + webView.findInteraction?.searchText = text ?? "" + } + // TODO: SnapKit removal clean up private func updateSnapKitOverKeyboardContainerConstraints() { guard !isSnapKitRemovalEnabled else { return } From 3959983e5575aebe7d97d5bc5b2b24424df0a4f8 Mon Sep 17 00:00:00 2001 From: Matt Reagan Date: Wed, 20 May 2026 12:24:00 -0700 Subject: [PATCH 3/3] [FXIOS-13321] Change fix, address root issue to avoid keyboard being hidden in PBM --- .../Views/BrowserViewController.swift | 21 +++---------------- firefox-ios/Client/PrivacyWindowHelper.swift | 4 +++- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift b/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift index 959a42fb78777..3885caea212ad 100644 --- a/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift +++ b/firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift @@ -837,13 +837,9 @@ class BrowserViewController: UIViewController, processAppleIntelligenceState() privacyWindowHelper.removeWindow() - if let tab = tabManager.selectedTab { - if tab.isFindInPageMode { - refreshFindInPageUI() - } else { - // Re-show toolbar which might have been hidden during scrolling (prior to app moving into the background) - scrollController.showToolbars(animated: false) - } + if let tab = tabManager.selectedTab, !tab.isFindInPageMode { + // Re-show toolbar which might have been hidden during scrolling (prior to app moving into the background) + scrollController.showToolbars(animated: false) } navigationHandler?.showTermsOfUse(context: .appBecameActive) @@ -1726,17 +1722,6 @@ class BrowserViewController: UIViewController, hasZoomPageBar: zoomPageBar != nil) } - func refreshFindInPageUI() { - guard #available(iOS 16, *) else { return } - guard let tab = tabManager.selectedTab else { return } - guard tab.isPrivate, let webView = tab.webView, webView.isFindInteractionEnabled else { return } - - // Ensure keyboard is available and Find In Page UI is refreshed in PBM (FXIOS-13321) - let text = webView.findInteraction?.searchText - updateFindInPageVisibility(isVisible: true) - webView.findInteraction?.searchText = text ?? "" - } - // TODO: SnapKit removal clean up private func updateSnapKitOverKeyboardContainerConstraints() { guard !isSnapKitRemovalEnabled else { return } diff --git a/firefox-ios/Client/PrivacyWindowHelper.swift b/firefox-ios/Client/PrivacyWindowHelper.swift index ff388bfdbcaf5..63e9abeadf683 100644 --- a/firefox-ios/Client/PrivacyWindowHelper.swift +++ b/firefox-ios/Client/PrivacyWindowHelper.swift @@ -16,7 +16,9 @@ final class PrivacyWindowHelper { privacyWindow?.rootViewController?.view.backgroundColor = color // Set the privacy window level to be above alert windows (highest in importance). privacyWindow?.windowLevel = .alert + 1 - privacyWindow?.makeKeyAndVisible() + // Avoid makeKeyAndVisible(), becoming key steals first responder + // and causses iOS keyboard to dismiss on background/foreground in private mode. + privacyWindow?.isHidden = false } @MainActor