Skip to content

Commit 0f82796

Browse files
FilippoZazzeroniFilippo
authored andcommitted
Bugfix [Add new tab gesture] FXIOS issues on new Tab gesture (#27993)
* Added new tab page settings for the AddressbarPanGestureHandler * Fix new tab page * Add missing tests * Refactor code for better readability * Refactor as per code review --------- Co-authored-by: Filippo <[email protected]> (cherry picked from commit 0023ba8)
1 parent 2d2a8b3 commit 0f82796

File tree

8 files changed

+107
-13
lines changed

8 files changed

+107
-13
lines changed

BrowserKit/Sources/ToolbarKit/AddressToolbar/AddressToolbarAddTabView.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public final class AddressToolbarAddTabView: UIView,
3232

3333
public func configure(_ configuration: AddressToolbarUXConfiguration) {
3434
layer.cornerRadius = configuration.toolbarCornerRadius
35+
layer.shadowRadius = configuration.toolbarCornerRadius
3536
}
3637

3738
public func showHideAddTabIcon(shouldShow: Bool) {
@@ -41,6 +42,7 @@ public final class AddressToolbarAddTabView: UIView,
4142
// MARK: - ThemeApplicable
4243

4344
public func applyTheme(theme: any Theme) {
45+
layer.shadowColor = theme.colors.shadowStrong.cgColor
4446
plusIconView.tintColor = theme.colors.textPrimary
4547
backgroundColor = theme.colors.layerSurfaceMedium
4648
}

firefox-ios/Client/Coordinators/Browser/BrowserCoordinator.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,16 @@ class BrowserCoordinator: BaseCoordinator,
162162
}
163163

164164
func homepageScreenshotTool() -> (any Screenshotable)? {
165-
if tabManager.selectedTab?.isPrivate == true {
166-
return privateHomepageViewController
165+
let newTabSettings = browserViewController.newTabSettings
166+
switch newTabSettings {
167+
case .blankPage, .homePage:
168+
return nil
169+
case .topSites:
170+
if tabManager.selectedTab?.isPrivate == true {
171+
return privateHomepageViewController
172+
}
173+
return homepageViewController ?? legacyHomepageViewController
167174
}
168-
return homepageViewController ?? legacyHomepageViewController
169175
}
170176

171177
func setHomepageVisibility(isVisible: Bool) {

firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -970,6 +970,7 @@ class BrowserViewController: UIViewController,
970970
statusBarOverlay.hasTopTabs = toolbarHelper.shouldShowTopTabs(for: traitCollection)
971971
statusBarOverlay.applyTheme(theme: theme)
972972
topTabsViewController?.applyTheme()
973+
webPagePreview.applyTheme(theme: theme)
973974

974975
KeyboardHelper.defaultHelper.addDelegate(self)
975976
listenForThemeChange(view)
@@ -1247,7 +1248,8 @@ class BrowserViewController: UIViewController,
12471248
statusBarOverlay: statusBarOverlay,
12481249
tabManager: tabManager,
12491250
windowUUID: windowUUID,
1250-
screenshotHelper: screenshotHelper
1251+
screenshotHelper: screenshotHelper,
1252+
prefs: profile.prefs
12511253
)
12521254
}
12531255

@@ -1288,6 +1290,9 @@ class BrowserViewController: UIViewController,
12881290
addressBarPanGestureHandler?.homepageScreenshotToolProvider = { [weak self] in
12891291
return self?.browserDelegate?.homepageScreenshotTool()
12901292
}
1293+
addressBarPanGestureHandler?.newTabSettingsProvider = { [weak self] in
1294+
return self?.newTabSettings
1295+
}
12911296
}
12921297
}
12931298

@@ -4791,8 +4796,8 @@ extension BrowserViewController: TopTabsDelegate {
47914796
}
47924797

47934798
func topTabsDidPressNewTab(_ isPrivate: Bool) {
4794-
let shouldLoadCustomHomePage = isToolbarRefactorEnabled && NewTabAccessors.getHomePage(profile.prefs) == .homePage
4795-
let homePageURL = HomeButtonHomePageAccessors.getHomePage(profile.prefs)
4799+
let shouldLoadCustomHomePage = isToolbarRefactorEnabled && newTabSettings == .homePage
4800+
let homePageURL = NewTabHomePageAccessors.getHomePage(profile.prefs)
47964801

47974802
if shouldLoadCustomHomePage, let url = homePageURL {
47984803
openBlankNewTab(focusLocationField: false, isPrivate: isPrivate)

firefox-ios/Client/Frontend/Browser/Toolbars/AddressBarPanGestureHandler.swift

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import UIKit
66
import Common
77
import Redux
8+
import Shared
89

910
final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
1011
typealias SubscriberStateType = ToolbarState
@@ -30,8 +31,10 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
3031
private let windowUUID: WindowUUID
3132
private let screenshotHelper: ScreenshotHelper?
3233
var homepageScreenshotToolProvider: (() -> Screenshotable?)?
34+
var newTabSettingsProvider: (() -> NewTabPage?)?
3335
private var homepageScreenshot: UIImage?
3436
private var toolbarState: ToolbarState?
37+
private let prefs: Prefs
3538

3639
private var isRTL: Bool {
3740
return UIView.userInterfaceLayoutDirection(
@@ -47,7 +50,8 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
4750
statusBarOverlay: StatusBarOverlay,
4851
tabManager: TabManager,
4952
windowUUID: WindowUUID,
50-
screenshotHelper: ScreenshotHelper?
53+
screenshotHelper: ScreenshotHelper?,
54+
prefs: Prefs
5155
) {
5256
self.addressToolbarContainer = addressToolbarContainer
5357
self.contentContainer = contentContainer
@@ -56,6 +60,7 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
5660
self.windowUUID = windowUUID
5761
self.screenshotHelper = screenshotHelper
5862
self.statusBarOverlay = statusBarOverlay
63+
self.prefs = prefs
5964
super.init()
6065
subscribeToRedux()
6166
setupGesture()
@@ -141,7 +146,8 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
141146
)
142147
)
143148
statusBarOverlay.showOverlay(animated: !UIAccessibility.isReduceMotionEnabled)
144-
if nextTab == nil {
149+
case .changed:
150+
if nextTab == nil, homepageScreenshot == nil {
145151
let homepageScreenshotTool = homepageScreenshotToolProvider?()
146152
homepageScreenshot = homepageScreenshotTool?.screenshot(bounds: CGRect(
147153
x: 0.0,
@@ -150,7 +156,6 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
150156
height: webPagePreview.frame.height
151157
))
152158
}
153-
case .changed:
154159
handleGestureChangedState(translation: translation, nextTab: nextTab)
155160
case .ended, .cancelled, .failed:
156161
let velocity = gesture.velocity(in: contentContainer)
@@ -160,7 +165,6 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
160165
}
161166

162167
private func handleGestureChangedState(translation: CGPoint, nextTab: Tab?) {
163-
webPagePreview.isHidden = false
164168
let shouldAddNewTab = shouldAddNewTab(translation: translation.x, nextTab: nextTab)
165169
applyCurrentTabTransform(translation.x, shouldAddNewTab: shouldAddNewTab)
166170
applyPreviewTransform(translation: translation)
@@ -172,7 +176,15 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
172176
let translation = width * (1 - progress)
173177
webPagePreview.transform = CGAffineTransform(scaleX: scale, y: scale).translatedBy(x: translation, y: 0.0)
174178
webPagePreview.alpha = progress
175-
webPagePreview.setScreenshot(homepageScreenshot)
179+
let pageSetting = newTabSettingsProvider?()
180+
switch pageSetting {
181+
case .homePage:
182+
webPagePreview.setScreenshot(url: NewTabHomePageAccessors.getHomePage(prefs))
183+
case .topSites:
184+
webPagePreview.setScreenshot(homepageScreenshot)
185+
case nil, .blankPage:
186+
webPagePreview.setScreenshot(url: nil)
187+
}
176188
} else {
177189
webPagePreview.alpha = 1.0
178190
webPagePreview.setScreenshot(nextTab)
@@ -207,8 +219,8 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
207219
webPagePreview.alpha = shouldCompleteTransition ? 1.0 : 0.0
208220
webPagePreview.transform = shouldCompleteTransition ? .identity : previewTransform
209221
} completion: { [self] _ in
210-
webPagePreview.isHidden = true
211222
webPagePreview.transitionDidEnd()
223+
homepageScreenshot = nil
212224

213225
if shouldCompleteTransition {
214226
store.dispatchLegacy(

firefox-ios/Client/Frontend/Browser/Toolbars/AddressToolbarContainer.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -379,6 +379,9 @@ final class AddressToolbarContainer: UIView,
379379
rightSkeletonAddressBar.transform = transform
380380
if shouldAddNewTab {
381381
let percentageTransform = abs(transform.tx) / bounds.width
382+
if transform == .identity {
383+
addNewTabView.showHideAddTabIcon(shouldShow: false)
384+
}
382385
UIView.animate(withDuration: UX.addNewTabFadeAnimationDuration) {
383386
self.addNewTabView.showHideAddTabIcon(shouldShow:
384387
percentageTransform > UX.addNewTabPercentageAnimationThreshold)

firefox-ios/Client/TabManagement/TabWebViewPreview.swift

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,13 @@ import UIKit
66
import SiteImageView
77
import Common
88

9-
final class TabWebViewPreview: UIView {
9+
final class TabWebViewPreview: UIView, ThemeApplicable {
1010
private struct UX {
1111
static let faviconCornerRadius: CGFloat = 20.0
1212
static let faviconImageViewSize: CGFloat = 45.0
13+
static let backgroundShadowCornerRadius: CGFloat = 14.0
14+
static let backgroundShadowOpacity: Float = 1
15+
static let backgroundShadowOffset = CGSize(width: 0, height: 2)
1316
}
1417
private lazy var webPageScreenshotImageView: UIImageView = .build {
1518
$0.contentMode = .top
@@ -34,6 +37,12 @@ final class TabWebViewPreview: UIView {
3437

3538
// MARK: - Layout
3639
private func setupLayout() {
40+
layer.shadowRadius = UX.backgroundShadowCornerRadius
41+
layer.cornerRadius = screenCornerRadius
42+
layer.shadowOpacity = UX.backgroundShadowOpacity
43+
layer.shadowOffset = UX.backgroundShadowOffset
44+
layer.masksToBounds = false
45+
3746
webPageScreenshotImageView.layer.cornerRadius = screenCornerRadius
3847
addSubviews(webPageScreenshotImageView, faviconImageView)
3948

@@ -83,6 +92,13 @@ final class TabWebViewPreview: UIView {
8392
}
8493
}
8594

95+
func setScreenshot(url: URL? = nil) {
96+
faviconImageView.isHidden = url == nil
97+
webPageScreenshotImageView.isHidden = true
98+
faviconImageView.setFavicon(FaviconImageViewModel(siteURLString: url?.absoluteString,
99+
faviconCornerRadius: UX.faviconCornerRadius))
100+
}
101+
86102
func setScreenshot(_ image: UIImage?) {
87103
faviconImageView.isHidden = true
88104
webPageScreenshotImageView.isHidden = false
@@ -96,4 +112,11 @@ final class TabWebViewPreview: UIView {
96112
func transitionDidEnd() {
97113
layoutWasInvalidated = false
98114
}
115+
116+
// MARK: - ThemeApplicable
117+
118+
func applyTheme(theme: any Theme) {
119+
backgroundColor = theme.colors.layerSurfaceMedium
120+
layer.shadowColor = theme.colors.shadowStrong.cgColor
121+
}
99122
}

firefox-ios/firefox-ios-tests/Tests/ClientTests/Coordinators/BrowserCoordinatorTests.swift

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ final class BrowserCoordinatorTests: XCTestCase, FeatureFlaggable {
145145

146146
func testHomepageScreenshotTool_returnsHomepage_forNormalTab() throws {
147147
let subject = createSubject()
148+
subject.browserViewController = browserViewController
148149
subject.showHomepage(
149150
overlayManager: overlayModeManager,
150151
isZeroSearch: false,
@@ -156,8 +157,36 @@ final class BrowserCoordinatorTests: XCTestCase, FeatureFlaggable {
156157
XCTAssertTrue(screenshotTool is HomepageViewController)
157158
}
158159

160+
func testHomepageScreenshotTool_returnsNil_forNewBlankNewTab() throws {
161+
let subject = createSubject()
162+
subject.browserViewController = browserViewController
163+
browserViewController.overrideNewTabSettings = .blankPage
164+
subject.showHomepage(
165+
overlayManager: overlayModeManager,
166+
isZeroSearch: false,
167+
statusBarScrollDelegate: scrollDelegate,
168+
toastContainer: UIView()
169+
)
170+
XCTAssertNil(subject.homepageScreenshotTool())
171+
}
172+
173+
func testHomepageScreenshotTool_returnsNil_forNewCustomURLNewTab() throws {
174+
let subject = createSubject()
175+
subject.browserViewController = browserViewController
176+
browserViewController.overrideNewTabSettings = .homePage
177+
subject.showHomepage(
178+
overlayManager: overlayModeManager,
179+
isZeroSearch: false,
180+
statusBarScrollDelegate: scrollDelegate,
181+
toastContainer: UIView()
182+
)
183+
184+
XCTAssertNil(subject.homepageScreenshotTool())
185+
}
186+
159187
func testHomepageScreenshotTool_returnsLegacyHomepage_forNormalTab() throws {
160188
let subject = createSubject()
189+
browserViewController.overrideNewTabSettings = .topSites
161190
subject.showLegacyHomepage(
162191
inline: false,
163192
toastContainer: UIView(),
@@ -173,6 +202,7 @@ final class BrowserCoordinatorTests: XCTestCase, FeatureFlaggable {
173202

174203
func testHomepageScreenshotTool_returnsPrivateHomepage_forPrivateTab() throws {
175204
let subject = createSubject()
205+
browserViewController.overrideNewTabSettings = .topSites
176206
let tab = tabManager.addTab(nil, afterTab: nil, zombie: false, isPrivate: true)
177207
tabManager.selectTab(tab)
178208
subject.showPrivateHomepage(overlayManager: overlayModeManager)

firefox-ios/firefox-ios-tests/Tests/ClientTests/Mocks/MockBrowserViewController.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,19 @@ class MockBrowserViewController: BrowserViewController {
5858

5959
var viewControllerToPresent: UIViewController?
6060

61+
var createWebViewCalled = 0
62+
var runJavaScriptAlertPanelCalled = 0
63+
var runJavaScriptConfirmPanelCalled = 0
64+
var runJavaScriptTextInputPanelCalled = 0
65+
var webViewDidCloseCalled = 0
66+
var contextMenuConfigurationCalled = 0
67+
var requestMediaCapturePermissionCalled = 0
68+
var contextMenuDidEndForElementCalled = 0
69+
override var newTabSettings: NewTabPage {
70+
return overrideNewTabSettings
71+
}
72+
var overrideNewTabSettings: NewTabPage = .topSites
73+
6174
override var presentedViewController: UIViewController? {
6275
return viewControllerToPresent
6376
}

0 commit comments

Comments
 (0)