From 0c84df23e46b7de88a20618ca03da33a0138981c Mon Sep 17 00:00:00 2001 From: Alessandro Boron Date: Mon, 15 Apr 2024 21:35:03 +1000 Subject: [PATCH 1/8] Update Sparkle to 2.6.0 (#2450) Task/Issue URL: https://app.asana.com/0/0/1206873880033587/f --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../project.xcworkspace/xcshareddata/swiftpm/Package.resolved | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index 55941a8752..ba6aeca66d 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -14560,7 +14560,7 @@ repositoryURL = "https://github.com/sparkle-project/Sparkle.git"; requirement = { kind = exactVersion; - version = 2.5.2; + version = 2.6.0; }; }; B65CD8C92B316DF100A595BB /* XCRemoteSwiftPackageReference "swift-snapshot-testing" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index 48d2d9aea8..a567f97be3 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -113,8 +113,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/sparkle-project/Sparkle.git", "state" : { - "revision" : "47d3d90aee3c52b6f61d04ceae426e607df62347", - "version" : "2.5.2" + "revision" : "0a4caaf7a81eea2cece651ef4b17331fa0634dff", + "version" : "2.6.0" } }, { From 1695f1866f2ab4b6ab44f827731445eb5e17c237 Mon Sep 17 00:00:00 2001 From: Michal Smaga Date: Mon, 15 Apr 2024 14:27:49 +0200 Subject: [PATCH 2/8] Update the title capitalization style (#2624) Task/Issue URL: https://app.asana.com/0/1199230911884351/1206924693423599/f **Description**: "Your subscription is being activated" should be in sentence case. **Steps to test this PR**: Getting the "Your subscription is being activated" state during subscription purchase may be hard to replicate as it requires BE failure. To force trigger the state, please hardcode for the `statePublisher` in `PreferencesSubscriptionModel` to always return `PreferencesSubscriptionState.subscriptionPendingActivation`. --- ###### Internal references: [Pull Request Review Checklist](https://app.asana.com/0/1202500774821704/1203764234894239/f) [Software Engineering Expectations](https://app.asana.com/0/59792373528535/199064865822552) [Technical Design Template](https://app.asana.com/0/59792373528535/184709971311943) [Pull Request Documentation](https://app.asana.com/0/1202500774821704/1204012835277482/f) --- .../SubscriptionUI/Sources/SubscriptionUI/UserText.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/UserText.swift b/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/UserText.swift index 645253c3a4..3d344a38c9 100644 --- a/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/UserText.swift +++ b/LocalPackages/SubscriptionUI/Sources/SubscriptionUI/UserText.swift @@ -75,7 +75,7 @@ enum UserText { static let haveSubscriptionButton = NSLocalizedString("subscription.preferences.i.have.a.subscription.button", value: "I Have a Subscription", comment: "Button enabling user to activate a subscription user bought earlier or on another device") // MARK: Preferences when subscription activation is pending - static let preferencesSubscriptionPendingHeader = NSLocalizedString("subscription.preferences.subscription.pending.header", value: "Your Subscription is Being Activated", comment: "Header for the subscription preferences pane when the subscription activation is pending") + static let preferencesSubscriptionPendingHeader = NSLocalizedString("subscription.preferences.subscription.pending.header", value: "Your subscription is being activated", comment: "Header for the subscription preferences pane when the subscription activation is pending") static let preferencesSubscriptionPendingCaption = NSLocalizedString("subscription.preferences.subscription.pending.caption", value: "This is taking longer than usual, please check back later.", comment: "Caption for the subscription preferences pane when the subscription activation is pending") // MARK: Preferences when subscription is expired From ef05acd339cae141b02a0101e8fc8e4dd382a840 Mon Sep 17 00:00:00 2001 From: Pete Smith Date: Mon, 15 Apr 2024 13:55:57 +0100 Subject: [PATCH 3/8] Support Autofill Domains with Port Number Suffixes (#2602) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task/Issue URL: https://app.asana.com/0/1199230911884351/1206023722645078/f **Description**: This PR includes the following changes: * BSK 134.1.0 * Adds a `URLExtension` method which fixes an new issue where the Autofill dialog didn’t open with the right account highlighted, when the domain had a port suffix * Adds tests for above --- DuckDuckGo.xcodeproj/project.pbxproj | 2 +- .../xcshareddata/swiftpm/Package.resolved | 4 ++-- .../Common/Extensions/URLExtension.swift | 8 +++++++ .../View/NavigationBarViewController.swift | 5 ++-- .../DataBrokerProtection/Package.swift | 2 +- .../NetworkProtectionMac/Package.swift | 2 +- LocalPackages/SubscriptionUI/Package.swift | 2 +- .../Common/Extensions/URLExtensionTests.swift | 24 +++++++++++++++++++ 8 files changed, 41 insertions(+), 8 deletions(-) diff --git a/DuckDuckGo.xcodeproj/project.pbxproj b/DuckDuckGo.xcodeproj/project.pbxproj index ba6aeca66d..a97d747dd3 100644 --- a/DuckDuckGo.xcodeproj/project.pbxproj +++ b/DuckDuckGo.xcodeproj/project.pbxproj @@ -14544,7 +14544,7 @@ repositoryURL = "https://github.com/duckduckgo/BrowserServicesKit"; requirement = { kind = exactVersion; - version = 134.0.1; + version = 134.1.0; }; }; 9FF521422BAA8FF300B9819B /* XCRemoteSwiftPackageReference "lottie-spm" */ = { diff --git a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index a567f97be3..e7045a615e 100644 --- a/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/DuckDuckGo.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -32,8 +32,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/duckduckgo/BrowserServicesKit", "state" : { - "revision" : "b0749d25996c0fa18be07b7851f02ebb3b9fab50", - "version" : "134.0.1" + "revision" : "90e789b95403481e7c2f0e4aa661890d4252f0e6", + "version" : "134.1.0" } }, { diff --git a/DuckDuckGo/Common/Extensions/URLExtension.swift b/DuckDuckGo/Common/Extensions/URLExtension.swift index 3d95ae07f1..79d5e3e8ed 100644 --- a/DuckDuckGo/Common/Extensions/URLExtension.swift +++ b/DuckDuckGo/Common/Extensions/URLExtension.swift @@ -278,6 +278,14 @@ extension URL { return string } + func hostAndPort() -> String? { + guard let host else { return nil } + + guard let port = port else { return host } + + return "\(host):\(port)" + } + #if !SANDBOX_TEST_TOOL func toString(forUserInput input: String, decodePunycode: Bool = true) -> String { let hasInputScheme = input.hasOrIsPrefix(of: self.separatedScheme ?? "") diff --git a/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift b/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift index 7b11248e0f..6b1af92c29 100644 --- a/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift +++ b/DuckDuckGo/NavigationBar/View/NavigationBarViewController.swift @@ -710,10 +710,11 @@ final class NavigationBarViewController: NSViewController { } popovers.passwordManagementDomain = nil - guard let url = url, let domain = url.host else { + guard let url = url, let hostAndPort = url.hostAndPort() else { return } - popovers.passwordManagementDomain = domain + + popovers.passwordManagementDomain = hostAndPort } private func updateHomeButton() { diff --git a/LocalPackages/DataBrokerProtection/Package.swift b/LocalPackages/DataBrokerProtection/Package.swift index 0eb8a47757..ebd34e3874 100644 --- a/LocalPackages/DataBrokerProtection/Package.swift +++ b/LocalPackages/DataBrokerProtection/Package.swift @@ -29,7 +29,7 @@ let package = Package( targets: ["DataBrokerProtection"]) ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "134.0.1"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "134.1.0"), .package(path: "../PixelKit"), .package(path: "../SwiftUIExtensions"), .package(path: "../XPCHelper"), diff --git a/LocalPackages/NetworkProtectionMac/Package.swift b/LocalPackages/NetworkProtectionMac/Package.swift index f7a52283d8..0749090bd4 100644 --- a/LocalPackages/NetworkProtectionMac/Package.swift +++ b/LocalPackages/NetworkProtectionMac/Package.swift @@ -31,7 +31,7 @@ let package = Package( .library(name: "NetworkProtectionUI", targets: ["NetworkProtectionUI"]), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "134.0.1"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "134.1.0"), .package(path: "../XPCHelper"), .package(path: "../SwiftUIExtensions"), .package(path: "../LoginItems"), diff --git a/LocalPackages/SubscriptionUI/Package.swift b/LocalPackages/SubscriptionUI/Package.swift index f50597c4ec..74c24caa6b 100644 --- a/LocalPackages/SubscriptionUI/Package.swift +++ b/LocalPackages/SubscriptionUI/Package.swift @@ -12,7 +12,7 @@ let package = Package( targets: ["SubscriptionUI"]), ], dependencies: [ - .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "134.0.1"), + .package(url: "https://github.com/duckduckgo/BrowserServicesKit", exact: "134.1.0"), .package(path: "../SwiftUIExtensions") ], targets: [ diff --git a/UnitTests/Common/Extensions/URLExtensionTests.swift b/UnitTests/Common/Extensions/URLExtensionTests.swift index 00ed9d6f24..5869636572 100644 --- a/UnitTests/Common/Extensions/URLExtensionTests.swift +++ b/UnitTests/Common/Extensions/URLExtensionTests.swift @@ -136,4 +136,28 @@ final class URLExtensionTests: XCTestCase { } } + func testWhenGetHostAndPort_WithPort_ThenHostAndPortIsReturned() throws { + // Given + let expected = "duckduckgo.com:1234" + let sut = URL(string: "https://duckduckgo.com:1234") + + // When + let result = sut?.hostAndPort() + + // Then + XCTAssertEqual(expected, result) + } + + func testWhenGetHostAndPort_WithoutPort_ThenHostReturned() throws { + // Given + let expected = "duckduckgo.com" + let sut = URL(string: "https://duckduckgo.com") + + // When + let result = sut?.hostAndPort() + + // Then + XCTAssertEqual(expected, result) + } + } From f9630cfa7fa615f1645ff8d881d0fb6e059b0c71 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Mon, 15 Apr 2024 18:55:36 +0500 Subject: [PATCH 4/8] Reimplement audio mute for App Store (#2593) Task/Issue URL: https://app.asana.com/0/1177771139624306/1207043866291157/f --- .../Common/Extensions/WKWebView+Private.h | 2 - .../Extensions/WKWebViewExtension.swift | 126 +++++++++--------- .../Model/PinnedTabsViewModel.swift | 2 +- .../PinnedTabs/View/PinnedTabView.swift | 2 +- DuckDuckGo/Tab/Model/Tab.swift | 9 +- .../TabBar/View/TabBarViewController.swift | 7 +- DuckDuckGo/TabBar/View/TabBarViewItem.swift | 20 ++- UnitTests/Permissions/WebViewMock.swift | 17 +-- ...bViewPrivateMethodsAvailabilityTests.swift | 5 + .../TabBar/View/MockTabViewItemDelegate.swift | 6 +- 10 files changed, 100 insertions(+), 96 deletions(-) diff --git a/DuckDuckGo/Common/Extensions/WKWebView+Private.h b/DuckDuckGo/Common/Extensions/WKWebView+Private.h index b5e8c44d99..daa465149f 100644 --- a/DuckDuckGo/Common/Extensions/WKWebView+Private.h +++ b/DuckDuckGo/Common/Extensions/WKWebView+Private.h @@ -63,8 +63,6 @@ typedef NS_OPTIONS(NSUInteger, _WKFindOptions) { - (void)_stopMediaCapture API_AVAILABLE(macos(10.15.4), ios(13.4)); - (void)_stopAllMediaPlayback; -- (_WKMediaMutedState)_mediaMutedState API_AVAILABLE(macos(11.0), ios(14.0));; -- (void)_setPageMuted:(_WKMediaMutedState)mutedState API_AVAILABLE(macos(10.13), ios(11.0)); @end diff --git a/DuckDuckGo/Common/Extensions/WKWebViewExtension.swift b/DuckDuckGo/Common/Extensions/WKWebViewExtension.swift index fcd19de900..5f7a7b316c 100644 --- a/DuckDuckGo/Common/Extensions/WKWebViewExtension.swift +++ b/DuckDuckGo/Common/Extensions/WKWebViewExtension.swift @@ -32,7 +32,17 @@ extension WKWebView { enum AudioState { case muted case unmuted - case notSupported + + init(wkMediaMutedState: _WKMediaMutedState) { + self = wkMediaMutedState.contains(.audioMuted) ? .muted : .unmuted + } + + mutating func toggle() { + self = switch self { + case .muted: .unmuted + case .unmuted: .muted + } + } } enum CaptureState { @@ -114,96 +124,84 @@ extension WKWebView { return .active } -#if !APPSTORE - private func setMediaCaptureMuted(_ muted: Bool) { - guard self.responds(to: #selector(WKWebView._setPageMuted(_:))) else { - assertionFailure("WKWebView does not respond to selector _stopMediaCapture") - return + @objc dynamic var mediaMutedState: _WKMediaMutedState { + get { + // swizzle the method to call `_mediaMutedState` without performSelector: usage + guard Self.swizzleMediaMutedStateOnce else { return [] } + return self.mediaMutedState // call the original } - let mutedState: _WKMediaMutedState = { - guard self.responds(to: #selector(WKWebView._mediaMutedState)) else { return [] } - return self._mediaMutedState() - }() - var newState = mutedState - if muted { - newState.insert(.captureDevicesMuted) - } else { - newState.remove(.captureDevicesMuted) + set { + // swizzle the method to call `_setPageMuted:` without performSelector: usage (as there‘s a non-object argument to pass) + guard Self.swizzleSetPageMutedOnce else { return } + self.mediaMutedState = newValue // call the original } - guard newState != mutedState else { return } - self._setPageMuted(newState) } -#endif - func muteOrUnmute() { -#if !APPSTORE - guard self.responds(to: #selector(WKWebView._setPageMuted(_:))) else { - assertionFailure("WKWebView does not respond to selector _stopMediaCapture") - return + static private let swizzleMediaMutedStateOnce: Bool = { + guard let originalMethod = class_getInstanceMethod(WKWebView.self, Selector.mediaMutedState), + let swizzledMethod = class_getInstanceMethod(WKWebView.self, #selector(getter: mediaMutedState)) else { + assertionFailure("WKWebView does not respond to selector _mediaMutedState") + return false } - let mutedState: _WKMediaMutedState = { - guard self.responds(to: #selector(WKWebView._mediaMutedState)) else { return [] } - return self._mediaMutedState() - }() - var newState = mutedState - - if newState == .audioMuted { - newState.remove(.audioMuted) - } else { - newState.insert(.audioMuted) + method_exchangeImplementations(originalMethod, swizzledMethod) + return true + }() + + static private let swizzleSetPageMutedOnce: Bool = { + guard let originalMethod = class_getInstanceMethod(WKWebView.self, Selector.setPageMuted), + let swizzledMethod = class_getInstanceMethod(WKWebView.self, #selector(setter: mediaMutedState)) else { + assertionFailure("WKWebView does not respond to selector _setPageMuted:") + return false } - guard newState != mutedState else { return } - self._setPageMuted(newState) -#endif - } + method_exchangeImplementations(originalMethod, swizzledMethod) + return true + }() /// Returns the audio state of the WKWebView. /// /// - Returns: `muted` if the web view is muted /// `unmuted` if the web view is unmuted - /// `notSupported` if the web view does not support fetching the current audio state - func audioState() -> AudioState { -#if APPSTORE - return .notSupported -#else - guard self.responds(to: #selector(WKWebView._mediaMutedState)) else { - assertionFailure("WKWebView does not respond to selector _mediaMutedState") - return .notSupported + var audioState: AudioState { + get { + AudioState(wkMediaMutedState: mediaMutedState) + } + set { + switch newValue { + case .muted: + self.mediaMutedState.insert(.audioMuted) + case .unmuted: + self.mediaMutedState.remove(.audioMuted) + } } - - let mutedState = self._mediaMutedState() - - return mutedState.contains(.audioMuted) ? .muted : .unmuted -#endif } func stopMediaCapture() { - guard #available(macOS 12.0, *) else { #if !APPSTORE + guard #available(macOS 12.0, *) else { guard self.responds(to: #selector(_stopMediaCapture)) else { assertionFailure("WKWebView does not respond to _stopMediaCapture") return } self._stopMediaCapture() -#endif return } +#endif setCameraCaptureState(.none) setMicrophoneCaptureState(.none) } func stopAllMediaPlayback() { - guard #available(macOS 12.0, *) else { #if !APPSTORE + guard #available(macOS 12.0, *) else { guard self.responds(to: #selector(_stopAllMediaPlayback)) else { assertionFailure("WKWebView does not respond to _stopAllMediaPlayback") return } self._stopAllMediaPlayback() return -#endif } +#endif pauseAllMediaPlayback() } @@ -212,20 +210,26 @@ extension WKWebView { switch permission { case .camera: guard #available(macOS 12.0, *) else { -#if !APPSTORE - self.setMediaCaptureMuted(muted) -#endif + if muted { + self.mediaMutedState.insert(.captureDevicesMuted) + } else { + self.mediaMutedState.remove(.captureDevicesMuted) + } return } + self.setCameraCaptureState(muted ? .muted : .active, completionHandler: {}) case .microphone: guard #available(macOS 12.0, *) else { -#if !APPSTORE - self.setMediaCaptureMuted(muted) -#endif + if muted { + self.mediaMutedState.insert(.captureDevicesMuted) + } else { + self.mediaMutedState.remove(.captureDevicesMuted) + } return } + self.setMicrophoneCaptureState(muted ? .muted : .active, completionHandler: {}) case .geolocation: self.configuration.processPool.geolocationProvider?.isPaused = muted @@ -360,6 +364,8 @@ extension WKWebView { static let fullScreenPlaceholderView = NSSelectorFromString("_fullScreenPlaceholderView") static let printOperationWithPrintInfoForFrame = NSSelectorFromString("_printOperationWithPrintInfo:forFrame:") static let loadAlternateHTMLString = NSSelectorFromString("_loadAlternateHTMLString:baseURL:forUnreachableURL:") + static let mediaMutedState = NSSelectorFromString("_mediaMutedState") + static let setPageMuted = NSSelectorFromString("_setPageMuted:") } } diff --git a/DuckDuckGo/PinnedTabs/Model/PinnedTabsViewModel.swift b/DuckDuckGo/PinnedTabs/Model/PinnedTabsViewModel.swift index ee5c9f0c91..7324862828 100644 --- a/DuckDuckGo/PinnedTabs/Model/PinnedTabsViewModel.swift +++ b/DuckDuckGo/PinnedTabs/Model/PinnedTabsViewModel.swift @@ -122,7 +122,7 @@ final class PinnedTabsViewModel: ObservableObject { audioStateView = .muted case .unmuted: audioStateView = .unmuted - case .notSupported: + case .none: audioStateView = .notSupported } } diff --git a/DuckDuckGo/PinnedTabs/View/PinnedTabView.swift b/DuckDuckGo/PinnedTabs/View/PinnedTabView.swift index 40768d20a3..3e067f1187 100644 --- a/DuckDuckGo/PinnedTabs/View/PinnedTabView.swift +++ b/DuckDuckGo/PinnedTabs/View/PinnedTabView.swift @@ -212,7 +212,7 @@ struct PinnedTabInnerView: View { .renderingMode(.template) .frame(width: 12, height: 12) }.offset(x: 8, y: -8) - default: EmptyView() + case .unmuted, .none: EmptyView() } } diff --git a/DuckDuckGo/Tab/Model/Tab.swift b/DuckDuckGo/Tab/Model/Tab.swift index a1e4228051..39b66c9daa 100644 --- a/DuckDuckGo/Tab/Model/Tab.swift +++ b/DuckDuckGo/Tab/Model/Tab.swift @@ -539,7 +539,7 @@ protocol NewWindowPolicyDecisionMaker { self?.onDuckDuckGoEmailSignOut(notification) } - self.audioState = webView.audioState() + self.audioState = webView.audioState addDeallocationChecks(for: webView) } @@ -1035,12 +1035,11 @@ protocol NewWindowPolicyDecisionMaker { } } - @Published private(set) var audioState: WKWebView.AudioState = .notSupported + @Published private(set) var audioState: WKWebView.AudioState? func muteUnmuteTab() { - webView.muteOrUnmute() - - audioState = webView.audioState() + webView.audioState.toggle() + audioState = webView.audioState } private enum ReloadIfNeededSource { diff --git a/DuckDuckGo/TabBar/View/TabBarViewController.swift b/DuckDuckGo/TabBar/View/TabBarViewController.swift index 6ebc31e640..8f0253224b 100644 --- a/DuckDuckGo/TabBar/View/TabBarViewController.swift +++ b/DuckDuckGo/TabBar/View/TabBarViewController.swift @@ -1144,12 +1144,9 @@ extension TabBarViewController: TabBarViewItemDelegate { removeFireproofing(from: tab) } - func tabBarViewItemAudioState(_ tabBarViewItem: TabBarViewItem) -> WKWebView.AudioState { + func tabBarViewItemAudioState(_ tabBarViewItem: TabBarViewItem) -> WKWebView.AudioState? { guard let indexPath = collectionView.indexPath(for: tabBarViewItem), - let tab = tabCollectionViewModel.tabCollection.tabs[safe: indexPath.item] - else { - return .notSupported - } + let tab = tabCollectionViewModel.tabCollection.tabs[safe: indexPath.item] else { return nil } return tab.audioState } diff --git a/DuckDuckGo/TabBar/View/TabBarViewItem.swift b/DuckDuckGo/TabBar/View/TabBarViewItem.swift index b4a1bbca64..a92752aa56 100644 --- a/DuckDuckGo/TabBar/View/TabBarViewItem.swift +++ b/DuckDuckGo/TabBar/View/TabBarViewItem.swift @@ -46,7 +46,7 @@ protocol TabBarViewItemDelegate: AnyObject { func tabBarViewItemFireproofSite(_ tabBarViewItem: TabBarViewItem) func tabBarViewItemMuteUnmuteSite(_ tabBarViewItem: TabBarViewItem) func tabBarViewItemRemoveFireproofing(_ tabBarViewItem: TabBarViewItem) - func tabBarViewItemAudioState(_ tabBarViewItem: TabBarViewItem) -> WKWebView.AudioState + func tabBarViewItemAudioState(_ tabBarViewItem: TabBarViewItem) -> WKWebView.AudioState? func otherTabBarViewItemsState(for tabBarViewItem: TabBarViewItem) -> OtherTabBarViewItemsState @@ -446,7 +446,7 @@ final class TabBarViewItem: NSCollectionViewItem { switch delegate?.tabBarViewItemAudioState(self) { case .muted: mutedTabIcon.isHidden = false - default: + case .unmuted, .none: mutedTabIcon.isHidden = true } } @@ -540,15 +540,13 @@ extension TabBarViewItem: NSMenuDelegate { } private func addMuteUnmuteMenuItem(to menu: NSMenu) { - let audioState = delegate?.tabBarViewItemAudioState(self) ?? .notSupported - - if audioState != .notSupported { - menu.addItem(NSMenuItem.separator()) - let menuItemTitle = audioState == .muted ? UserText.unmuteTab : UserText.muteTab - let muteUnmuteMenuItem = NSMenuItem(title: menuItemTitle, action: #selector(muteUnmuteSiteAction(_:)), keyEquivalent: "") - muteUnmuteMenuItem.target = self - menu.addItem(muteUnmuteMenuItem) - } + guard let audioState = delegate?.tabBarViewItemAudioState(self) else { return } + + menu.addItem(NSMenuItem.separator()) + let menuItemTitle = audioState == .muted ? UserText.unmuteTab : UserText.muteTab + let muteUnmuteMenuItem = NSMenuItem(title: menuItemTitle, action: #selector(muteUnmuteSiteAction(_:)), keyEquivalent: "") + muteUnmuteMenuItem.target = self + menu.addItem(muteUnmuteMenuItem) } private func addCloseMenuItem(to menu: NSMenu) { diff --git a/UnitTests/Permissions/WebViewMock.swift b/UnitTests/Permissions/WebViewMock.swift index d8b0dd4ae5..8899c7f88f 100644 --- a/UnitTests/Permissions/WebViewMock.swift +++ b/UnitTests/Permissions/WebViewMock.swift @@ -107,15 +107,16 @@ final class WebViewMock: WKWebView { stopMediaCaptureHandler?() } - var mediaMutedStateValue = _WKMediaMutedState() - override func _mediaMutedState() -> _WKMediaMutedState { - mediaMutedStateValue - } - + var mediaMutedStateValue: _WKMediaMutedState = [] var setPageMutedHandler: ((_WKMediaMutedState) -> Void)? - override func _setPageMuted(_ mutedState: _WKMediaMutedState) { - mediaMutedStateValue = mutedState - setPageMutedHandler?(mutedState) + override var mediaMutedState: _WKMediaMutedState { + get { + mediaMutedStateValue + } + set { + mediaMutedStateValue = newValue + setPageMutedHandler?(newValue) + } } var setCameraCaptureStateHandler: ((Bool?) -> Void)? diff --git a/UnitTests/Tab/WKWebViewPrivateMethodsAvailabilityTests.swift b/UnitTests/Tab/WKWebViewPrivateMethodsAvailabilityTests.swift index b569bdb58d..d62bf1f85a 100644 --- a/UnitTests/Tab/WKWebViewPrivateMethodsAvailabilityTests.swift +++ b/UnitTests/Tab/WKWebViewPrivateMethodsAvailabilityTests.swift @@ -39,6 +39,11 @@ final class WKWebViewPrivateMethodsAvailabilityTests: XCTestCase { XCTAssertTrue(WKBackForwardList.instancesRespond(to: WKBackForwardList.removeAllItemsSelector)) } + func testWebViewRespondsTo_pageMutedState() { + XCTAssertTrue(WKWebView.instancesRespond(to: WKWebView.Selector.setPageMuted)) + XCTAssertTrue(WKWebView.instancesRespond(to: WKWebView.Selector.mediaMutedState)) + } + func testWKWebpagePreferencesCustomHeaderFieldsSupported() { XCTAssertTrue(NavigationPreferences.customHeadersSupported) let testHeaders = ["X-CUSTOM-HEADER": "TEST"] diff --git a/UnitTests/TabBar/View/MockTabViewItemDelegate.swift b/UnitTests/TabBar/View/MockTabViewItemDelegate.swift index c09b956f23..e63dad9b0a 100644 --- a/UnitTests/TabBar/View/MockTabViewItemDelegate.swift +++ b/UnitTests/TabBar/View/MockTabViewItemDelegate.swift @@ -24,7 +24,7 @@ class MockTabViewItemDelegate: TabBarViewItemDelegate { var mockedCurrentTab: Tab? var hasItemsToTheRight = false - var audioState: WKWebView.AudioState = .notSupported + var audioState: WKWebView.AudioState? func tabBarViewItem(_ tabBarViewItem: DuckDuckGo_Privacy_Browser.TabBarViewItem, isMouseOver: Bool) { @@ -86,7 +86,7 @@ class MockTabViewItemDelegate: TabBarViewItemDelegate { } - func tabBarViewItemAudioState(_ tabBarViewItem: TabBarViewItem) -> WKWebView.AudioState { + func tabBarViewItemAudioState(_ tabBarViewItem: TabBarViewItem) -> WKWebView.AudioState? { return audioState } @@ -99,7 +99,7 @@ class MockTabViewItemDelegate: TabBarViewItemDelegate { } func clear() { - self.audioState = .notSupported + self.audioState = nil } } From d87a92e573369a8ad045c751127b807b40b165df Mon Sep 17 00:00:00 2001 From: Dax the Duck Date: Mon, 15 Apr 2024 15:06:19 +0000 Subject: [PATCH 5/8] Update embedded files --- .../AppPrivacyConfigurationDataProvider.swift | 4 +- DuckDuckGo/ContentBlocker/macos-config.json | 370 +++++++----------- 2 files changed, 135 insertions(+), 239 deletions(-) diff --git a/DuckDuckGo/ContentBlocker/AppPrivacyConfigurationDataProvider.swift b/DuckDuckGo/ContentBlocker/AppPrivacyConfigurationDataProvider.swift index f0052639b2..504b70a61f 100644 --- a/DuckDuckGo/ContentBlocker/AppPrivacyConfigurationDataProvider.swift +++ b/DuckDuckGo/ContentBlocker/AppPrivacyConfigurationDataProvider.swift @@ -22,8 +22,8 @@ import BrowserServicesKit final class AppPrivacyConfigurationDataProvider: EmbeddedDataProvider { public struct Constants { - public static let embeddedDataETag = "\"fd95ad4da437370f57ea8c2e2d03f48f\"" - public static let embeddedDataSHA = "f11d34eb516a2ba722c22e15ff8cdee5e5b2570adbf9d1b22d50438b30f57188" + public static let embeddedDataETag = "\"a482727f0d20b29eabd1e22fde2d54cf\"" + public static let embeddedDataSHA = "993aa84559944a8866e40cebbce02beee2b1597f86b63f998d000d2a0e5d617a" } var embeddedDataEtag: String { diff --git a/DuckDuckGo/ContentBlocker/macos-config.json b/DuckDuckGo/ContentBlocker/macos-config.json index 216cd4c618..7c20612900 100644 --- a/DuckDuckGo/ContentBlocker/macos-config.json +++ b/DuckDuckGo/ContentBlocker/macos-config.json @@ -1,6 +1,6 @@ { "readme": "https://github.com/duckduckgo/privacy-configuration", - "version": 1712611145027, + "version": 1713140318814, "features": { "adClickAttribution": { "readme": "https://help.duckduckgo.com/duckduckgo-help-pages/privacy/web-tracking-protections/#3rd-party-tracker-loading-protection", @@ -74,12 +74,6 @@ { "domain": "thehustle.co" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -111,7 +105,7 @@ ] }, "state": "enabled", - "hash": "51b76aa7b92d78ad52106b04ac809843" + "hash": "16c6e3fb43797e3ca13a9259569a9e4e" }, "androidBrowserConfig": { "exceptions": [], @@ -285,12 +279,6 @@ { "domain": "condell-ltd.com" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -303,11 +291,12 @@ "generic-cosmetic", "termsfeed3", "strato.de", - "healthline-media" + "healthline-media", + "tarteaucitron.js" ] }, "state": "enabled", - "hash": "44af0b568856ce87b825bb7fc61b6961" + "hash": "0eaff8b64b6d3e8a59879f3b4ab6c0ba" }, "autofill": { "exceptions": [ @@ -923,12 +912,6 @@ { "domain": "pocketbook.digital" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -951,16 +934,10 @@ } }, "state": "disabled", - "hash": "36e8971fa9bb204b78a5929a14a108dd" + "hash": "770f7ae0f752e976764771bccec352b2" }, "clickToPlay": { "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -978,7 +955,7 @@ } }, "state": "enabled", - "hash": "f1b7de266435cd2e414f50deb2c9234a" + "hash": "2cff3d9b2df1ed9375f362848c8ed5f3" }, "clientBrandHint": { "exceptions": [], @@ -1009,12 +986,6 @@ { "domain": "soranews24.com" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -1022,7 +993,7 @@ "domain": "sundancecatalog.com" } ], - "hash": "e37447d42ee8194f185e35e40f577f41" + "hash": "593797946074a1f304add65e7543b9be" }, "cookie": { "settings": { @@ -1064,12 +1035,6 @@ { "domain": "news.ti.com" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -1078,7 +1043,7 @@ } ], "state": "disabled", - "hash": "37a27966915571085613911b47e6e2eb" + "hash": "7ade754b885238cd191f1a61b4eeb0b6" }, "customUserAgent": { "settings": { @@ -1245,12 +1210,6 @@ { "domain": "duckduckgo.com" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -2300,6 +2259,15 @@ } ] }, + { + "domain": "doodle.com", + "rules": [ + { + "selector": "[data-testid*='ads-layout-placement']", + "type": "hide" + } + ] + }, { "domain": "dpreview.com", "rules": [ @@ -4050,6 +4018,15 @@ } ] }, + { + "domain": "woot.com", + "rules": [ + { + "selector": "[data-test-ui*='advertisementLeaderboard']", + "type": "hide-empty" + } + ] + }, { "domain": "wsj.com", "rules": [ @@ -4254,16 +4231,10 @@ ] }, "state": "enabled", - "hash": "ea31ebf0dd3e4831467ed2b2ec783279" + "hash": "c0fa0dfbc6231be31492023b623ac99b" }, "exceptionHandler": { "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4272,7 +4243,7 @@ } ], "state": "disabled", - "hash": "5e792dd491428702bc0104240fbce0ce" + "hash": "dc1b4fa301193a03ddcd4bdf7ee3e610" }, "fingerprintingAudio": { "state": "disabled", @@ -4280,12 +4251,6 @@ { "domain": "litebluesso.usps.gov" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4293,19 +4258,13 @@ "domain": "sundancecatalog.com" } ], - "hash": "f25a8f2709e865c2bd743828c7ee2f77" + "hash": "2037fcd805ece181cfffc482f262941f" }, "fingerprintingBattery": { "exceptions": [ { "domain": "litebluesso.usps.gov" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4314,7 +4273,7 @@ } ], "state": "disabled", - "hash": "4085f1593faff2feac2093533b819a41" + "hash": "07ee708dc740aab3b1f048d9bb571dac" }, "fingerprintingCanvas": { "settings": { @@ -4405,12 +4364,6 @@ { "domain": "godaddy.com" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4419,7 +4372,7 @@ } ], "state": "disabled", - "hash": "ea4c565bae27996f0d651300d757594c" + "hash": "d48bfb1151476f49970ffd3b1f778bf9" }, "fingerprintingHardware": { "settings": { @@ -4471,12 +4424,6 @@ { "domain": "proton.me" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4518,7 +4465,7 @@ } ], "state": "enabled", - "hash": "37e16df501e3e68416a13f991b4e4147" + "hash": "aefca8e7a9a3d9b65370608dd639cd3f" }, "fingerprintingScreenSize": { "settings": { @@ -4558,12 +4505,6 @@ { "domain": "secureserver.net" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4572,7 +4513,7 @@ } ], "state": "disabled", - "hash": "466b85680f138657de9bfd222c440887" + "hash": "eef4614273c28d50dd298a68ffbac309" }, "fingerprintingTemporaryStorage": { "exceptions": [ @@ -4585,12 +4526,6 @@ { "domain": "tattoogenius.art" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4599,16 +4534,10 @@ } ], "state": "disabled", - "hash": "f858697949c90842c450daee64a1dc30" + "hash": "2746e6cb6c773e80a36fda03618ef930" }, "googleRejected": { "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4617,7 +4546,7 @@ } ], "state": "disabled", - "hash": "5e792dd491428702bc0104240fbce0ce" + "hash": "dc1b4fa301193a03ddcd4bdf7ee3e610" }, "gpc": { "state": "enabled", @@ -4634,6 +4563,9 @@ { "domain": "crunchyroll.com" }, + { + "domain": "espn.com" + }, { "domain": "eventbrite.com" }, @@ -4652,12 +4584,6 @@ { "domain": "tirerack.com" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4674,7 +4600,7 @@ "privacy-test-pages.site" ] }, - "hash": "1a1373bcf16647d63220659fce650a83" + "hash": "05bddff3ae61a9536e38a6ef7d383eb3" }, "harmfulApis": { "settings": { @@ -4776,12 +4702,6 @@ "domains": [] }, "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4790,7 +4710,7 @@ } ], "state": "disabled", - "hash": "44d3e707cba3ee0a3578f52dc2ce2aa4" + "hash": "f29eae11500edcda80aa8b32b12869eb" }, "history": { "state": "disabled", @@ -4809,12 +4729,6 @@ { "domain": "jp.square-enix.com" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4822,7 +4736,7 @@ "domain": "sundancecatalog.com" } ], - "hash": "f772808ed34cc9ea8cbcbb7cdaf74429" + "hash": "ea2c4fc84f27eb3694acd9ccf1023e95" }, "incontextSignup": { "exceptions": [], @@ -4859,12 +4773,6 @@ }, "navigatorInterface": { "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4880,7 +4788,7 @@ ] }, "state": "enabled", - "hash": "698de7b963d7d7942c5c5d1e986bb1b1" + "hash": "bb2ed420e76ecaf31a1f99decd370e55" }, "networkProtection": { "state": "enabled", @@ -4925,23 +4833,25 @@ "exceptions": [], "state": "enabled", "settings": { - "surveyCardDay0": "enabled", + "surveyCardDay0": "disabled", "surveyCardDay7": "disabled", - "surveyCardDay14": "enabled" + "surveyCardDay14": "disabled", + "permanentSurvey": { + "state": "internal", + "localization": "disabled", + "url": "https://selfserve.decipherinc.com/survey/selfserve/32ab/240404?list=2", + "firstDay": 5, + "lastDay": 8, + "sharePercentage": 60 + } }, - "hash": "eb826d9079211f30d624211f44aed184" + "hash": "7f7445d021268ef854b20022d0fb48e6" }, "nonTracking3pCookies": { "settings": { "excludedCookieDomains": [] }, "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4950,17 +4860,11 @@ } ], "state": "disabled", - "hash": "841fa92b9728c9754f050662678f82c7" + "hash": "522e3e42e2612ac2811342d3f6754c5a" }, "performanceMetrics": { "state": "enabled", "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -4968,7 +4872,7 @@ "domain": "sundancecatalog.com" } ], - "hash": "38558d5e7b231d4b27e7dd76814387a7" + "hash": "936f00970c108fd646f73d00b3f3f5b5" }, "privacyDashboard": { "exceptions": [], @@ -4998,7 +4902,27 @@ "exceptions": [], "features": { "isLaunched": { - "state": "disabled" + "state": "enabled", + "rollout": { + "steps": [ + { + "percent": 1 + }, + { + "percent": 10 + }, + { + "percent": 30 + }, + { + "percent": 50 + }, + { + "percent": 100 + } + ] + }, + "minSupportedVersion": "1.82.1" }, "isLaunchedOverride": { "state": "disabled" @@ -5007,13 +4931,33 @@ "state": "enabled" }, "isLaunchedStripe": { - "state": "disabled" + "state": "enabled", + "rollout": { + "steps": [ + { + "percent": 1 + }, + { + "percent": 10 + }, + { + "percent": 30 + }, + { + "percent": 50 + }, + { + "percent": 100 + } + ] + }, + "minSupportedVersion": "1.82.1" }, "allowPurchaseStripe": { "state": "enabled" } }, - "hash": "c9153c5cc3b6b7eba024c6c597e15edb" + "hash": "1a10a68ea8885db0d1d9bab371c0f738" }, "privacyProtectionsPopup": { "state": "disabled", @@ -5040,12 +4984,6 @@ { "domain": "xcelenergy.com" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -5054,17 +4992,11 @@ } ], "state": "disabled", - "hash": "0d3df0f7c24ebde89d2dced4e2d34322" + "hash": "1cfe449de8a4fcb542757383d846c031" }, "requestFilterer": { "state": "disabled", "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -5075,17 +5007,11 @@ "settings": { "windowInMs": 0 }, - "hash": "0fff8017d8ea4b5609b8f5c110be1401" + "hash": "3218faa098a2e9da61447fb63e3a5ed9" }, "runtimeChecks": { "state": "disabled", "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -5094,16 +5020,10 @@ } ], "settings": {}, - "hash": "800a19533c728bbec7e31e466f898268" + "hash": "ddb64344aa42e9593964f14b6de3d6df" }, "serviceworkerInitiatedRequests": { "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -5112,7 +5032,7 @@ } ], "state": "disabled", - "hash": "5e792dd491428702bc0104240fbce0ce" + "hash": "dc1b4fa301193a03ddcd4bdf7ee3e610" }, "sslCertificates": { "state": "enabled", @@ -5569,6 +5489,12 @@ }, "boldapps.net": { "rules": [ + { + "rule": "mc.boldapps.net/install_assets/bold.multicurrency.js", + "domains": [ + "" + ] + }, { "rule": "option.boldapps.net/js/options.js", "domains": [ @@ -6061,11 +5987,7 @@ { "rule": "cdn.dynamicyield.com/api/", "domains": [ - "asics.com", - "brooklinen.com", - "carters.com", - "otterbox.com", - "seatosummit.com" + "" ] } ] @@ -7003,6 +6925,16 @@ } ] }, + "litix.io": { + "rules": [ + { + "rule": "src.litix.io/videojs/", + "domains": [ + "" + ] + } + ] + }, "loggly.com": { "rules": [ { @@ -7984,6 +7916,12 @@ "domains": [ "winnipegfreepress.com" ] + }, + { + "rule": "platform.twitter.com/_next/static", + "domains": [ + "" + ] } ] }, @@ -8250,12 +8188,6 @@ } }, "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -8263,7 +8195,7 @@ "domain": "sundancecatalog.com" } ], - "hash": "936913b03c62ec1861b64a7a2316ddfd" + "hash": "2d627140b59bca8b8edbc236e79cd46e" }, "trackingCookies1p": { "settings": { @@ -8273,12 +8205,6 @@ } }, "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -8287,19 +8213,13 @@ } ], "state": "disabled", - "hash": "4dddf681372a2aea9788090b13db6e6f" + "hash": "dab51f5ad2454727f8bc474cdd3da65b" }, "trackingCookies3p": { "settings": { "excludedCookieDomains": [] }, "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -8308,19 +8228,13 @@ } ], "state": "disabled", - "hash": "841fa92b9728c9754f050662678f82c7" + "hash": "522e3e42e2612ac2811342d3f6754c5a" }, "trackingParameters": { "exceptions": [ { "domain": "axs.com" }, - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -8359,19 +8273,13 @@ }, "state": "enabled", "minSupportedVersion": "0.22.3", - "hash": "9a0282376084874f0245c421d6943841" + "hash": "44005192b6dba245e95de042fc224228" }, "userAgentRotation": { "settings": { "agentExcludePatterns": [] }, "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -8380,7 +8288,7 @@ } ], "state": "disabled", - "hash": "f65d10dfdf6739feab99a08d42734747" + "hash": "e30277704ddbf20c14136baab08519c5" }, "voiceSearch": { "exceptions": [], @@ -8389,12 +8297,6 @@ }, "webCompat": { "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -8663,7 +8565,7 @@ } ] }, - "hash": "151d7ee40451c4aac4badfcc829ea0b5" + "hash": "90687b1a5ac7aec8bf26f24a75cd883f" }, "windowsPermissionUsage": { "exceptions": [], @@ -8672,12 +8574,6 @@ }, "windowsStartupBoost": { "exceptions": [ - { - "domain": "earth.google.com" - }, - { - "domain": "iscorp.com" - }, { "domain": "marvel.com" }, @@ -8686,7 +8582,7 @@ } ], "state": "disabled", - "hash": "5e792dd491428702bc0104240fbce0ce" + "hash": "dc1b4fa301193a03ddcd4bdf7ee3e610" }, "windowsWaitlist": { "exceptions": [], From bcc8f01c5f74260e8d44ac08e2b76f5107d08724 Mon Sep 17 00:00:00 2001 From: Dax the Duck Date: Mon, 15 Apr 2024 15:06:19 +0000 Subject: [PATCH 6/8] Set marketing version to 1.84.0 --- Configuration/Version.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configuration/Version.xcconfig b/Configuration/Version.xcconfig index 71f4ed0cad..1e0572489f 100644 --- a/Configuration/Version.xcconfig +++ b/Configuration/Version.xcconfig @@ -1 +1 @@ -MARKETING_VERSION = 1.83.0 +MARKETING_VERSION = 1.84.0 From 4a357fc468616deaa70508e32faa382eb2722a4b Mon Sep 17 00:00:00 2001 From: Dax the Duck Date: Mon, 15 Apr 2024 15:18:06 +0000 Subject: [PATCH 7/8] Bump version to 1.84.0 (163) --- Configuration/BuildNumber.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configuration/BuildNumber.xcconfig b/Configuration/BuildNumber.xcconfig index 1155c5e451..5b507f55dc 100644 --- a/Configuration/BuildNumber.xcconfig +++ b/Configuration/BuildNumber.xcconfig @@ -1 +1 @@ -CURRENT_PROJECT_VERSION = 162 +CURRENT_PROJECT_VERSION = 163 From 6a3c17f2273745a0ffffb4939feaa92e3112ec92 Mon Sep 17 00:00:00 2001 From: Daniel Bernal Date: Mon, 15 Apr 2024 17:29:33 +0200 Subject: [PATCH 8/8] Limit stale marks/actions to be PRs only (#2627) Limit PR stale marking actions to be PRs only. (Avoid marking issues) --- .github/workflows/stale_pr.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/stale_pr.yml b/.github/workflows/stale_pr.yml index a5590c9c63..a4a6e92c29 100644 --- a/.github/workflows/stale_pr.yml +++ b/.github/workflows/stale_pr.yml @@ -12,8 +12,8 @@ jobs: uses: actions/stale@v9 with: stale-pr-message: 'This PR has been inactive for more than 7 days and will be automatically closed 7 days from now.' - days-before-stale: 7 + days-before-pr-stale: 7 close-pr-message: 'This PR has been closed after 14 days of inactivity. Feel free to reopen it if you plan to continue working on it or have further discussions.' - days-before-close: 7 + days-before-pr-close: 7 stale-pr-label: stale exempt-draft-pr: true \ No newline at end of file