Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update CTL rule splitting logic with alternate path #2733

Merged
merged 3 commits into from
May 1, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 87 additions & 13 deletions DuckDuckGo/ContentBlocker/ClickToLoad/ClickToLoadRulesSplitter.swift
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,10 @@
}

private func split(trackerData: TrackerDataManager.DataSet) -> (withoutBlockCTL: TrackerDataManager.DataSet, withBlockCTL: TrackerDataManager.DataSet)? {
let trackersWithBlockCTL = filterTrackersWithCTLAction(trackerData.tds.trackers)

if !trackersWithBlockCTL.isEmpty {
let trackersWithoutBlockCTL = filterTrackersWithoutCTLAction(trackerData.tds.trackers)
let trackerDataWithoutBlockCTL = makeTrackerData(using: trackersWithoutBlockCTL, originalTDS: trackerData.tds)
let trackerDataWithBlockCTL = makeTrackerData(using: trackersWithBlockCTL, originalTDS: trackerData.tds)
let (mainTrackers, ctlTrackers) = processCTLActions(trackerData.tds.trackers)
if !ctlTrackers.isEmpty {
let trackerDataWithoutBlockCTL = makeTrackerData(using: mainTrackers, originalTDS: trackerData.tds)
let trackerDataWithBlockCTL = makeTrackerData(using: ctlTrackers, originalTDS: trackerData.tds)

return (
(tds: trackerDataWithoutBlockCTL, etag: Constants.tdsRuleListPrefix + trackerData.etag),
Expand All @@ -76,16 +74,92 @@
cnames: originalTDS.cnames)
}

private func filterTrackersWithoutCTLAction(_ trackers: [String: KnownTracker]) -> [String: KnownTracker] {
trackers.filter { (_, tracker) in tracker.containsCTLActions == false }
}
private func processCTLActions(_ trackers: [String: KnownTracker]) -> (mainTrackers: [String: KnownTracker], ctlTrackers: [String: KnownTracker]) {
var mainTDSTrackers: [String: KnownTracker] = [:]
var ctlTrackers: [String: KnownTracker] = [:]

for (key, tracker) in trackers {
if let rules = tracker.rules as [KnownTracker.Rule]? {
var normalRules: [KnownTracker.Rule] = []
var ctlRules: [KnownTracker.Rule] = []

for ruleIndex in rules.indices.reversed() {

Check failure on line 86 in DuckDuckGo/ContentBlocker/ClickToLoad/ClickToLoadRulesSplitter.swift

View workflow job for this annotation

GitHub Actions / Make Release Build

type 'KnownTracker.ActionType' has no member 'blockCtlFB'
if let action = rules[ruleIndex].action, action == .blockCtlFB {
ctlRules.insert(rules[ruleIndex], at: 0)
} else {
normalRules.insert(rules[ruleIndex], at: 0)
}
}

private func filterTrackersWithCTLAction(_ trackers: [String: KnownTracker]) -> [String: KnownTracker] {
return Dictionary(uniqueKeysWithValues: trackers.filter { (_, tracker) in
return tracker.containsCTLActions == true
})
if !ctlRules.isEmpty {
// if we found some CTL rules, split out into its own list
let mainTracker = KnownTracker(domain: tracker.domain,
defaultAction: tracker.defaultAction,
owner: tracker.owner,
prevalence: tracker.prevalence,
subdomains: tracker.subdomains,
categories: tracker.categories,
rules: normalRules)
let ctlTracker = KnownTracker(domain: tracker.domain,
defaultAction: tracker.defaultAction,
owner: tracker.owner,
prevalence: tracker.prevalence,
subdomains: tracker.subdomains,
categories: tracker.categories,
rules: ctlRules)
mainTDSTrackers[key] = mainTracker
ctlTrackers[key] = ctlTracker
} else {
// copy tracker as-is
mainTDSTrackers[key] = tracker
}
}
}

return (mainTDSTrackers, ctlTrackers)
}

// private func filterTrackersWithoutCTLAction(_ trackers: [String: KnownTracker]) -> [String: KnownTracker] {
// trackers.filter { (_, tracker) in tracker.containsCTLActions == false }
// }
//
// private func filterTrackersWithCTLAction(_ trackers: [String: KnownTracker]) -> [String: KnownTracker] {
// return Dictionary(uniqueKeysWithValues: trackers.filter { (_, tracker) in
// return tracker.containsCTLActions == true
// }.map { (trackerKey, trackerValue) in
// // Modify the tracker here
// if let rules = trackerValue.rules as [KnownTracker.Rule]? {
// let updatedRules = rules.map { (ruleValue) in
// var action = ruleValue.action
// if action == .blockCtlFB {
// if ruleValue.surrogate != nil {
// action = nil
// } else {
// action = .block
// }
// }
// let newRule = KnownTracker.Rule(rule: ruleValue.rule,
// surrogate: ruleValue.surrogate,
// action: action,
// options: ruleValue.options,
// exceptions: ruleValue.exceptions)
// return newRule
// }
// let updatedTracker = KnownTracker(domain: trackerValue.domain,
// defaultAction: trackerValue.defaultAction,
// owner: trackerValue.owner,
// prevalence: trackerValue.prevalence,
// subdomains: trackerValue.subdomains,
// categories: trackerValue.categories,
// rules: updatedRules)
//
// return (trackerKey, updatedTracker)
// }
//
// return (trackerKey, trackerValue)
// })
// }

private func extractDomains(from entities: [String: Entity]) -> [String: String] {
var domains = [String: String]()
for entity in entities {
Expand All @@ -110,13 +184,13 @@

private extension KnownTracker {

var containsCTLActions: Bool {

Check failure on line 187 in DuckDuckGo/ContentBlocker/ClickToLoad/ClickToLoadRulesSplitter.swift

View workflow job for this annotation

GitHub Actions / Make Release Build

type 'KnownTracker.ActionType' has no member 'blockCtlFB'
if let defaultAction = defaultAction, defaultAction == .blockCtlFB {
return true
}

if let rules = rules {
for rule in rules {

Check failure on line 193 in DuckDuckGo/ContentBlocker/ClickToLoad/ClickToLoadRulesSplitter.swift

View workflow job for this annotation

GitHub Actions / Make Release Build

type 'KnownTracker.ActionType' has no member 'blockCtlFB'
if let action = rule.action, action == .blockCtlFB {
return true
}
Expand Down
Loading