From 27c2afad70b7c575b11d91dabcbca662c58e658b Mon Sep 17 00:00:00 2001 From: Tomas Strba Date: Tue, 25 Nov 2025 12:52:32 +0100 Subject: [PATCH 01/40] Feature flag --- .../Sources/FeatureFlags/FeatureFlag.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/macOS/LocalPackages/FeatureFlags/Sources/FeatureFlags/FeatureFlag.swift b/macOS/LocalPackages/FeatureFlags/Sources/FeatureFlags/FeatureFlag.swift index b5756f22fc9..1db283e78ed 100644 --- a/macOS/LocalPackages/FeatureFlags/Sources/FeatureFlags/FeatureFlag.swift +++ b/macOS/LocalPackages/FeatureFlags/Sources/FeatureFlags/FeatureFlag.swift @@ -298,6 +298,10 @@ public enum FeatureFlag: String, CaseIterable { /// Show popup permission button in inactive state when temporary allowance is active /// https://app.asana.com/1/137249556945/project/1211834678943996/task/1212017701300919?focus=true case popupPermissionButtonPersistence + + /// New permission management view + /// https://app.asana.com/1/137249556945/project/1148564399326804/task/1211985993948718?focus=true + case newPermissionView } extension FeatureFlag: FeatureFlagDescribing { @@ -421,7 +425,8 @@ extension FeatureFlag: FeatureFlagDescribing { .extendedUserInitiatedPopupTimeout, .suppressEmptyPopUpsOnApproval, .allowPopupsForCurrentPage, - .popupPermissionButtonPersistence: + .popupPermissionButtonPersistence, + .newPermissionView: return true case .sslCertificatesBypass, .appendAtbToSerpQueries, @@ -616,7 +621,10 @@ extension FeatureFlag: FeatureFlagDescribing { return .remoteReleasable(.subfeature(PopupBlockingSubfeature.allowPopupsForCurrentPage)) case .popupPermissionButtonPersistence: return .remoteReleasable(.subfeature(PopupBlockingSubfeature.popupPermissionButtonPersistence)) + case .newPermissionView: + return .internalOnly() } + } } From bb08041290fe97ef4f7d35ed55588135383acfa4 Mon Sep 17 00:00:00 2001 From: Tomas Strba Date: Tue, 25 Nov 2025 13:48:53 +0100 Subject: [PATCH 02/40] Legacy permission flow disabled when feature flag is on --- .../Features/PrivacyFeature.swift | 3 +++ .../AddressBarButtonsViewController.swift | 19 ++++++++++++------- .../View/NavigationBar.storyboard | 6 +++--- .../Sources/FeatureFlags/FeatureFlag.swift | 2 +- 4 files changed, 19 insertions(+), 11 deletions(-) diff --git a/SharedPackages/BrowserServicesKit/Sources/BrowserServicesKit/PrivacyConfig/Features/PrivacyFeature.swift b/SharedPackages/BrowserServicesKit/Sources/BrowserServicesKit/PrivacyConfig/Features/PrivacyFeature.swift index fb1d3dedd24..eafc1ff9a8b 100644 --- a/SharedPackages/BrowserServicesKit/Sources/BrowserServicesKit/PrivacyConfig/Features/PrivacyFeature.swift +++ b/SharedPackages/BrowserServicesKit/Sources/BrowserServicesKit/PrivacyConfig/Features/PrivacyFeature.swift @@ -145,6 +145,9 @@ public enum MacOSBrowserConfigSubfeature: String, PrivacySubfeature { /// Pinned Tabs AppKit Rewrite Feature Flag /// https://app.asana.com/1/137249556945/project/1201048563534612/task/1209949983074592?focus=true case pinnedTabsViewRewrite + + /// Hang reporting feature flag + case newPermissionView } public enum iOSBrowserConfigSubfeature: String, PrivacySubfeature { diff --git a/macOS/DuckDuckGo/NavigationBar/View/AddressBarButtonsViewController.swift b/macOS/DuckDuckGo/NavigationBar/View/AddressBarButtonsViewController.swift index 1f43518e50c..cd84c0243f2 100644 --- a/macOS/DuckDuckGo/NavigationBar/View/AddressBarButtonsViewController.swift +++ b/macOS/DuckDuckGo/NavigationBar/View/AddressBarButtonsViewController.swift @@ -523,13 +523,13 @@ final class AddressBarButtonsViewController: NSViewController { permissionsCancellables.removeAll(keepingCapacity: true) tabViewModel?.$usedPermissions.dropFirst().sink { [weak self] _ in - self?.updatePermissionButtons() + self?.updateLegacyPermissionButtons() }.store(in: &permissionsCancellables) tabViewModel?.tab.popupHandling?.popupOpenedPublisher.sink { [weak self] _ in - self?.updatePermissionButtons() + self?.updateLegacyPermissionButtons() }.store(in: &permissionsCancellables) tabViewModel?.$permissionAuthorizationQuery.dropFirst().sink { [weak self] _ in - self?.updatePermissionButtons() + self?.updateLegacyPermissionButtons() }.store(in: &permissionsCancellables) } @@ -590,11 +590,16 @@ final class AddressBarButtonsViewController: NSViewController { .store(in: &cancellables) } - private func updatePermissionButtons() { + private func updateLegacyPermissionButtons() { // Prevent crash if Combine subscriptions outlive view lifecycle guard isViewLoaded else { return } guard let tabViewModel else { return } + guard !featureFlagger.isFeatureOn(.newPermissionView) else { + permissionButtons.isShown = false + return + } + // Show permission buttons when there's a requested permission on NTP even if address bar is focused, // since NTP has the address bar focused by default let hasRequestedPermission = tabViewModel.usedPermissions.values.contains(where: { $0.isRequested }) @@ -1492,7 +1497,7 @@ final class AddressBarButtonsViewController: NSViewController { updateImageButton() updatePrivacyDashboardButton() - updatePermissionButtons() + updateLegacyPermissionButtons() updateBookmarkButtonVisibility() updateZoomButtonVisibility() if !isToggleFeatureEnabled { @@ -1816,7 +1821,7 @@ final class AddressBarButtonsViewController: NSViewController { trackerAnimationView?.isHidden = true guard let self else { return } updatePrivacyEntryPointIcon() - updatePermissionButtons() + updateLegacyPermissionButtons() // If badge animation is not queueued check if we should animate the privacy shield if buttonsBadgeAnimator.queuedAnimation == nil { playPrivacyInfoHighlightAnimationIfNecessary() @@ -1827,7 +1832,7 @@ final class AddressBarButtonsViewController: NSViewController { } updatePrivacyEntryPointIcon() - updatePermissionButtons() + updateLegacyPermissionButtons() } private func stopAnimations(trackerAnimations: Bool = true, diff --git a/macOS/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard b/macOS/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard index 385cdf86f40..ea49c6f94d0 100644 --- a/macOS/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard +++ b/macOS/DuckDuckGo/NavigationBar/View/NavigationBar.storyboard @@ -909,7 +909,7 @@ - + - - +