Skip to content

Commit

Permalink
return urls on burn domains (#992)
Browse files Browse the repository at this point in the history
  • Loading branch information
mallexxx authored Sep 13, 2024
1 parent e304d39 commit 026acbd
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 10 deletions.
17 changes: 9 additions & 8 deletions Sources/History/HistoryCoordinator.swift
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ public protocol HistoryCoordinating: AnyObject {
func title(for url: URL) -> String?

func burnAll(completion: @escaping () -> Void)
func burnDomains(_ baseDomains: Set<String>, tld: TLD, completion: @escaping () -> Void)
func burnDomains(_ baseDomains: Set<String>, tld: TLD, completion: @escaping (Set<URL>) -> Void)
func burnVisits(_ visits: [Visit], completion: @escaping () -> Void)

}
Expand Down Expand Up @@ -168,19 +168,20 @@ final public class HistoryCoordinator: HistoryCoordinating {
}
}

public func burnDomains(_ baseDomains: Set<String>, tld: TLD, completion: @escaping () -> Void) {
public func burnDomains(_ baseDomains: Set<String>, tld: TLD, completion: @escaping (Set<URL>) -> Void) {
guard let historyDictionary = historyDictionary else { return }

var urls = Set<URL>()
let entries: [HistoryEntry] = historyDictionary.values.filter { historyEntry in
guard let host = historyEntry.url.host, let baseDomain = tld.eTLDplus1(host) else {
return false
}

return baseDomains.contains(baseDomain)
guard let host = historyEntry.url.host,
let baseDomain = tld.eTLDplus1(host),
baseDomains.contains(baseDomain) else { return false }
urls.insert(historyEntry.url)
return true
}

removeEntries(entries, completionHandler: { _ in
completion()
completion(urls)
})
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -332,9 +332,44 @@ class MockAutofillEmailDelegate: AutofillEmailDelegate {
class MockWebView: WKWebView {

var javaScriptString: String?
var evaluateJavaScriptResult: Any?

override func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -> Void)? = nil) {
self.javaScriptString = javaScriptString
convenience init() {
self.init(frame: .zero, configuration: WKWebViewConfiguration())
}

override init(frame: CGRect, configuration: WKWebViewConfiguration) {
_=Self.swizzleEvaluateJavaScriptOnce
super.init(frame: frame, configuration: configuration)
}

required init?(coder: NSCoder) {
_=Self.swizzleEvaluateJavaScriptOnce
super.init(coder: coder)
}

}
private extension WKWebView {

static let swizzleEvaluateJavaScriptOnce: () = {
guard let originalMethod = class_getInstanceMethod(WKWebView.self, #selector(evaluateJavaScript(_:completionHandler:))),
let swizzledMethod = class_getInstanceMethod(WKWebView.self, #selector(swizzled_evaluateJavaScript(_:completionHandler:))) else {
assertionFailure("Methods not available")
return
}

method_exchangeImplementations(originalMethod, swizzledMethod)
}()

// place popover inside bounds of its owner Main Window
@objc(swizzled_evaluateJavaScript:completionHandler:)
private dynamic func swizzled_evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, (any Error)?) -> Void)? = nil) {
if let mockWebView = self as? MockWebView {
mockWebView.javaScriptString = javaScriptString
completionHandler?(mockWebView.evaluateJavaScriptResult, nil)
return
}
self.swizzled_evaluateJavaScript(javaScriptString, completionHandler: completionHandler) // call the original
}

}
Expand Down
37 changes: 37 additions & 0 deletions Tests/HistoryTests/HistoryCoordinatorTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,43 @@ class HistoryCoordinatorTests: XCTestCase {
waitForExpectations(timeout: 1.0)
}

func testWhenHistoryIsBurningDomains_ThenHistoryIsCleanedForDomainsAndRemovedUrlsReturnedInCallback() {
let burnAllFinished = expectation(description: "Burn All Finished")
let (historyStoringMock, historyCoordinator) = HistoryCoordinator.aHistoryCoordinator

let url0 = URL(string: "https://tobekept.com")!
historyCoordinator.addVisit(of: url0)

let url1 = URL(string: "https://duckduckgo.com")!
historyCoordinator.addVisit(of: url1)

let url2 = URL(string: "https://test.duckduckgo.com")!
historyCoordinator.addVisit(of: url2)

let fireproofDomain = "wikipedia.org"
let url3 = URL(string: "https://\(fireproofDomain)")!
historyCoordinator.addVisit(of: url3)

let url4 = URL(string: "https://subdomain.\(fireproofDomain)")!
historyCoordinator.addVisit(of: url4)

let url5 = URL(string: "https://test.com")!
historyCoordinator.addVisit(of: url5)

XCTAssert(historyCoordinator.history!.count == 6)

historyCoordinator.burnDomains(["duckduckgo.com", fireproofDomain], tld: TLD()) { urls in
let expectedUrls = Set([url1, url2, url3, url4])

XCTAssertEqual(Set(historyStoringMock.removeEntriesArray.map(\.url)), expectedUrls)
XCTAssertEqual(urls, expectedUrls)

burnAllFinished.fulfill()
}

waitForExpectations(timeout: 2.0)
}

func testWhenUrlIsMarkedAsFailedToLoad_ThenFailedToLoadFlagIsStored() {
let (historyStoringMock, historyCoordinator) = HistoryCoordinator.aHistoryCoordinator

Expand Down

0 comments on commit 026acbd

Please sign in to comment.