Skip to content

Commit 0023ba8

Browse files
FilippoZazzeroniFilippo
andauthored
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]>
1 parent dbffbe5 commit 0023ba8

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
@@ -983,6 +983,7 @@ class BrowserViewController: UIViewController,
983983
statusBarOverlay.hasTopTabs = toolbarHelper.shouldShowTopTabs(for: traitCollection)
984984
statusBarOverlay.applyTheme(theme: theme)
985985
topTabsViewController?.applyTheme()
986+
webPagePreview.applyTheme(theme: theme)
986987

987988
KeyboardHelper.defaultHelper.addDelegate(self)
988989
listenForThemeChange(view)
@@ -1260,7 +1261,8 @@ class BrowserViewController: UIViewController,
12601261
statusBarOverlay: statusBarOverlay,
12611262
tabManager: tabManager,
12621263
windowUUID: windowUUID,
1263-
screenshotHelper: screenshotHelper
1264+
screenshotHelper: screenshotHelper,
1265+
prefs: profile.prefs
12641266
)
12651267
}
12661268

@@ -1301,6 +1303,9 @@ class BrowserViewController: UIViewController,
13011303
addressBarPanGestureHandler?.homepageScreenshotToolProvider = { [weak self] in
13021304
return self?.browserDelegate?.homepageScreenshotTool()
13031305
}
1306+
addressBarPanGestureHandler?.newTabSettingsProvider = { [weak self] in
1307+
return self?.newTabSettings
1308+
}
13041309
}
13051310
}
13061311

@@ -4804,8 +4809,8 @@ extension BrowserViewController: TopTabsDelegate {
48044809
}
48054810

48064811
func topTabsDidPressNewTab(_ isPrivate: Bool) {
4807-
let shouldLoadCustomHomePage = isToolbarRefactorEnabled && NewTabAccessors.getHomePage(profile.prefs) == .homePage
4808-
let homePageURL = HomeButtonHomePageAccessors.getHomePage(profile.prefs)
4812+
let shouldLoadCustomHomePage = isToolbarRefactorEnabled && newTabSettings == .homePage
4813+
let homePageURL = NewTabHomePageAccessors.getHomePage(profile.prefs)
48094814

48104815
if shouldLoadCustomHomePage, let url = homePageURL {
48114816
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()
@@ -153,7 +158,8 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
153158
)
154159
)
155160
statusBarOverlay.showOverlay(animated: !UIAccessibility.isReduceMotionEnabled)
156-
if nextTab == nil {
161+
case .changed:
162+
if nextTab == nil, homepageScreenshot == nil {
157163
let homepageScreenshotTool = homepageScreenshotToolProvider?()
158164
homepageScreenshot = homepageScreenshotTool?.screenshot(bounds: CGRect(
159165
x: 0.0,
@@ -162,7 +168,6 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
162168
height: webPagePreview.frame.height
163169
))
164170
}
165-
case .changed:
166171
handleGestureChangedState(translation: translation, nextTab: nextTab)
167172
case .ended, .cancelled, .failed:
168173
let velocity = gesture.velocity(in: contentContainer)
@@ -172,7 +177,6 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
172177
}
173178

174179
private func handleGestureChangedState(translation: CGPoint, nextTab: Tab?) {
175-
webPagePreview.isHidden = false
176180
let shouldAddNewTab = shouldAddNewTab(translation: translation.x, nextTab: nextTab)
177181
applyCurrentTabTransform(translation.x, shouldAddNewTab: shouldAddNewTab)
178182
applyPreviewTransform(translation: translation)
@@ -184,7 +188,15 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
184188
let translation = width * (1 - progress)
185189
webPagePreview.transform = CGAffineTransform(scaleX: scale, y: scale).translatedBy(x: translation, y: 0.0)
186190
webPagePreview.alpha = progress
187-
webPagePreview.setScreenshot(homepageScreenshot)
191+
let pageSetting = newTabSettingsProvider?()
192+
switch pageSetting {
193+
case .homePage:
194+
webPagePreview.setScreenshot(url: NewTabHomePageAccessors.getHomePage(prefs))
195+
case .topSites:
196+
webPagePreview.setScreenshot(homepageScreenshot)
197+
case nil, .blankPage:
198+
webPagePreview.setScreenshot(url: nil)
199+
}
188200
} else {
189201
webPagePreview.alpha = 1.0
190202
webPagePreview.setScreenshot(nextTab)
@@ -220,8 +232,8 @@ final class AddressBarPanGestureHandler: NSObject, StoreSubscriber {
220232
webPagePreview.alpha = shouldCompleteTransition ? 1.0 : 0.0
221233
webPagePreview.transform = shouldCompleteTransition ? .identity : previewTransform
222234
} completion: { [self] _ in
223-
webPagePreview.isHidden = true
224235
webPagePreview.transitionDidEnd()
236+
homepageScreenshot = nil
225237

226238
if shouldCompleteTransition {
227239
store.dispatchLegacy(

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,9 @@ final class AddressToolbarContainer: UIView,
383383
rightSkeletonAddressBar.transform = transform
384384
if shouldAddNewTab {
385385
let percentageTransform = abs(transform.tx) / bounds.width
386+
if transform == .identity {
387+
addNewTabView.showHideAddTabIcon(shouldShow: false)
388+
}
386389
UIView.animate(withDuration: UX.addNewTabFadeAnimationDuration) {
387390
self.addNewTabView.showHideAddTabIcon(shouldShow:
388391
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
@@ -146,6 +146,7 @@ final class BrowserCoordinatorTests: XCTestCase, FeatureFlaggable {
146146

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

161+
func testHomepageScreenshotTool_returnsNil_forNewBlankNewTab() throws {
162+
let subject = createSubject()
163+
subject.browserViewController = browserViewController
164+
browserViewController.overrideNewTabSettings = .blankPage
165+
subject.showHomepage(
166+
overlayManager: overlayModeManager,
167+
isZeroSearch: false,
168+
statusBarScrollDelegate: scrollDelegate,
169+
toastContainer: UIView()
170+
)
171+
XCTAssertNil(subject.homepageScreenshotTool())
172+
}
173+
174+
func testHomepageScreenshotTool_returnsNil_forNewCustomURLNewTab() throws {
175+
let subject = createSubject()
176+
subject.browserViewController = browserViewController
177+
browserViewController.overrideNewTabSettings = .homePage
178+
subject.showHomepage(
179+
overlayManager: overlayModeManager,
180+
isZeroSearch: false,
181+
statusBarScrollDelegate: scrollDelegate,
182+
toastContainer: UIView()
183+
)
184+
185+
XCTAssertNil(subject.homepageScreenshotTool())
186+
}
187+
160188
func testHomepageScreenshotTool_returnsLegacyHomepage_forNormalTab() throws {
161189
let subject = createSubject()
190+
browserViewController.overrideNewTabSettings = .topSites
162191
subject.showLegacyHomepage(
163192
inline: false,
164193
toastContainer: UIView(),
@@ -175,6 +204,7 @@ final class BrowserCoordinatorTests: XCTestCase, FeatureFlaggable {
175204
@MainActor
176205
func testHomepageScreenshotTool_returnsPrivateHomepage_forPrivateTab() throws {
177206
let subject = createSubject()
207+
browserViewController.overrideNewTabSettings = .topSites
178208
let tab = tabManager.addTab(nil, afterTab: nil, zombie: false, isPrivate: true)
179209
tabManager.selectTab(tab)
180210
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)