Skip to content

Commit c7c3741

Browse files
committed
Merge branch 'release/7.68.0'
2 parents 77eaf6d + d823695 commit c7c3741

File tree

116 files changed

+5366
-209
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

116 files changed

+5366
-209
lines changed

Configuration/Version.xcconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
MARKETING_VERSION = 7.67.9
1+
MARKETING_VERSION = 7.68.0
22

Core/AppPrivacyConfigurationDataProvider.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ import BrowserServicesKit
2222
final class AppPrivacyConfigurationDataProvider: EmbeddedDataProvider {
2323

2424
public struct Constants {
25-
public static let embeddedDataETag = "\"39ae29fb5fba0204bc01da5e1bcb8e4b\""
26-
public static let embeddedDataSHA = "7faf7905914c59b57bb29b62d0d9a928f43e4e12041633a55abdb7ce39a3b3ba"
25+
public static let embeddedDataETag = "\"40db837f2bfc286cb9a8fcbd49b64697\""
26+
public static let embeddedDataSHA = "21cc26cbd2591b997b671c71402e1796650c1d531f7e8c378df7949cc5a0ebae"
2727
}
2828

2929
var embeddedDataEtag: String {

Core/BookmarksImporter.swift

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ import SwiftSoup
2222
import os.log
2323

2424
public enum BookmarksImportError: Error {
25-
case invalidHtml
25+
case invalidHtmlNoDLTag
26+
case invalidHtmlNoBodyTag
27+
case safariTransformFailure
2628
case saveFailure
2729
case unknown
2830
}
@@ -58,40 +60,47 @@ final public class BookmarksImporter {
5860
try await saveBookmarks(importedBookmarks)
5961
NotificationCenter.default.post(name: Notifications.importDidEnd, object: nil)
6062
return .success(importedBookmarks)
61-
} catch BookmarksImportError.invalidHtml {
63+
} catch BookmarksImportError.invalidHtmlNoDLTag {
6264
NotificationCenter.default.post(name: Notifications.importDidEnd, object: nil)
63-
return .failure(.invalidHtml)
65+
Pixel.fire(pixel: .bookmarkImportFailureParsingDL)
66+
return .failure(.invalidHtmlNoDLTag)
67+
} catch BookmarksImportError.invalidHtmlNoBodyTag {
68+
NotificationCenter.default.post(name: Notifications.importDidEnd, object: nil)
69+
Pixel.fire(pixel: .bookmarkImportFailureParsingBody)
70+
return .failure(.invalidHtmlNoBodyTag)
71+
} catch BookmarksImportError.safariTransformFailure {
72+
NotificationCenter.default.post(name: Notifications.importDidEnd, object: nil)
73+
Pixel.fire(pixel: .bookmarkImportFailureTransformingSafari)
74+
return .failure(.safariTransformFailure)
6475
} catch BookmarksImportError.saveFailure {
6576
NotificationCenter.default.post(name: Notifications.importDidEnd, object: nil)
77+
Pixel.fire(pixel: .bookmarkImportFailureSaving)
6678
return .failure(.saveFailure)
6779
} catch {
6880
NotificationCenter.default.post(name: Notifications.importDidEnd, object: nil)
81+
Pixel.fire(pixel: .bookmarkImportFailureUnknown)
6982
return .failure(.unknown)
7083
}
7184
}
7285

7386
func parseHtml(_ htmlContent: String) async throws {
7487
let document: Document = try SwiftSoup.parse(htmlContent)
7588

76-
do {
77-
if isDocumentInSafariFormat(document) {
78-
guard let newDocument = try transformSafariDocument(document: document) else {
79-
os_log("Safari format could not be handled", type: .debug)
80-
throw BookmarksImportError.invalidHtml
81-
}
82-
try parse(documentElement: newDocument, importedBookmark: nil)
83-
} else {
84-
try parse(documentElement: document, importedBookmark: nil)
89+
if isDocumentInSafariFormat(document) {
90+
guard let newDocument = try transformSafariDocument(document: document) else {
91+
os_log("Safari format could not be handled", type: .debug)
92+
throw BookmarksImportError.safariTransformFailure
8593
}
86-
} catch {
87-
throw BookmarksImportError.invalidHtml
94+
try parse(documentElement: newDocument, importedBookmark: nil)
95+
} else {
96+
try parse(documentElement: document, importedBookmark: nil)
8897
}
8998
}
9099

91100
/// transform Safari document into a standard bookmark html format
92101
func transformSafariDocument(document: Document) throws -> Document? {
93102
guard let body = try document.select("body").first() else {
94-
throw BookmarksImportError.invalidHtml
103+
throw BookmarksImportError.invalidHtmlNoBodyTag
95104
}
96105

97106
let newDocument: Document = Document("")
@@ -123,7 +132,7 @@ final public class BookmarksImporter {
123132

124133
func parse(documentElement: Element, importedBookmark: BookmarkOrFolder?, inFavorite: Bool = false) throws {
125134
guard let firstDL = try documentElement.select("DL").first() else {
126-
throw BookmarksImportError.invalidHtml
135+
throw BookmarksImportError.invalidHtmlNoDLTag
127136
}
128137
try firstDL.children()
129138
.filter({ try $0.select("DT").hasText() })

Core/ContentBlocking.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ public class DomainsProtectionUserDefaultsStore: DomainsProtectionStore {
161161
public private(set) var unprotectedDomains: Set<String> {
162162
get {
163163
guard let data = userDefaults?.data(forKey: Keys.unprotectedDomains) else { return Set<String>() }
164-
guard let unprotectedDomains = try? NSKeyedUnarchiver.unarchivedObject(ofClass: NSSet.self, from: data) as? Set<String> else {
164+
guard let unprotectedDomains = try? NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSSet.self, NSString.self],
165+
from: data) as? Set<String> else {
165166
return Set<String>()
166167
}
167168
return unprotectedDomains

Core/FeatureFlagger.swift

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import Foundation
2121

2222
public enum Feature: String {
2323
case debugMenu
24+
case autofill
2425
}
2526

2627
public protocol FeatureFlagger {
@@ -31,7 +32,8 @@ public protocol FeatureFlaggerInternalUserDecider {
3132

3233
var isInternalUser: Bool { get }
3334

34-
func markUserAsInternalIfNeeded(forUrl url: URL?, response: HTTPURLResponse?)
35+
@discardableResult
36+
func markUserAsInternalIfNeeded(forUrl url: URL?, response: HTTPURLResponse?) -> Bool
3537
}
3638

3739
public class DefaultFeatureFlagger: FeatureFlagger {
@@ -42,6 +44,12 @@ public class DefaultFeatureFlagger: FeatureFlagger {
4244
switch feature {
4345
case .debugMenu:
4446
return isInternalUser
47+
case .autofill:
48+
if #available(iOS 14, *), isInternalUser {
49+
return true
50+
} else {
51+
return false
52+
}
4553
}
4654
}
4755

@@ -60,12 +68,18 @@ extension DefaultFeatureFlagger: FeatureFlaggerInternalUserDecider {
6068

6169
private static let internalUserVerificationURLHost = "login.duckduckgo.com"
6270

63-
public func markUserAsInternalIfNeeded(forUrl url: URL?, response: HTTPURLResponse?) {
71+
@discardableResult
72+
public func markUserAsInternalIfNeeded(forUrl url: URL?, response: HTTPURLResponse?) -> Bool {
6473
if isInternalUser { // If we're already an internal user, we don't need to do anything
65-
return
74+
return false
6675
}
6776

68-
didVerifyInternalUser = shouldMarkUserAsInternal(forUrl: url, statusCode: response?.statusCode)
77+
if shouldMarkUserAsInternal(forUrl: url, statusCode: response?.statusCode) {
78+
didVerifyInternalUser = true
79+
Pixel.fire(pixel: .featureFlaggingInternalUserAuthenticated)
80+
return true
81+
}
82+
return false
6983
}
7084

7185
func shouldMarkUserAsInternal(forUrl url: URL?, statusCode: Int?) -> Bool {

Core/Pixel.swift

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import os.log
2222

2323
// swiftlint:disable file_length
2424
// swiftlint:disable identifier_name
25+
// swiftlint:disable type_body_length
2526
public enum PixelName: String {
2627

2728
case appLaunch = "ml"
@@ -168,6 +169,11 @@ public enum PixelName: String {
168169

169170
case bookmarkImportSuccess = "m_bi_s"
170171
case bookmarkImportFailure = "m_bi_e"
172+
case bookmarkImportFailureParsingDL = "m_bi_e_parsing_dl"
173+
case bookmarkImportFailureParsingBody = "m_bi_e_parsing_body"
174+
case bookmarkImportFailureTransformingSafari = "m_bi_e_transforming_safari"
175+
case bookmarkImportFailureSaving = "m_bi_e_saving"
176+
case bookmarkImportFailureUnknown = "m_bi_e_unknown"
171177
case bookmarkExportSuccess = "m_be_a"
172178
case bookmarkExportFailure = "m_be_e"
173179

@@ -191,6 +197,35 @@ public enum PixelName: String {
191197

192198
case jsAlertShown = "m_js_alert_shown"
193199
case jsAlertBlocked = "m_js_alert_blocked"
200+
201+
case featureFlaggingInternalUserAuthenticated = "m_internal-user_authenticated"
202+
203+
case autofillLoginsSaveLoginModalOnboardingDisplayed = "m_autofill_logins_save_login_onboarding_inline_displayed"
204+
205+
case autofillLoginsSaveLoginModalDisplayed = "m_autofill_logins_save_login_inline_displayed"
206+
case autofillLoginsSaveLoginModalConfirmed = "m_autofill_logins_save_login_inline_confirmed"
207+
208+
case autofillLoginsSavePasswordModalDisplayed = "m_autofill_logins_save_password_inline_displayed"
209+
case autofillLoginsSavePasswordModalConfirmed = "m_autofill_logins_save_password_inline_confirmed"
210+
211+
case autofillLoginsUpdatePasswordModalDisplayed = "m_autofill_logins_update_password_inline_displayed"
212+
case autofillLoginsUpdatePasswordModalConfirmed = "m_autofill_logins_update_password_inline_confirmed"
213+
214+
case autofillLoginsUpdateUsernameModelDisplayed = "m_autofill_logins_update_username_inline_displayed"
215+
case autofillLoginsUpdateUsernameModelConfirmed = "m_autofill_logins_update_username_inline_confirmed"
216+
217+
case autofillLoginsFillLoginInlineDisplayed = "m_autofill_logins_fill_login_inline_displayed"
218+
case autofillLoginsFillLoginInlineConfirmed = "m_autofill_logins_fill_login_inline_confirmed"
219+
case autofillLoginsFillLoginInlineAuthenticationDeviceAuthAuthenticated =
220+
"m_autofill_logins_fill_login_inline_authentication_device-auth_authenticated"
221+
case autofillLoginsFillLoginInlineAuthenticationDeviceAuthFailed = "m_autofill_logins_fill_login_inline_authentication_device-auth_failed"
222+
case autofillLoginsFillLoginInlineAuthenticationDeviceAuthUnavailable =
223+
"m_autofill_logins_fill_login_inline_authentication_device-auth_unavailable"
224+
225+
case autofillSettingsOpened = "m_autofill_settings_opened"
226+
227+
case secureVaultInitError = "m_secure_vault_init_error"
228+
case secureVaultError = "m_secure_vault_error"
194229

195230
// MARK: SERP pixels
196231

@@ -254,6 +289,7 @@ public enum PixelName: String {
254289
case cachedTabPreviewsExceedsTabCount = "m_d_tpetc"
255290
case cachedTabPreviewRemovalError = "m_d_tpre"
256291
}
292+
// swiftlint:enable type_body_length
257293
// swiftlint:enable identifier_name
258294

259295
public struct PixelParameters {

Core/UserDefaultsPropertyWrapper.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ public struct UserDefaultsWrapper<T> {
7272

7373
case emailWaitlistShouldReceiveNotifications = "com.duckduckgo.ios.showWaitlistNotification"
7474
case unseenDownloadsAvailable = "com.duckduckgo.app.unseenDownloadsAvailable"
75+
76+
case autofill = "com.duckduckgo.ios.autofill"
77+
case autofillSaveModalRejectionCount = "com.duckduckgo.ios.autofillSaveModalRejectionCount"
78+
case autofillFirstTimeUser = "com.duckduckgo.ios.autofillFirstTimeUser"
7579

7680
case featureFlaggingDidVerifyInternalUser = "com.duckduckgo.app.featureFlaggingDidVerifyInternalUser"
7781

Core/ios-config.json

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"readme": "https://github.com/duckduckgo/privacy-configuration",
3-
"version": 1654870517289,
3+
"version": 1655387185511,
44
"features": {
55
"ampLinks": {
66
"exceptions": [
@@ -207,6 +207,10 @@
207207
"domain": "adidas.com",
208208
"reason": "Broken add to cart"
209209
},
210+
{
211+
"domain": "hm.com",
212+
"reason": "Broken add to cart"
213+
},
210214
{
211215
"domain": "notebooksbilliger.de",
212216
"reason": "Broken add to cart"
@@ -409,6 +413,17 @@
409413
}
410414
]
411415
},
416+
"aldi-digital.co.uk": {
417+
"rules": [
418+
{
419+
"rule": "assets.aldi-digital.co.uk/assets/050b4966c22c430e5c9308903ebb87e1/dist/scripts/main.js",
420+
"domains": [
421+
"aldi.co.uk"
422+
],
423+
"reason": "product images missing"
424+
}
425+
]
426+
},
412427
"alicdn.com": {
413428
"rules": [
414429
{
@@ -555,6 +570,39 @@
555570
}
556571
]
557572
},
573+
"facebook.net": {
574+
"rules": [
575+
{
576+
"rule": "connect.facebook.net/en_US/sdk.js",
577+
"domains": [
578+
"grubhub.com"
579+
],
580+
"reason": "broken login"
581+
}
582+
]
583+
},
584+
"fwmrm.net": {
585+
"rules": [
586+
{
587+
"rule": "2a7e9.v.fwmrm.net/ad/g/1",
588+
"domains": [
589+
"channel4.com"
590+
],
591+
"reason": "adwall"
592+
}
593+
]
594+
},
595+
"gigya.com": {
596+
"rules": [
597+
{
598+
"rule": "gigya.com/js/gigya.services.plugins.base.min.js",
599+
"domains": [
600+
"<all>"
601+
],
602+
"reason": "login content not loading"
603+
}
604+
]
605+
},
558606
"google-analytics.com": {
559607
"rules": [
560608
{
@@ -731,6 +779,17 @@
731779
}
732780
]
733781
},
782+
"tiqcdn.com": {
783+
"rules": [
784+
{
785+
"rule": "tags.tiqcdn.com/utag/agl/community/prod/utag.sync.js",
786+
"domains": [
787+
"agl.com.au"
788+
],
789+
"reason": "site loading delayed"
790+
}
791+
]
792+
},
734793
"twitter.com": {
735794
"rules": [
736795
{

0 commit comments

Comments
 (0)