Skip to content

Commit 3cb71d1

Browse files
authored
Bugfix FXIOS-11563 #25170 ⁃ History fetched from AS contains duplicates and we only check for duplicates in 200-item increments (#29288)
* Record visit only from webview's finish navigation delegate * Revert check because it causes side effects * Create record visit manager and integrate * Change to class because of mutating state * clean up * Fix PR review comments * save what I have so far * Use completion instead of deferred * Fix test and clean up * Fix comments * Add unit test on BVC for record visit * Add test for resetObservation
1 parent 77ec8be commit 3cb71d1

File tree

10 files changed

+425
-62
lines changed

10 files changed

+425
-62
lines changed

BrowserKit/Sources/Common/Constants/NotificationConstants.swift

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,6 @@ extension Notification.Name {
1717
public static let PrivateDataClearedHistory = Notification.Name("PrivateDataClearedHistory")
1818
public static let PrivateDataClearedDownloadedFiles = Notification.Name("PrivateDataClearedDownloadedFiles")
1919

20-
// Fired when the user finishes navigating to a page and the location has changed
21-
public static let OnLocationChange = Notification.Name("OnLocationChange")
22-
2320
// MARK: Notification UserInfo Keys
2421

2522
// Fired when the login synchronizer has finished applying remote changes

firefox-ios/Client.xcodeproj/project.pbxproj

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,7 @@
249249
2128E27B292E624400FB91BE /* SendToDeviceActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2128E27A292E624400FB91BE /* SendToDeviceActivity.swift */; };
250250
2128E27C2930216F00FB91BE /* SendToDeviceHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = E1AFBAF8292EA0330065E35E /* SendToDeviceHelper.swift */; };
251251
2128E27E2934F78600FB91BE /* CustomAppActivity.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2128E27D2934F78600FB91BE /* CustomAppActivity.swift */; };
252+
21292E6B2E7896910001AC06 /* RecordVisitObservationManagerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21292E6A2E7896910001AC06 /* RecordVisitObservationManagerTests.swift */; };
252253
212985E42A6F078800546684 /* ScreenState.swift in Sources */ = {isa = PBXBuildFile; fileRef = 212985E32A6F078800546684 /* ScreenState.swift */; };
253254
212985E72A72B39D00546684 /* ThemeSettingsControllerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 212985E52A72B22800546684 /* ThemeSettingsControllerTests.swift */; };
254255
21371FA228A6C4A200BC3F37 /* OnboardingTelemetryUtilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21371FA128A6C4A200BC3F37 /* OnboardingTelemetryUtilityTests.swift */; };
@@ -267,6 +268,7 @@
267268
214099652DD295F5004881E1 /* ZoomLevelPickerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 214099642DD295F5004881E1 /* ZoomLevelPickerView.swift */; };
268269
214099672DD392D1004881E1 /* ZoomSiteListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 214099662DD392D1004881E1 /* ZoomSiteListView.swift */; };
269270
214099692DD3B8AD004881E1 /* ZoomLevelCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 214099682DD3B8AD004881E1 /* ZoomLevelCellView.swift */; };
271+
2140E4632E71FC250054173A /* RecordVisitObservationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2140E4622E71FC240054173A /* RecordVisitObservationManager.swift */; };
270272
21420EF72ABA338D00B28550 /* TabTrayCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21420EF62ABA338D00B28550 /* TabTrayCoordinator.swift */; };
271273
21420EF92ABC75A400B28550 /* TabTrayCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21420EF82ABC75A400B28550 /* TabTrayCoordinatorTests.swift */; };
272274
2142B12C2D9F1284003AA82F /* ZoomPageManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2142B12A2D9F1284003AA82F /* ZoomPageManager.swift */; };
@@ -349,6 +351,8 @@
349351
21FA8FAE2AE856460013B815 /* TabsCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21FA8FAD2AE856460013B815 /* TabsCoordinatorTests.swift */; };
350352
21FA8FB02AE856590013B815 /* RemoteTabsCoordinatorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21FA8FAF2AE856590013B815 /* RemoteTabsCoordinatorTests.swift */; };
351353
21FA8FB22AE856EB0013B815 /* MockTabTrayCoordinatorDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21FA8FB12AE856EB0013B815 /* MockTabTrayCoordinatorDelegate.swift */; };
354+
21FB43CB2E7AF25D00A8818D /* MockHistoryHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21FB43CA2E7AF25D00A8818D /* MockHistoryHandler.swift */; };
355+
21FB441A2E7B3AE500A8818D /* MockRecordVisitObservationManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 21FB44192E7B3AE500A8818D /* MockRecordVisitObservationManager.swift */; };
352356
2386E4E624F8358E0072EF17 /* HomepageMessageCard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2386E4E524F8358E0072EF17 /* HomepageMessageCard.swift */; };
353357
23BEA767251A99ED00A014BF /* NewYorkMedium-Bold.otf in Resources */ = {isa = PBXBuildFile; fileRef = 23BEA766251A99E300A014BF /* NewYorkMedium-Bold.otf */; };
354358
23BEA768251A99ED00A014BF /* NewYorkMedium-BoldItalic.otf in Resources */ = {isa = PBXBuildFile; fileRef = 23BEA765251A99E200A014BF /* NewYorkMedium-BoldItalic.otf */; };
@@ -2904,6 +2908,7 @@
29042908
2122EE562DDD75D600D42716 /* GenericButtonCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GenericButtonCellView.swift; sourceTree = "<group>"; };
29052909
2128E27A292E624400FB91BE /* SendToDeviceActivity.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendToDeviceActivity.swift; sourceTree = "<group>"; };
29062910
2128E27D2934F78600FB91BE /* CustomAppActivity.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomAppActivity.swift; sourceTree = "<group>"; };
2911+
21292E6A2E7896910001AC06 /* RecordVisitObservationManagerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordVisitObservationManagerTests.swift; sourceTree = "<group>"; };
29072912
212985E32A6F078800546684 /* ScreenState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScreenState.swift; sourceTree = "<group>"; };
29082913
212985E52A72B22800546684 /* ThemeSettingsControllerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettingsControllerTests.swift; sourceTree = "<group>"; };
29092914
21371FA128A6C4A200BC3F37 /* OnboardingTelemetryUtilityTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingTelemetryUtilityTests.swift; sourceTree = "<group>"; };
@@ -2922,6 +2927,7 @@
29222927
214099642DD295F5004881E1 /* ZoomLevelPickerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoomLevelPickerView.swift; sourceTree = "<group>"; };
29232928
214099662DD392D1004881E1 /* ZoomSiteListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoomSiteListView.swift; sourceTree = "<group>"; };
29242929
214099682DD3B8AD004881E1 /* ZoomLevelCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoomLevelCellView.swift; sourceTree = "<group>"; };
2930+
2140E4622E71FC240054173A /* RecordVisitObservationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecordVisitObservationManager.swift; sourceTree = "<group>"; };
29252931
21420EF62ABA338D00B28550 /* TabTrayCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabTrayCoordinator.swift; sourceTree = "<group>"; };
29262932
21420EF82ABC75A400B28550 /* TabTrayCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabTrayCoordinatorTests.swift; sourceTree = "<group>"; };
29272933
2142B1292D9F1284003AA82F /* ZoomPageBar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ZoomPageBar.swift; sourceTree = "<group>"; };
@@ -3006,6 +3012,8 @@
30063012
21FA8FAD2AE856460013B815 /* TabsCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsCoordinatorTests.swift; sourceTree = "<group>"; };
30073013
21FA8FAF2AE856590013B815 /* RemoteTabsCoordinatorTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RemoteTabsCoordinatorTests.swift; sourceTree = "<group>"; };
30083014
21FA8FB12AE856EB0013B815 /* MockTabTrayCoordinatorDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTabTrayCoordinatorDelegate.swift; sourceTree = "<group>"; };
3015+
21FB43CA2E7AF25D00A8818D /* MockHistoryHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockHistoryHandler.swift; sourceTree = "<group>"; };
3016+
21FB44192E7B3AE500A8818D /* MockRecordVisitObservationManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockRecordVisitObservationManager.swift; sourceTree = "<group>"; };
30093017
220A4CC8B2685EEA3146A967 /* fa */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = fa; path = fa.lproj/ClearHistoryConfirm.strings; sourceTree = "<group>"; };
30103018
222F456780B38CE88601C7E1 /* dsb */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = dsb; path = dsb.lproj/Shared.strings; sourceTree = "<group>"; };
30113019
226347ACAF708B19B6BC2694 /* kn */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = kn; path = kn.lproj/Search.strings; sourceTree = "<group>"; };
@@ -14494,6 +14502,8 @@
1449414502
C889D7D22858C85200121E1D /* Mocks */ = {
1449514503
isa = PBXGroup;
1449614504
children = (
14505+
21FB44192E7B3AE500A8818D /* MockRecordVisitObservationManager.swift */,
14506+
21FB43CA2E7AF25D00A8818D /* MockHistoryHandler.swift */,
1449714507
219AEECD2E5E523600BF5F6F /* MockTabProviderProtocol.swift */,
1449814508
216424D32E56174400A3AF40 /* MockTabScrollHandlerDelegate.swift */,
1449914509
0B5CAF0C2E40DA89008B5D5A /* MockSummarizationChecker.swift */,
@@ -14973,6 +14983,7 @@
1497314983
D3A994941A368691008AD1AC /* Browser */ = {
1497414984
isa = PBXGroup;
1497514985
children = (
14986+
2140E4622E71FC240054173A /* RecordVisitObservationManager.swift */,
1497614987
034784BA2E2690F600D04A84 /* TermsOfUse */,
1497714988
81A3F6EE2C2DAED500BDD86B /* MainMenu */,
1497814989
1D7B78952ADF324E0011E9F2 /* Event Queue */,
@@ -15232,6 +15243,7 @@
1523215243
C714D6382E46575D00FC02E6 /* ShortcutsLibrary */,
1523315244
4331D3EE2A059C1C00542BDD /* SyncContentSettingsViewControllerTests.swift */,
1523415245
8AD54D3128FD9E2C0070D4B3 /* Theme */,
15246+
21292E6A2E7896910001AC06 /* RecordVisitObservationManagerTests.swift */,
1523515247
);
1523615248
path = Frontend;
1523715249
sourceTree = "<group>";
@@ -18188,6 +18200,7 @@
1818818200
0AFF7F6C2C7C7BBA00265214 /* CertificatesCell.swift in Sources */,
1818918201
8AAEBA062BF51141000C02B5 /* MicrosurveyMiddleware.swift in Sources */,
1819018202
431C0CA925C890E500395CE4 /* DefaultBrowserOnboardingViewModel.swift in Sources */,
18203+
2140E4632E71FC250054173A /* RecordVisitObservationManager.swift in Sources */,
1819118204
8A454D432CB9B8F5009436D9 /* TopSitesManager.swift in Sources */,
1819218205
7482205C1DBAB56300EEEA72 /* MailProviders.swift in Sources */,
1819318206
8A93F87029D3A597004159D9 /* SceneCoordinator.swift in Sources */,
@@ -19144,6 +19157,7 @@
1914419157
C2D80BEB2AAF395200CDF7A9 /* CredentialAutofillCoordinatorTests.swift in Sources */,
1914519158
F98CB66E2A4123F1005F38E9 /* EnhancedTrackingProtectionMenuVMTests.swift in Sources */,
1914619159
DF8C6DD72A52EED1007FAAF2 /* ClientSyncManagerTests.swift in Sources */,
19160+
21292E6B2E7896910001AC06 /* RecordVisitObservationManagerTests.swift in Sources */,
1914719161
C2D1A1112A67E73D00205DCC /* BookmarksCoordinatorTests.swift in Sources */,
1914819162
C2200A6A2B7D148C00DC062A /* ContentBlockerTests.swift in Sources */,
1914919163
C869916328918C36007ACC5C /* WallpaperNetworkingModuleTests.swift in Sources */,
@@ -19198,6 +19212,7 @@
1919819212
C2506C952A6A8D2600F2B76E /* HistoryCoordinatorTests.swift in Sources */,
1919919213
0B7B05432D64C08F007FD7AC /* MockURLProtocol.swift in Sources */,
1920019214
8ADAFAC628AEBF6300FFEBE3 /* HomeLogoHeaderViewModelTests.swift in Sources */,
19215+
21FB43CB2E7AF25D00A8818D /* MockHistoryHandler.swift in Sources */,
1920119216
E1EAA5EF2D49182700D3039C /* NavigationBarStateTests.swift in Sources */,
1920219217
613489A52D9443610009AF01 /* ToastTelemetryTests.swift in Sources */,
1920319218
8A75F1B828B558E20054E34D /* MessageCardDataAdaptorImplementationTests.swift in Sources */,
@@ -19332,6 +19347,7 @@
1933219347
21B548992B1E7FDF00DC1DF8 /* InactiveTabsManagerTests.swift in Sources */,
1933319348
8AF6D4DF2A856A9000B0474B /* MockContileNetworking.swift in Sources */,
1933419349
2FDB10931A9FBEC5006CF312 /* PrefsTests.swift in Sources */,
19350+
21FB441A2E7B3AE500A8818D /* MockRecordVisitObservationManager.swift in Sources */,
1933519351
C89C91AD2A1FE9E900BE57B1 /* OnboardingTelemetryDelegationTests.swift in Sources */,
1933619352
8A36BE2C29EDE16C00AC1C5C /* ContentContainerTests.swift in Sources */,
1933719353
401F68A52D84726700786D0C /* RemoteTabsPanelTests.swift in Sources */,

firefox-ios/Client/Frontend/Browser/BrowserViewController/Views/BrowserViewController.swift

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import class MozillaAppServices.BookmarkFolderData
2222
import class MozillaAppServices.BookmarkItemData
2323
import struct MozillaAppServices.Login
2424
import enum MozillaAppServices.BookmarkRoots
25+
import struct MozillaAppServices.VisitObservation
2526
import enum MozillaAppServices.VisitType
2627

2728
class BrowserViewController: UIViewController,
@@ -125,6 +126,7 @@ class BrowserViewController: UIViewController,
125126
var downloadToast: DownloadToast? // A toast that is showing the combined download progress
126127
var downloadProgressManager: DownloadProgressManager?
127128
let tabsPanelTelemetry: TabsPanelTelemetry
129+
let recordVisitManager: RecordVisitObserving
128130

129131
private var _downloadLiveActivityWrapper: Any?
130132

@@ -446,7 +448,8 @@ class BrowserViewController: UIViewController,
446448
documentLogger: DocumentLogger = AppContainer.shared.resolve(),
447449
appAuthenticator: AppAuthenticationProtocol = AppAuthenticator(),
448450
searchEnginesManager: SearchEnginesManager = AppContainer.shared.resolve(),
449-
userInitiatedQueue: DispatchQueueInterface = DispatchQueue.global(qos: .userInitiated)
451+
userInitiatedQueue: DispatchQueueInterface = DispatchQueue.global(qos: .userInitiated),
452+
recordVisitManager: RecordVisitObserving? = nil
450453
) {
451454
self.summarizerNimbusUtils = summarizerNimbusUtils
452455
self.profile = profile
@@ -467,6 +470,7 @@ class BrowserViewController: UIViewController,
467470
self.zoomManager = ZoomPageManager(windowUUID: tabManager.windowUUID)
468471
self.tabsPanelTelemetry = TabsPanelTelemetry(gleanWrapper: gleanWrapper, logger: logger)
469472
self.userInitiatedQueue = userInitiatedQueue
473+
self.recordVisitManager = recordVisitManager ?? RecordVisitObservationManager(historyHandler: profile.places)
470474

471475
super.init(nibName: nil, bundle: nil)
472476
didInit()
@@ -2931,6 +2935,7 @@ class BrowserViewController: UIViewController,
29312935
case .newTab:
29322936
willNavigateAway(from: tabManager.selectedTab)
29332937
topTabsDidPressNewTab(tabManager.selectedTab?.isPrivate ?? false)
2938+
recordVisitManager.resetRecording()
29342939
}
29352940
}
29362941

@@ -3400,11 +3405,11 @@ class BrowserViewController: UIViewController,
34003405
}
34013406

34023407
func focusLocationTextField(forTab tab: Tab?, setSearchText searchText: String? = nil) {
3403-
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(400)) {
3408+
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(400)) { [weak self] in
34043409
// Without a delay, the text field fails to become first responder
34053410
// Check that the newly created tab is still selected.
34063411
// This let's the user spam the Cmd+T button without lots of responder changes.
3407-
guard tab == self.tabManager.selectedTab else { return }
3412+
guard let self, tab == self.tabManager.selectedTab else { return }
34083413

34093414
if self.isToolbarRefactorEnabled {
34103415
let action = ToolbarAction(searchTerm: searchText,
@@ -3474,16 +3479,11 @@ class BrowserViewController: UIViewController,
34743479
return navigationController?.topViewController?.presentedViewController as? JSPromptAlertController != nil
34753480
}
34763481

3477-
fileprivate func postLocationChangeNotificationForTab(_ tab: Tab, navigation: WKNavigation?) {
3478-
let notificationCenter = NotificationCenter.default
3479-
var info = [AnyHashable: Any]()
3480-
info["url"] = tab.url?.displayURL
3481-
info["title"] = tab.title
3482-
if let visitType = self.getVisitTypeForTab(tab, navigation: navigation)?.rawValue {
3483-
info["visitType"] = visitType
3484-
}
3485-
info["isPrivate"] = tab.isPrivate
3486-
notificationCenter.post(name: .OnLocationChange, object: self, userInfo: info)
3482+
fileprivate func recordVisitForLocationChange(_ tab: Tab, navigation: WKNavigation?) {
3483+
let visitType = getVisitTypeForTab(tab, navigation: navigation) ?? .link
3484+
let url = tab.url?.displayURL?.description ?? ""
3485+
let visitObservation = VisitObservation(url: url, title: tab.title, visitType: visitType)
3486+
recordVisitManager.recordVisit(visitObservation: visitObservation, isPrivateTab: tab.isPrivate)
34873487
}
34883488

34893489
/// Enum to represent the WebView observation or delegate that triggered calling `navigateInTab`
@@ -3508,7 +3508,7 @@ class BrowserViewController: UIViewController,
35083508

35093509
if let url = webView.url {
35103510
if (!InternalURL.isValid(url: url) || url.isReaderModeURL) && !url.isFileURL {
3511-
postLocationChangeNotificationForTab(tab, navigation: navigation)
3511+
recordVisitForLocationChange(tab, navigation: navigation)
35123512
tab.readabilityResult = nil
35133513
webView.evaluateJavascriptInDefaultContentWorld(
35143514
"\(ReaderModeInfo.namespace.rawValue).checkReadability()"
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
// This Source Code Form is subject to the terms of the Mozilla Public
2+
// License, v. 2.0. If a copy of the MPL was not distributed with this
3+
// file, You can obtain one at http://mozilla.org/MPL/2.0/
4+
5+
import Common
6+
import MozillaAppServices
7+
import Shared
8+
import Storage
9+
import WebKit
10+
11+
// Handles recording visits to websites, which will be displayed in the History Panel.
12+
protocol RecordVisitObserving: AnyObject {
13+
func recordVisit(visitObservation: VisitObservation, isPrivateTab: Bool)
14+
func resetRecording()
15+
}
16+
17+
class RecordVisitObservationManager: RecordVisitObserving {
18+
private var historyHandler: HistoryHandler
19+
let logger: Logger
20+
var lastObservationRecorded: VisitObservation?
21+
22+
init(historyHandler: HistoryHandler,
23+
logger: Logger = DefaultLogger.shared) {
24+
self.historyHandler = historyHandler
25+
self.logger = logger
26+
}
27+
28+
func recordVisit(visitObservation: VisitObservation, isPrivateTab: Bool) {
29+
guard shouldRecordObservation(visitObservation: visitObservation, isPrivateTab: isPrivateTab) else { return }
30+
31+
// Check this observation hasn't been recorded already
32+
guard lastObservationRecorded?.url != visitObservation.url else { return }
33+
34+
historyHandler.applyObservation(visitObservation: visitObservation) { [weak self] result in
35+
switch result {
36+
case .success:
37+
self?.lastObservationRecorded = visitObservation
38+
case .failure(let error):
39+
self?.logger.log(error.localizedDescription,
40+
level: .warning,
41+
category: .sync)
42+
}
43+
}
44+
}
45+
46+
// Based on user actions like creating a new tab, we reset the last visit observation.
47+
func resetRecording() {
48+
lastObservationRecorded = nil
49+
}
50+
51+
// Record visits for websites that are not in a private tab, have non-empty titles,
52+
// and are not URLs that we ignore (localhost and about schemes).
53+
private func shouldRecordObservation(visitObservation: VisitObservation, isPrivateTab: Bool) -> Bool {
54+
guard let title = visitObservation.title, !title.isEmpty,
55+
!isPrivateTab,
56+
isValidURLToRecord(url: visitObservation.url) else {
57+
logger.log("Ignoring location change",
58+
level: .debug,
59+
category: .lifecycle)
60+
return false
61+
}
62+
63+
return true
64+
}
65+
66+
private func isValidURLToRecord(url: Url) -> Bool {
67+
guard let url = URL(string: url) else { return false }
68+
69+
return !isIgnoredURL(url) && (!InternalURL.isValid(url: url) || url.isReaderModeURL) && !url.isFileURL
70+
}
71+
}

0 commit comments

Comments
 (0)