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

Commit 23c600b

Browse files
ayoydiegoreymendez
authored andcommitted
Add pixels related to Duck Player usage (#1515)
Task/Issue URL: https://app.asana.com/0/1177771139624306/1205296919343346/f Description: This change adds several pixels to learn about Duck Player usage patterns.
1 parent c29aeb2 commit 23c600b

File tree

5 files changed

+84
-1
lines changed

5 files changed

+84
-1
lines changed

DuckDuckGo/Statistics/PixelEvent.swift

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,17 @@ extension Pixel {
146146

147147
case incrementalRolloutTest
148148

149+
// Duck Player
150+
case duckPlayerDailyUniqueView
151+
case duckPlayerViewFromYoutubeViaMainOverlay
152+
case duckPlayerViewFromYoutubeViaHoverButton
153+
case duckPlayerViewFromYoutubeAutomatic
154+
case duckPlayerViewFromSERP
155+
case duckPlayerViewFromOther
156+
case duckPlayerSettingAlways
157+
case duckPlayerSettingNever
158+
case duckPlayerSettingBackToDefault
159+
149160
enum Debug {
150161

151162
case assertionFailure(message: String, file: StaticString, line: UInt)
@@ -404,6 +415,26 @@ extension Pixel.Event {
404415

405416
case .incrementalRolloutTest:
406417
return "m_mac_netp_ev_incremental_rollout_test"
418+
419+
case .duckPlayerDailyUniqueView:
420+
return "m_mac_duck-player_daily-unique-view"
421+
case .duckPlayerViewFromYoutubeViaMainOverlay:
422+
return "m_mac_duck-player_view-from_youtube_main-overlay"
423+
case .duckPlayerViewFromYoutubeViaHoverButton:
424+
return "m_mac_duck-player_view-from_youtube_hover-button"
425+
case .duckPlayerViewFromYoutubeAutomatic:
426+
return "m_mac_duck-player_view-from_youtube_automatic"
427+
case .duckPlayerViewFromSERP:
428+
return "m_mac_duck-player_view-from_serp"
429+
case .duckPlayerViewFromOther:
430+
return "m_mac_duck-player_view-from_other"
431+
case .duckPlayerSettingAlways:
432+
return "m_mac_duck-player_setting_always"
433+
case .duckPlayerSettingNever:
434+
return "m_mac_duck-player_setting_never"
435+
case .duckPlayerSettingBackToDefault:
436+
return "m_mac_duck-player_setting_back-to-default"
437+
407438
}
408439

409440
}

DuckDuckGo/Statistics/PixelParameters.swift

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,16 @@ extension Pixel.Event {
134134
.userHasPinnedTab,
135135
.fireButtonFirstBurn,
136136
.fireButton,
137-
.incrementalRolloutTest:
137+
.incrementalRolloutTest,
138+
.duckPlayerDailyUniqueView,
139+
.duckPlayerViewFromYoutubeViaMainOverlay,
140+
.duckPlayerViewFromYoutubeViaHoverButton,
141+
.duckPlayerViewFromYoutubeAutomatic,
142+
.duckPlayerViewFromSERP,
143+
.duckPlayerViewFromOther,
144+
.duckPlayerSettingAlways,
145+
.duckPlayerSettingNever,
146+
.duckPlayerSettingBackToDefault:
138147
return nil
139148
}
140149
}

DuckDuckGo/Tab/TabExtensions/DuckPlayerTabExtension.swift

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ final class DuckPlayerTabExtension {
131131
extension DuckPlayerTabExtension: YoutubeOverlayUserScriptDelegate {
132132

133133
func youtubeOverlayUserScriptDidRequestDuckPlayer(with url: URL, in webView: WKWebView) {
134+
if duckPlayer.mode == .enabled {
135+
Pixel.fire(.duckPlayerViewFromYoutubeAutomatic)
136+
} else {
137+
Pixel.fire(.duckPlayerViewFromYoutubeViaHoverButton)
138+
}
134139
// to be standardised across the app
135140
let isRequestingNewTab = NSApp.isCommandPressed
136141
if isRequestingNewTab {
@@ -206,6 +211,9 @@ extension DuckPlayerTabExtension: NavigationResponder {
206211

207212
// Always allow loading Private Player URLs (local HTML)
208213
if navigationAction.url.isDuckPlayerScheme || navigationAction.url.isDuckPlayer {
214+
if navigationAction.request.allHTTPHeaderFields?["Referer"] == URL.duckDuckGo.absoluteString {
215+
Pixel.fire(.duckPlayerViewFromSERP)
216+
}
209217
return .allow
210218
}
211219

@@ -276,6 +284,17 @@ extension DuckPlayerTabExtension: NavigationResponder {
276284
|| (navigationAction.sourceFrame.url.isDuckPlayer && navigationAction.url.isYoutubeVideoRecommendation),
277285
let mainFrame = navigationAction.mainFrameTarget {
278286

287+
switch navigationAction.navigationType {
288+
case .custom, .redirect(.server):
289+
Pixel.fire(.duckPlayerViewFromOther)
290+
case .other:
291+
if navigationAction.request.allHTTPHeaderFields?["Referer"] == URL.duckDuckGo.absoluteString {
292+
Pixel.fire(.duckPlayerViewFromSERP)
293+
}
294+
default:
295+
break
296+
}
297+
279298
return .redirect(mainFrame) { navigator in
280299
navigator.load(URLRequest(url: .duckPlayer(videoID, timestamp: timestamp)))
281300
}
@@ -284,6 +303,15 @@ extension DuckPlayerTabExtension: NavigationResponder {
284303
return .next
285304
}
286305

306+
func didCommit(_ navigation: Navigation) {
307+
guard duckPlayer.isAvailable, duckPlayer.mode != .disabled else {
308+
return
309+
}
310+
if navigation.url.isDuckPlayer {
311+
Pixel.fire(.duckPlayerDailyUniqueView, limitToOnceADay: true)
312+
}
313+
}
314+
287315
@MainActor
288316
func navigationDidFinish(_ navigation: Navigation) {
289317
setUpYoutubeScriptsIfNeeded(for: navigation.url)

DuckDuckGo/YoutubePlayer/DuckPlayer.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,18 @@ final class DuckPlayer {
155155
if isFeatureEnabled {
156156
modeCancellable = preferences.$duckPlayerMode
157157
.removeDuplicates()
158+
.dropFirst(1)
159+
.handleEvents(receiveOutput: { mode in
160+
switch mode {
161+
case .enabled:
162+
Pixel.fire(.duckPlayerSettingAlways)
163+
case .alwaysAsk:
164+
Pixel.fire(.duckPlayerSettingBackToDefault)
165+
case .disabled:
166+
Pixel.fire(.duckPlayerSettingNever)
167+
}
168+
})
169+
.prepend(preferences.duckPlayerMode)
158170
.assign(to: \.mode, onWeaklyHeld: self)
159171
} else {
160172
modeCancellable = nil

DuckDuckGo/YoutubePlayer/YoutubeOverlayUserScript.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ extension YoutubeOverlayUserScript {
111111
let pixelName = parameters["pixelName"] as? String
112112
if pixelName == "play.use" || pixelName == "play.do_not_use" {
113113
duckPlayerPreferences.youtubeOverlayAnyButtonPressed = true
114+
if pixelName == "play.use" {
115+
Pixel.fire(.duckPlayerViewFromYoutubeViaMainOverlay)
116+
}
114117
}
115118

116119
// Temporary pixel for first time user uses Duck Player

0 commit comments

Comments
 (0)