Skip to content

Commit

Permalink
Merge release/1.126.0 into main
Browse files Browse the repository at this point in the history
  • Loading branch information
daxmobile authored Feb 10, 2025
2 parents 46999cb + 4f525ec commit c8f5413
Show file tree
Hide file tree
Showing 23 changed files with 683 additions and 230 deletions.
2 changes: 1 addition & 1 deletion Configuration/BuildNumber.xcconfig
Original file line number Diff line number Diff line change
@@ -1 +1 @@
CURRENT_PROJECT_VERSION = 362
CURRENT_PROJECT_VERSION = 363
12 changes: 12 additions & 0 deletions DuckDuckGo-macOS.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -1281,6 +1281,8 @@
37BF3F14286D8A6500BD9014 /* PinnedTabsManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37BF3F13286D8A6500BD9014 /* PinnedTabsManager.swift */; };
37BF3F21286F0A7A00BD9014 /* PinnedTabsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37BF3F1E286F0A7A00BD9014 /* PinnedTabsViewModel.swift */; };
37BF3F22286F0A7A00BD9014 /* PinnedTabsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37BF3F1F286F0A7A00BD9014 /* PinnedTabsView.swift */; };
37C7493A2D55FE710065B48B /* HistoryViewActionsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C749392D55FE690065B48B /* HistoryViewActionsHandler.swift */; };
37C7493B2D55FE710065B48B /* HistoryViewActionsHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C749392D55FE690065B48B /* HistoryViewActionsHandler.swift */; };
37C9F78C2CF1C776004D73A1 /* PrivacyStatsTabExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C9F78B2CF1C770004D73A1 /* PrivacyStatsTabExtension.swift */; };
37C9F78D2CF1C776004D73A1 /* PrivacyStatsTabExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37C9F78B2CF1C770004D73A1 /* PrivacyStatsTabExtension.swift */; };
37CBCA9A2A8966E60050218F /* SyncSettingsAdapter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37CBCA992A8966E60050218F /* SyncSettingsAdapter.swift */; };
Expand Down Expand Up @@ -1332,6 +1334,8 @@
37DF37072CF38B9F005ED34B /* PrivacyStats in Frameworks */ = {isa = PBXBuildFile; productRef = 37DF37062CF38B9F005ED34B /* PrivacyStats */; };
37DF37092CF38CD7005ED34B /* PrivacyStatsDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37DF37082CF38CD3005ED34B /* PrivacyStatsDatabase.swift */; };
37DF370A2CF38CD7005ED34B /* PrivacyStatsDatabase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37DF37082CF38CD3005ED34B /* PrivacyStatsDatabase.swift */; };
37E13B8E2D54B03D002ECD62 /* HistoryViewDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E13B8D2D54B023002ECD62 /* HistoryViewDataProvider.swift */; };
37E13B8F2D54B03D002ECD62 /* HistoryViewDataProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E13B8D2D54B023002ECD62 /* HistoryViewDataProvider.swift */; };
37E2608C2C8A1F6D006EE07F /* UserColorProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E2608B2C8A1F6D006EE07F /* UserColorProviding.swift */; };
37E2608D2C8A1F6D006EE07F /* UserColorProviding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E2608B2C8A1F6D006EE07F /* UserColorProviding.swift */; };
37E2608F2C8A3ABE006EE07F /* HomePageSettingsModelNavigator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 37E2608E2C8A3ABE006EE07F /* HomePageSettingsModelNavigator.swift */; };
Expand Down Expand Up @@ -3883,6 +3887,7 @@
37BF3F13286D8A6500BD9014 /* PinnedTabsManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PinnedTabsManager.swift; sourceTree = "<group>"; };
37BF3F1E286F0A7A00BD9014 /* PinnedTabsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PinnedTabsViewModel.swift; sourceTree = "<group>"; };
37BF3F1F286F0A7A00BD9014 /* PinnedTabsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PinnedTabsView.swift; sourceTree = "<group>"; };
37C749392D55FE690065B48B /* HistoryViewActionsHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryViewActionsHandler.swift; sourceTree = "<group>"; };
37C9F78B2CF1C770004D73A1 /* PrivacyStatsTabExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyStatsTabExtension.swift; sourceTree = "<group>"; };
37CBCA992A8966E60050218F /* SyncSettingsAdapter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SyncSettingsAdapter.swift; sourceTree = "<group>"; };
37CC53EB27E8A4D10028713D /* PreferencesDataClearingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferencesDataClearingView.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -3920,6 +3925,7 @@
37DD516C296EAEDC00837F27 /* DuckDuckGoAppStore.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DuckDuckGoAppStore.xcconfig; sourceTree = "<group>"; };
37DF37082CF38CD3005ED34B /* PrivacyStatsDatabase.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacyStatsDatabase.swift; sourceTree = "<group>"; };
37E1116C2C578F1B00583C19 /* DuckDuckGoAppStoreDebug.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DuckDuckGoAppStoreDebug.entitlements; sourceTree = "<group>"; };
37E13B8D2D54B023002ECD62 /* HistoryViewDataProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HistoryViewDataProvider.swift; sourceTree = "<group>"; };
37E2608B2C8A1F6D006EE07F /* UserColorProviding.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserColorProviding.swift; sourceTree = "<group>"; };
37E2608E2C8A3ABE006EE07F /* HomePageSettingsModelNavigator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomePageSettingsModelNavigator.swift; sourceTree = "<group>"; };
37E260912C8A3EB4006EE07F /* MockHomePageSettingsModelNavigator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockHomePageSettingsModelNavigator.swift; sourceTree = "<group>"; };
Expand Down Expand Up @@ -9229,6 +9235,8 @@
AAE75276263B038A00B973F8 /* Services */ = {
isa = PBXGroup;
children = (
37C749392D55FE690065B48B /* HistoryViewActionsHandler.swift */,
37E13B8D2D54B023002ECD62 /* HistoryViewDataProvider.swift */,
3745DE0A2D53969000024FC8 /* HistoryDebugMenu.swift */,
AAE75278263B046100B973F8 /* History.xcdatamodeld */,
AAE7527B263B056C00B973F8 /* EncryptedHistoryStore.swift */,
Expand Down Expand Up @@ -11771,6 +11779,7 @@
3148727B2CC689C200EEF89B /* AIChatToolBarPopUpOnboardingViewModel.swift in Sources */,
BBFB72802C48047C0088884C /* SortBookmarksViewModel.swift in Sources */,
37197EA72942443D00394917 /* AuthenticationAlert.swift in Sources */,
37C7493A2D55FE710065B48B /* HistoryViewActionsHandler.swift in Sources */,
3706FEC3293F6F0600E42796 /* NativeMessagingCommunicator.swift in Sources */,
3706FAFA293F65D500E42796 /* CleanThisHistoryMenuItem.swift in Sources */,
1DA6D0FE2A1FF9A100540406 /* HTTPCookie.swift in Sources */,
Expand Down Expand Up @@ -12058,6 +12067,7 @@
378F44EC29B4C73E00899924 /* ViewExtension.swift in Sources */,
3706FB9D293F65D500E42796 /* BookmarkManager.swift in Sources */,
3768D83C2C24C0A8004120AE /* RemoteMessageViewModel.swift in Sources */,
37E13B8F2D54B03D002ECD62 /* HistoryViewDataProvider.swift in Sources */,
56A053FD2C1A0AC9007D8FAB /* OnboardingActionsManager.swift in Sources */,
B626A76E29928B1600053070 /* TestsClosureNavigationResponder.swift in Sources */,
3707C71A294B5D0F00682A9F /* TabExtensions.swift in Sources */,
Expand Down Expand Up @@ -13598,6 +13608,7 @@
B693954C26F04BEB0015B914 /* FocusRingView.swift in Sources */,
4BE41A5E28446EAD00760399 /* BookmarksBarViewModel.swift in Sources */,
4B1E6EF127AB5E5D00F51793 /* NSPopUpButtonView.swift in Sources */,
37E13B8E2D54B03D002ECD62 /* HistoryViewDataProvider.swift in Sources */,
372A0FEC2B2379310033BF7F /* SyncMetricsEventsHandler.swift in Sources */,
1D5C1AF12CFF58220073ED65 /* Logger+WebExtensions.swift in Sources */,
85774B032A71CDD000DE0561 /* BlockMenuItem.swift in Sources */,
Expand Down Expand Up @@ -14002,6 +14013,7 @@
85378DA2274E7F25007C5CBF /* EmailManagerRequestDelegate.swift in Sources */,
1D43EB36292ACE690065E5D6 /* ApplicationVersionReader.swift in Sources */,
566B736C2BECC3C600FF1959 /* SyncPausedStateManaging.swift in Sources */,
37C7493B2D55FE710065B48B /* HistoryViewActionsHandler.swift in Sources */,
4BD18F01283F0BC500058124 /* BookmarksBarViewController.swift in Sources */,
379DE4BD27EA31AC002CC3DE /* PreferencesAutofillView.swift in Sources */,
F1476FC02C1359FB00EAE46A /* SubscriptionUIHandler.swift in Sources */,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"images" : [
{
"filename" : "HistoryFavicon.svg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
8 changes: 8 additions & 0 deletions DuckDuckGo/Common/Extensions/ArrayExtension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@ extension Array {
}
}

func chunk(with limit: Int, offset: Int) -> [Element] {
guard !isEmpty, offset < count else {
return []
}
let endIndex = Swift.min(offset + limit, count)
return Array(self[offset ..< endIndex])
}

/// Map collection insertion indexes for a filtered collection into a non-filtered collection
/// Used to skip `stub` or `pendingDeletion` object indices in a full (non-filtered) database
/// items collection and use insertion indexes of a filtered collection, the one that‘s displaying non-stub, non-deleted items.
Expand Down
6 changes: 4 additions & 2 deletions DuckDuckGo/History/Services/HistoryDebugMenu.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,13 +37,13 @@ final class HistoryDebugMenu: NSMenu {
representedObject: (10, FakeURLsPool.random10Domains)
)
NSMenuItem(
title: "Populate 100 history visits each day (10 domains)",
title: "Add 100 history visits each day (10 domains)",
action: #selector(populateFakeHistory),
target: self,
representedObject: (100, FakeURLsPool.random10Domains)
)
NSMenuItem(
title: "Populate 100 history visits each day (200 domains – SLOW!)",
title: "Add 100 history visits each day (200 domains – SLOW!)",
action: #selector(populateFakeHistory),
target: self,
representedObject: (100, FakeURLsPool.random200Domains)
Expand Down Expand Up @@ -75,7 +75,9 @@ final class HistoryDebugMenu: NSMenu {
continue
}
let visitDate = Date(timeIntervalSince1970: TimeInterval.random(in: date.startOfDay.timeIntervalSince1970..<date.timeIntervalSince1970))
let title = url.host?.split(separator: ".").first.flatMap(String.init) ?? "Test"
historyCoordinator.addVisit(of: url, at: visitDate)
historyCoordinator.updateTitleIfNeeded(title: title, url: url)
visitsPerDay += 1
if visitsPerDay >= maxVisitsPerDay {
date = date.daysAgo(1)
Expand Down
9 changes: 7 additions & 2 deletions DuckDuckGo/History/Services/HistoryGroupingProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ protocol HistoryGroupingDataSource: AnyObject {
var history: BrowsingHistory? { get }
}

struct HistoryGrouping {
let date: Date
let visits: [Visit]
}

extension HistoryCoordinator: HistoryGroupingDataSource {}

/**
Expand Down Expand Up @@ -59,10 +64,10 @@ final class HistoryGroupingProvider {
/**
* Returns history visits bucketed per day.
*/
func getVisitGroupings() -> [HistoryMenu.HistoryGrouping] {
func getVisitGroupings() -> [HistoryGrouping] {
Dictionary(grouping: getSortedArrayOfVisits(), by: \.date.startOfDay)
.map { date, sortedVisits in
HistoryMenu.HistoryGrouping(date: date, visits: removeDuplicatesIfNeeded(from: sortedVisits))
HistoryGrouping(date: date, visits: removeDuplicatesIfNeeded(from: sortedVisits))
}
.sorted { $0.date > $1.date }
}
Expand Down
44 changes: 44 additions & 0 deletions DuckDuckGo/History/Services/HistoryViewActionsHandler.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
//
// HistoryViewActionsHandler.swift
//
// Copyright © 2025 DuckDuckGo. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

import HistoryView

final class HistoryViewActionsHandler: HistoryView.ActionsHandling {

@MainActor
func open(_ url: URL) {
guard let tabCollectionViewModel else {
return
}

if NSApplication.shared.isCommandPressed && NSApplication.shared.isOptionPressed {
WindowsManager.openNewWindow(with: url, source: .bookmark, isBurner: tabCollectionViewModel.isBurner)
} else if NSApplication.shared.isCommandPressed && NSApplication.shared.isShiftPressed {
tabCollectionViewModel.insertOrAppendNewTab(.contentFromURL(url, source: .bookmark), selected: true)
} else if NSApplication.shared.isCommandPressed {
tabCollectionViewModel.insertOrAppendNewTab(.contentFromURL(url, source: .bookmark), selected: false)
} else {
tabCollectionViewModel.selectedTabViewModel?.tab.setContent(.contentFromURL(url, source: .historyEntry))
}
}

@MainActor
private var tabCollectionViewModel: TabCollectionViewModel? {
WindowControllersManager.shared.lastKeyMainWindowController?.mainViewController.tabCollectionViewModel
}
}
Loading

0 comments on commit c8f5413

Please sign in to comment.