Skip to content
This repository was archived by the owner on Feb 24, 2025. It is now read-only.

Commit 3ea4418

Browse files
authored
find in page (#24)
* handle cmd-f and show window * initial ui for find in page * refresh the accent color when set by the system * rename address bar view to focus ring view * remove the vertical alignment logic for the address bar * handle escape button * make address bar more responsive * disable next / previous menu items when there's no matches * basically works now, just needs to be tidied up * tidy up * fix issues from demo / feedback (buttons not working unless focused and retain search term per tab) * update to use latest styles * move standalone files to the bottom * update from feedback * minor change to show status when there are no hits as `0 of 0` * remove unused file and fix giving address bar focus on new tab * remove debug
1 parent 91a5b7c commit 3ea4418

30 files changed

+865
-128
lines changed

.gitmodules

+3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
[submodule "Submodules/bloom_cpp"]
22
path = Submodules/bloom_cpp
33
url = git@github.com:duckduckgo/bloom_cpp.git
4+
[submodule "Submodules/ios_js_support"]
5+
path = Submodules/ios_js_support
6+
url = git@github.com:duckduckgo/ios-js-support.git

DuckDuckGo.xcodeproj/project.pbxproj

+43-11
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414
1456D6E124EFCBC300775049 /* TabBarCollectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1456D6E024EFCBC300775049 /* TabBarCollectionView.swift */; };
1515
14A609C4255D65B20080DA6D /* MainMenuManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A609C3255D65B20080DA6D /* MainMenuManager.swift */; };
1616
14D9B8FB24F7E089000D4D13 /* AddressBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14D9B8F924F7E089000D4D13 /* AddressBarViewController.swift */; };
17-
14D9B90024F90230000D4D13 /* VerticallyCenteredTextFieldCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14D9B8FF24F90230000D4D13 /* VerticallyCenteredTextFieldCell.swift */; };
18-
14D9B90224F91316000D4D13 /* AddressBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14D9B90124F91316000D4D13 /* AddressBarView.swift */; };
17+
14D9B90224F91316000D4D13 /* FocusRingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14D9B90124F91316000D4D13 /* FocusRingView.swift */; };
1918
4B11060525903E570039B979 /* CoreDataEncryptionTesting.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 4B11060325903E570039B979 /* CoreDataEncryptionTesting.xcdatamodeld */; };
2019
4B11060A25903EAC0039B979 /* CoreDataEncryptionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B11060925903EAC0039B979 /* CoreDataEncryptionTests.swift */; };
2120
4B677431255DBEB800025BD8 /* BloomFilterWrapper.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4B677424255DBEB800025BD8 /* BloomFilterWrapper.mm */; };
@@ -50,6 +49,11 @@
5049
856C98D52570116900A22F1F /* NSWindow+Toast.swift in Sources */ = {isa = PBXBuildFile; fileRef = 856C98D42570116900A22F1F /* NSWindow+Toast.swift */; };
5150
856C98DA2570149800A22F1F /* FileDownloadTask.swift in Sources */ = {isa = PBXBuildFile; fileRef = 856C98D92570149800A22F1F /* FileDownloadTask.swift */; };
5251
856C98DF257014BD00A22F1F /* FileDownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 856C98DE257014BD00A22F1F /* FileDownloadManager.swift */; };
52+
85A0116925AF1D8900FA6A0C /* FindInPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85A0116825AF1D8900FA6A0C /* FindInPageViewController.swift */; };
53+
85A0117425AF2EDF00FA6A0C /* FindInPage.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 85A0117325AF2EDF00FA6A0C /* FindInPage.storyboard */; };
54+
85A0118225AF60E700FA6A0C /* FindInPageModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85A0118125AF60E700FA6A0C /* FindInPageModel.swift */; };
55+
85A011E525B4D49400FA6A0C /* findinpage.js in Resources */ = {isa = PBXBuildFile; fileRef = 85A011E425B4D49400FA6A0C /* findinpage.js */; };
56+
85A011EA25B4D4CA00FA6A0C /* FindInPageUserScript.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85A011E925B4D4CA00FA6A0C /* FindInPageUserScript.swift */; };
5357
85AE2FF224A33A2D002D507F /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 85AE2FF124A33A2D002D507F /* WebKit.framework */; };
5458
85D438B6256E7C9E00F3BAF8 /* ContextMenuUserScript.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85D438B5256E7C9E00F3BAF8 /* ContextMenuUserScript.swift */; };
5559
85D438BE256E8E6400F3BAF8 /* ContextMenuElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85D438BD256E8E6400F3BAF8 /* ContextMenuElement.swift */; };
@@ -166,8 +170,7 @@
166170
1456D6E024EFCBC300775049 /* TabBarCollectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabBarCollectionView.swift; sourceTree = "<group>"; };
167171
14A609C3255D65B20080DA6D /* MainMenuManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenuManager.swift; sourceTree = "<group>"; };
168172
14D9B8F924F7E089000D4D13 /* AddressBarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddressBarViewController.swift; sourceTree = "<group>"; };
169-
14D9B8FF24F90230000D4D13 /* VerticallyCenteredTextFieldCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VerticallyCenteredTextFieldCell.swift; sourceTree = "<group>"; };
170-
14D9B90124F91316000D4D13 /* AddressBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddressBarView.swift; sourceTree = "<group>"; };
173+
14D9B90124F91316000D4D13 /* FocusRingView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FocusRingView.swift; sourceTree = "<group>"; };
171174
4B11060425903E570039B979 /* CoreDataEncryptionTesting.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = CoreDataEncryptionTesting.xcdatamodel; sourceTree = "<group>"; };
172175
4B11060925903EAC0039B979 /* CoreDataEncryptionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CoreDataEncryptionTests.swift; sourceTree = "<group>"; };
173176
4B677424255DBEB800025BD8 /* BloomFilterWrapper.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = BloomFilterWrapper.mm; sourceTree = "<group>"; };
@@ -205,6 +208,11 @@
205208
856C98D42570116900A22F1F /* NSWindow+Toast.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSWindow+Toast.swift"; sourceTree = "<group>"; };
206209
856C98D92570149800A22F1F /* FileDownloadTask.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileDownloadTask.swift; sourceTree = "<group>"; };
207210
856C98DE257014BD00A22F1F /* FileDownloadManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileDownloadManager.swift; sourceTree = "<group>"; };
211+
85A0116825AF1D8900FA6A0C /* FindInPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindInPageViewController.swift; sourceTree = "<group>"; };
212+
85A0117325AF2EDF00FA6A0C /* FindInPage.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = FindInPage.storyboard; sourceTree = "<group>"; };
213+
85A0118125AF60E700FA6A0C /* FindInPageModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindInPageModel.swift; sourceTree = "<group>"; };
214+
85A011E425B4D49400FA6A0C /* findinpage.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; name = findinpage.js; path = Submodules/ios_js_support/src/findinpage.js; sourceTree = SOURCE_ROOT; };
215+
85A011E925B4D4CA00FA6A0C /* FindInPageUserScript.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FindInPageUserScript.swift; sourceTree = "<group>"; };
208216
85AE2FF124A33A2D002D507F /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
209217
85D438B5256E7C9E00F3BAF8 /* ContextMenuUserScript.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuUserScript.swift; sourceTree = "<group>"; };
210218
85D438BD256E8E6400F3BAF8 /* ContextMenuElement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContextMenuElement.swift; sourceTree = "<group>"; };
@@ -390,6 +398,7 @@
390398
4B677447255DBF1400025BD8 /* Submodules */ = {
391399
isa = PBXGroup;
392400
children = (
401+
85A011DB25B4D44800FA6A0C /* ios-js-support */,
393402
4B677448255DBF2300025BD8 /* bloom_cpp */,
394403
);
395404
name = Submodules;
@@ -466,6 +475,25 @@
466475
path = Model;
467476
sourceTree = "<group>";
468477
};
478+
85A0115D25AF1C4700FA6A0C /* FindInPage */ = {
479+
isa = PBXGroup;
480+
children = (
481+
85A0117325AF2EDF00FA6A0C /* FindInPage.storyboard */,
482+
85A0118125AF60E700FA6A0C /* FindInPageModel.swift */,
483+
85A011E925B4D4CA00FA6A0C /* FindInPageUserScript.swift */,
484+
85A0116825AF1D8900FA6A0C /* FindInPageViewController.swift */,
485+
);
486+
path = FindInPage;
487+
sourceTree = "<group>";
488+
};
489+
85A011DB25B4D44800FA6A0C /* ios-js-support */ = {
490+
isa = PBXGroup;
491+
children = (
492+
85A011E425B4D49400FA6A0C /* findinpage.js */,
493+
);
494+
name = "ios-js-support";
495+
sourceTree = "<group>";
496+
};
469497
85AE2FF024A33A2D002D507F /* Frameworks */ = {
470498
isa = PBXGroup;
471499
children = (
@@ -518,23 +546,24 @@
518546
isa = PBXGroup;
519547
children = (
520548
AA4D700525545EDE00C3411E /* AppDelegate */,
549+
AA585D85248FD31400E9A3E2 /* Assets.xcassets */,
521550
AA86491B24D837DE001BABEE /* BrowserTab */,
522551
AA6820E825503A21005ED0D5 /* Burning */,
523552
AA86491324D831B9001BABEE /* Common */,
524553
8556A60C256C15C60092FA9D /* FileDownload */,
554+
85A0115D25AF1C4700FA6A0C /* FindInPage */,
525555
AA585DB02490E6FA00E9A3E2 /* Main */,
526556
AA97BF4425135CB60014931A /* Menus */,
527557
AA86491524D83384001BABEE /* NavigationBar */,
528558
4B677422255DBEB800025BD8 /* Smarter Encryption */,
559+
4B677447255DBF1400025BD8 /* Submodules */,
529560
AACB8E7224A4C8BC005F2218 /* Suggestions */,
530561
AA86491124D8318F001BABEE /* TabBar */,
531562
AAE8B0FD258A416F00E81239 /* Tooltip */,
532563
AA6EF9AE25066F99004754E6 /* Windows */,
533-
4B677447255DBF1400025BD8 /* Submodules */,
534-
AA585D85248FD31400E9A3E2 /* Assets.xcassets */,
564+
4B677454255DC18000025BD8 /* Bridging.h */,
535565
AA585D8B248FD31400E9A3E2 /* DuckDuckGo.entitlements */,
536566
AA585D8A248FD31400E9A3E2 /* Info.plist */,
537-
4B677454255DC18000025BD8 /* Bridging.h */,
538567
);
539568
path = DuckDuckGo;
540569
sourceTree = "<group>";
@@ -704,10 +733,10 @@
704733
isa = PBXGroup;
705734
children = (
706735
AA2E423324C8A2270048C0D5 /* ColorView.swift */,
736+
14D9B90124F91316000D4D13 /* FocusRingView.swift */,
707737
AA86490B24D3494C001BABEE /* GradientView.swift */,
708738
AAA8E8BE24EA8A0A0055E685 /* MouseOverButton.swift */,
709739
AAA8E8C024EACA700055E685 /* MouseOverView.swift */,
710-
14D9B8FF24F90230000D4D13 /* VerticallyCenteredTextFieldCell.swift */,
711740
AA361A3524EBF0B500EEC649 /* WindowDraggingView.swift */,
712741
);
713742
path = View;
@@ -728,7 +757,6 @@
728757
AA80EC6F256C469C007083E7 /* NavigationBar.storyboard */,
729758
AA68C3D22490ED62001B8783 /* NavigationBarViewController.swift */,
730759
14D9B8F924F7E089000D4D13 /* AddressBarViewController.swift */,
731-
14D9B90124F91316000D4D13 /* AddressBarView.swift */,
732760
AABEE6AE24AD22B90043105B /* AddressBarTextField.swift */,
733761
AAA0CC32252F181A0079BC96 /* NavigationButtonMenuDelegate.swift */,
734762
AAA0CC462533833C0079BC96 /* OptionsButtonMenu.swift */,
@@ -1087,9 +1115,11 @@
10871115
buildActionMask = 2147483647;
10881116
files = (
10891117
AA80EC73256C46A2007083E7 /* Suggestions.storyboard in Resources */,
1118+
85A0117425AF2EDF00FA6A0C /* FindInPage.storyboard in Resources */,
10901119
AA80EC89256C49B8007083E7 /* Localizable.strings in Resources */,
10911120
AAE8B102258A41C000E81239 /* Tooltip.storyboard in Resources */,
10921121
AA68C3D72490F821001B8783 /* README.md in Resources */,
1122+
85A011E525B4D49400FA6A0C /* findinpage.js in Resources */,
10931123
AA585D86248FD31400E9A3E2 /* Assets.xcassets in Resources */,
10941124
AA585D89248FD31400E9A3E2 /* Main.storyboard in Resources */,
10951125
AA80EC79256C46AA007083E7 /* TabBar.storyboard in Resources */,
@@ -1154,7 +1184,6 @@
11541184
AA5C8F5E2590EEE800748EB7 /* NSPointExtension.swift in Sources */,
11551185
AA6EF9AD25066F42004754E6 /* WindowsManager.swift in Sources */,
11561186
4B677437255DBEB800025BD8 /* HTTPSUpgrade.swift in Sources */,
1157-
14D9B90024F90230000D4D13 /* VerticallyCenteredTextFieldCell.swift in Sources */,
11581187
1430DFF524D0580F00B8978C /* TabBarViewController.swift in Sources */,
11591188
4BA1A6B3258B080A00F6F690 /* EncryptionKeyGeneration.swift in Sources */,
11601189
AABEE6A524AA0A7F0043105B /* SuggestionsViewController.swift in Sources */,
@@ -1190,6 +1219,7 @@
11901219
AA5C8F59258FE21F00748EB7 /* NSTextFieldExtension.swift in Sources */,
11911220
4BA1A6A5258B07DF00F6F690 /* EncryptedValueTransformer.swift in Sources */,
11921221
AA6EF9B525081B4C004754E6 /* MainMenuActions.swift in Sources */,
1222+
85A0116925AF1D8900FA6A0C /* FindInPageViewController.swift in Sources */,
11931223
AA6FFB4424DC33320028F4D0 /* NSViewExtension.swift in Sources */,
11941224
AA585D84248FD31100E9A3E2 /* BrowserTabViewController.swift in Sources */,
11951225
AABEE69324A4E2F80043105B /* SuggestionsAPI.swift in Sources */,
@@ -1199,14 +1229,16 @@
11991229
AA6820F125503DA9005ED0D5 /* FireViewModel.swift in Sources */,
12001230
AAA0CC6A253CC43C0079BC96 /* WKUserContentControllerExtension.swift in Sources */,
12011231
AA9FF95D24A1FA1C0039E328 /* TabCollection.swift in Sources */,
1232+
85A0118225AF60E700FA6A0C /* FindInPageModel.swift in Sources */,
12021233
AA86490E24D49B54001BABEE /* TabLoadingView.swift in Sources */,
12031234
AA2CB1352587C29500AA6FBE /* TabBarFooter.swift in Sources */,
1204-
14D9B90224F91316000D4D13 /* AddressBarView.swift in Sources */,
1235+
14D9B90224F91316000D4D13 /* FocusRingView.swift in Sources */,
12051236
AA92126F25ACCB1100600CD4 /* ErrorExtension.swift in Sources */,
12061237
AAA8E8C124EACA700055E685 /* MouseOverView.swift in Sources */,
12071238
AAE8B110258A456C00E81239 /* TooltipViewController.swift in Sources */,
12081239
AA3F895324C18AD500628DDE /* SuggestionViewModel.swift in Sources */,
12091240
4B677431255DBEB800025BD8 /* BloomFilterWrapper.mm in Sources */,
1241+
85A011EA25B4D4CA00FA6A0C /* FindInPageUserScript.swift in Sources */,
12101242
AA9FF95B24A1EFC20039E328 /* TabViewModel.swift in Sources */,
12111243
AA9E9A5E25A4867200D1959D /* TabDragAndDropManager.swift in Sources */,
12121244
AA8EDF2724923EC70071C2E8 /* StringExtension.swift in Sources */,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"colors" : [
3+
{
4+
"color" : {
5+
"color-space" : "srgb",
6+
"components" : {
7+
"alpha" : "1.000",
8+
"blue" : "1.000",
9+
"green" : "1.000",
10+
"red" : "1.000"
11+
}
12+
},
13+
"idiom" : "universal"
14+
}
15+
],
16+
"info" : {
17+
"author" : "xcode",
18+
"version" : 1
19+
}
20+
}
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "Close-Large.pdf",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "Find-Next.pdf",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "Find-Previous.pdf",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Binary file not shown.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"images" : [
3+
{
4+
"filename" : "Find-Search.pdf",
5+
"idiom" : "universal"
6+
}
7+
],
8+
"info" : {
9+
"author" : "xcode",
10+
"version" : 1
11+
}
12+
}
Binary file not shown.

DuckDuckGo/BrowserTab/Model/Tab.swift

+41-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import Cocoa
2020
import WebKit
2121
import os
22+
import Combine
2223

2324
protocol TabDelegate: class {
2425

@@ -62,6 +63,13 @@ class Tab: NSObject {
6263
@Published var title: String?
6364
@Published var error: Error?
6465

66+
weak var findInPage: FindInPageModel? {
67+
didSet {
68+
findInPageScript.model = findInPage
69+
subscribeToFindInPageTextChange()
70+
}
71+
}
72+
6573
// Used to track if an error was caused by a download navigation.
6674
private var currentDownload: FileDownload?
6775

@@ -129,11 +137,13 @@ class Tab: NSObject {
129137
let faviconScript = FaviconUserScript()
130138
let html5downloadScript = HTML5DownloadUserScript()
131139
let contextMenuScript = ContextMenuUserScript()
140+
let findInPageScript = FindInPageUserScript()
132141

133142
lazy var userScripts = [
134143
self.faviconScript,
135144
self.html5downloadScript,
136-
self.contextMenuScript
145+
self.contextMenuScript,
146+
self.findInPageScript
137147
]
138148

139149
private func setupUserScripts() {
@@ -146,6 +156,16 @@ class Tab: NSObject {
146156
}
147157
}
148158

159+
var findInPageCancellable: AnyCancellable?
160+
private func subscribeToFindInPageTextChange() {
161+
findInPageCancellable?.cancel()
162+
if let findInPage = findInPage {
163+
findInPageCancellable = findInPage.$text.receive(on: DispatchQueue.main).sink { text in
164+
self.find(text: text)
165+
}
166+
}
167+
}
168+
149169
}
150170

151171
extension Tab: ContextMenuDelegate {
@@ -284,6 +304,26 @@ extension Tab: WKNavigationDelegate {
284304

285305
}
286306

307+
extension Tab {
308+
309+
private func find(text: String) {
310+
findInPageScript.find(text: text, inWebView: webView)
311+
}
312+
313+
func findDone() {
314+
findInPageScript.done(withWebView: webView)
315+
}
316+
317+
func findNext() {
318+
findInPageScript.next(withWebView: webView)
319+
}
320+
321+
func findPrevious() {
322+
findInPageScript.previous(withWebView: webView)
323+
}
324+
325+
}
326+
287327
fileprivate extension WKWebViewConfiguration {
288328

289329
static func makeConfiguration() -> WKWebViewConfiguration {

DuckDuckGo/BrowserTab/Model/UserScript.swift

+16
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,22 @@ class UserScript: WKUserScript {
3333
}
3434
}
3535

36+
static func loadJS(_ jsFile: String, withReplacements replacements: [String: String] = [:]) -> String {
37+
38+
let bundle = Bundle.main
39+
let path = bundle.path(forResource: jsFile, ofType: "js")!
40+
41+
guard var js = try? String(contentsOfFile: path) else {
42+
fatalError("Failed to load JavaScript \(jsFile) from \(path)")
43+
}
44+
45+
for (key, value) in replacements {
46+
js = js.replacingOccurrences(of: key, with: value, options: .literal)
47+
}
48+
49+
return js
50+
}
51+
3652
}
3753

3854
extension UserScript: WKScriptMessageHandler {

DuckDuckGo/BrowserTab/View/BrowserTabViewController.swift

+1
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ extension BrowserTabViewController: TabDelegate {
156156

157157
func tabDidStartNavigation(_ tab: Tab) {
158158
setFirstResponderIfNeeded()
159+
tabViewModel?.closeFindInPage()
159160
}
160161

161162
func tab(_ tab: Tab, requestedNewTab url: URL?, selected: Bool) {

DuckDuckGo/BrowserTab/ViewModel/TabViewModel.swift

+24
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class TabViewModel {
4848
@Published private(set) var passiveAddressBarString: String = ""
4949
@Published private(set) var title: String = UserText.tabHomeTitle
5050
@Published private(set) var favicon: NSImage = Favicon.home
51+
@Published private(set) var findInPage: FindInPageModel = FindInPageModel()
5152

5253
init(tab: Tab) {
5354
self.tab = tab
@@ -149,3 +150,26 @@ class TabViewModel {
149150
}
150151

151152
}
153+
154+
extension TabViewModel {
155+
156+
func startFindInPage() {
157+
tab.findInPage = findInPage
158+
findInPage.show()
159+
}
160+
161+
func closeFindInPage() {
162+
guard findInPage.visible else { return }
163+
tab.findDone()
164+
findInPage.hide()
165+
}
166+
167+
func findInPageNext() {
168+
tab.findNext()
169+
}
170+
171+
func findInPagePrevious() {
172+
tab.findPrevious()
173+
}
174+
175+
}

0 commit comments

Comments
 (0)