Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
79 commits
Select commit Hold shift + click to select a range
fb3b575
Initial structure
mgurgel Mar 31, 2025
19f9a06
Duck Player Native feature
mgurgel Mar 31, 2025
81f58fd
Error detection
mgurgel Mar 31, 2025
424c0b2
Switching to notifications
mgurgel Apr 4, 2025
154237a
Interval
mgurgel Apr 4, 2025
3353082
Feature setup
mgurgel Apr 7, 2025
524734c
Apple Isolated only
mgurgel Apr 8, 2025
7c2d132
Locale in setup
mgurgel Apr 8, 2025
608fc50
Doc fix
mgurgel Apr 8, 2025
de3c876
Logging timestamp
mgurgel Apr 8, 2025
43b3abf
onCurrentTimestamp
mgurgel Apr 8, 2025
e14db90
Unlogging timestamp
mgurgel Apr 8, 2025
05b042e
Removed duplicate observe call
mgurgel Apr 8, 2025
a7ea5af
More logging
mgurgel Apr 8, 2025
7217d8f
Media control params and other tweaks
mgurgel Apr 9, 2025
9c16045
Thumbnail overlay
mgurgel Apr 15, 2025
3e1c870
Error and Overlay
mgurgel Apr 15, 2025
7be63d4
Thumbnail is showing
mgurgel Apr 15, 2025
1ec850a
Major cleanup
mgurgel Apr 16, 2025
60e5808
Logger refactor
mgurgel Apr 17, 2025
ce68f85
Duck Player Native tests
mgurgel Apr 17, 2025
1137a93
Tests
mgurgel Apr 17, 2025
1a3f9de
Privacy config update
mgurgel Apr 17, 2025
6b33fd1
Can they co-exist?
mgurgel Apr 17, 2025
500e05a
Privacy config update
mgurgel Apr 17, 2025
276e16a
More tests
mgurgel Apr 17, 2025
405e8db
Catchup with Daniel
mgurgel Apr 23, 2025
cbf156d
Using SideEffects class
mgurgel Apr 23, 2025
dbe7400
Cleanup
mgurgel Apr 23, 2025
ae0f2c5
Cleanup
mgurgel Apr 23, 2025
c36539e
Feature settings fix
mgurgel Apr 24, 2025
1a9b8da
Timestamp fixes
mgurgel Apr 24, 2025
dc93055
Changed loading sequence
mgurgel Apr 25, 2025
ebec399
Fixes
mgurgel Apr 25, 2025
7e2a129
It runs
mgurgel Apr 25, 2025
6390192
Pausing
mgurgel Apr 25, 2025
1c67864
Setup order
mgurgel Apr 25, 2025
81f4bc8
Destroy
mgurgel Apr 25, 2025
9e93772
Setup everything
mgurgel Apr 25, 2025
ae0dbec
Logging
mgurgel Apr 25, 2025
f3746cf
Init
mgurgel Apr 25, 2025
a11b5a2
Comment out init
mgurgel Apr 25, 2025
2b23859
Init again
mgurgel Apr 25, 2025
8116a6d
Log order
mgurgel Apr 28, 2025
053d6ee
No init on first run
mgurgel Apr 29, 2025
49bafba
New onDuckPlayerScriptsReady event
mgurgel Apr 29, 2025
f3f417f
Framed fix
mgurgel Apr 30, 2025
bb90fc7
Code cleanup
mgurgel Apr 30, 2025
1d8e0ca
Defer notify scripts ready
mgurgel May 1, 2025
7c90efa
Cleanup
mgurgel May 1, 2025
ab4683b
Dismiss on click
mgurgel May 2, 2025
ed63c33
Firing message on thumbnail dismiss
mgurgel May 5, 2025
9670e06
Updated tests
mgurgel May 6, 2025
3e51cf0
Lint
mgurgel May 6, 2025
704ee4b
Duck Player Native non-isolated
mgurgel May 6, 2025
faecc73
Warn (instead of error) on Duck Player returning early
mgurgel May 8, 2025
044dab6
Ad detection logic
mgurgel May 8, 2025
ca5c595
Lint
mgurgel May 8, 2025
b1af6ba
Ad detection behing remote config
mgurgel May 8, 2025
cf87cc2
Revert "Duck Player Native non-isolated"
mgurgel May 9, 2025
1b7704f
Reverting non-isolated mode
mgurgel May 9, 2025
2e74a95
Duck Player Native in both mode
mgurgel May 9, 2025
92d8fea
Code cleanup
mgurgel May 13, 2025
4b9e73c
Unit tests
mgurgel May 13, 2025
2a8bdc0
Restore verbose debugging
mgurgel May 13, 2025
70bc526
scripts ready log
mgurgel May 14, 2025
b03dd7c
Logs
mgurgel May 14, 2025
59bc6d9
Removed logging
mgurgel May 15, 2025
805143e
Removed logging
mgurgel May 15, 2025
fa0d3a3
Dependency fix
mgurgel May 15, 2025
444e593
Cleanup
mgurgel May 15, 2025
be3b702
Cleanup
mgurgel May 15, 2025
ccbaa95
Cache clean
mgurgel May 15, 2025
2a4d8d9
More comments; Reverted docs script change
mgurgel May 15, 2025
0b186ee
Shane/shared demo (#1690)
shakyShane May 15, 2025
4db2e6d
Removed console.log
mgurgel May 15, 2025
8d4b55b
interface-based (#1692)
shakyShane May 16, 2025
c91e428
Fixed missing currentPage ref
mgurgel May 16, 2025
d8a2ae0
Removed mock transport
mgurgel May 16, 2025
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
1 change: 1 addition & 0 deletions injected/entry-points/integration.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ function generateConfig() {
'webCompat',
'apiManipulation',
'duckPlayer',
'duckPlayerNative',
],
},
};
Expand Down
129 changes: 129 additions & 0 deletions injected/integration-test/duckplayer-native.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
import { test } from '@playwright/test';
import { DuckPlayerNative } from './page-objects/duckplayer-native.js';

test.describe('Duck Player Native messaging', () => {
test('Calls initial setup', async ({ page }, workerInfo) => {
const duckPlayer = DuckPlayerNative.create(page, workerInfo);

// Given the duckPlayerNative feature is enabled
await duckPlayer.withRemoteConfig();

// When I go to a YouTube page
await duckPlayer.gotoYouTubePage();

// Then Initial Setup should be called
await duckPlayer.didSendInitialHandshake();

// And an onDuckPlayerScriptsReady event should be called
await duckPlayer.didSendDuckPlayerScriptsReady();
});

test('Responds to onUrlChanged', async ({ page }, workerInfo) => {
const duckPlayer = DuckPlayerNative.create(page, workerInfo);

// Given the duckPlayerNative feature is enabled
await duckPlayer.withRemoteConfig();

// When I go to a YouTube page
await duckPlayer.gotoYouTubePage();

// And the frontend receives an onUrlChanged event
await duckPlayer.sendURLChanged('NOCOOKIE');

// Then an onDuckPlayerScriptsReady event should be fired twice
await duckPlayer.didSendDuckPlayerScriptsReady(2);
});

test('Polls timestamp on YouTube', async ({ page }, workerInfo) => {
const duckPlayer = DuckPlayerNative.create(page, workerInfo);

// Given the duckPlayerNative feature is enabled
await duckPlayer.withRemoteConfig();

// When I go to a YouTube page
await duckPlayer.gotoYouTubePage();

// Then the current timestamp should be polled back to the browser
await duckPlayer.didSendCurrentTimestamp();
});

test('Polls timestamp on NoCookie page', async ({ page }, workerInfo) => {
const duckPlayer = DuckPlayerNative.create(page, workerInfo);

// Given the duckPlayerNative feature is enabled
await duckPlayer.withRemoteConfig();

// When I go to a NoCookie page
await duckPlayer.gotoNoCookiePage();

// Then the current timestamp should be polled back to the browser
await duckPlayer.didSendCurrentTimestamp();
});
});

test.describe('Duck Player Native thumbnail overlay', () => {
test('Shows overlay on YouTube player page', async ({ page }, workerInfo) => {
const duckPlayer = DuckPlayerNative.create(page, workerInfo);

// Given the duckPlayerNative feature is enabled
await duckPlayer.withRemoteConfig();

// When I go to a YouTube page
await duckPlayer.gotoYouTubePage();
await duckPlayer.sendOnMediaControl();

// Then I should see the thumbnail overlay in the page
await duckPlayer.didShowOverlay();
await duckPlayer.didShowLogoInOverlay();
});
test('Dismisses overlay on click', async ({ page }, workerInfo) => {
const duckPlayer = DuckPlayerNative.create(page, workerInfo);

// Given the duckPlayerNative feature is enabled
await duckPlayer.withRemoteConfig();

// When I go to a YouTube page
await duckPlayer.gotoYouTubePage();
await duckPlayer.sendOnMediaControl();

// And I see the thumbnail overlay in the page
await duckPlayer.didShowOverlay();

// And I click on the overlay
await duckPlayer.clickOnOverlay();

// Then the overlay should be dismissed
await duckPlayer.didDismissOverlay();

// And a didDismissOverlay event should be fired
await duckPlayer.didSendOverlayDismissalMessage();
});
});

test.describe('Duck Player Native custom error view', () => {
test('Shows age-restricted error', async ({ page }, workerInfo) => {
const duckPlayer = DuckPlayerNative.create(page, workerInfo);

// Given the duckPlayerNative feature is enabled
await duckPlayer.withRemoteConfig();

// When I go to a YouTube page with an age-restricted error
await duckPlayer.gotoAgeRestrictedErrorPage();

// Then I should see the generic error screen
await duckPlayer.didShowGenericError();
});

test('Shows sign-in error', async ({ page }, workerInfo) => {
const duckPlayer = DuckPlayerNative.create(page, workerInfo);

// Given the duckPlayerNative feature is enabled
await duckPlayer.withRemoteConfig();

// When I go to a YouTube page with an age-restricted error
await duckPlayer.gotoSignInErrorPage();

// Then I should see the generic error screen
await duckPlayer.didShowSignInError();
});
});
Loading
Loading