├── .git-blame-ignore-revs ├── .gitattributes ├── .github ├── dependabot.yml ├── pull_request_template.md ├── scripts │ └── diff-directories.js └── workflows │ ├── asana.yml │ ├── auto-respond-pr.yml │ ├── build-pr.yml │ ├── build.yml │ ├── codeql-analysis.yml │ ├── snapshots-update.yml │ ├── snapshots.yml │ └── tests.yml ├── .gitignore ├── .nvmrc ├── .prettierignore ├── .prettierrc ├── .stylelintrc.json ├── .swift-version ├── CODEOWNERS ├── LICENSE.md ├── Package.swift ├── README.md ├── Sources └── ContentScopeScripts │ ├── ContentScopeScripts.swift │ └── dist │ └── pages │ └── .gitignore ├── build-output.eslint.config.js ├── eslint.config.js ├── injected ├── README.md ├── docs │ ├── favicon.md │ └── message-bridge.md ├── entry-points │ ├── android.js │ ├── apple.js │ ├── extension-mv3.js │ ├── integration.js │ └── windows.js ├── integration-test │ ├── autofill-password-import.spec.js │ ├── breakage-reporting.spec.js │ ├── broker-protection-tests │ │ ├── broker-protection-captcha.spec.js │ │ ├── broker-protection.spec.js │ │ ├── fixtures.js │ │ └── tests-config.js │ ├── cookie.spec.js │ ├── data │ │ └── har │ │ │ ├── duckduckgo.com │ │ │ └── search.har │ │ │ └── example.com │ │ │ └── example.com.har │ ├── duckplayer-mobile-drawer.spec.js │ ├── duckplayer-mobile-drawer.spec.js-snapshots │ │ ├── drawer-android-darwin.png │ │ └── drawer-ios-darwin.png │ ├── duckplayer-mobile.spec.js │ ├── duckplayer-mobile.spec.js-snapshots │ │ ├── overlay-android-darwin.png │ │ └── overlay-ios-darwin.png │ ├── duckplayer-native.spec.js │ ├── duckplayer-remote-config.spec.js │ ├── duckplayer.e2e.spec.js │ ├── duckplayer.setup.e2e.spec.js │ ├── duckplayer.spec.js │ ├── extension │ │ ├── .gitignore │ │ ├── inject.js │ │ └── manifest.json │ ├── favicon.spec.js │ ├── fingerprint.spec.js │ ├── harmful-apis.spec.js │ ├── helpers │ │ └── harness.js │ ├── message-bridge-android.spec.js │ ├── message-bridge-apple.spec.js │ ├── mocks │ │ └── broker-protection │ │ │ ├── captcha.js │ │ │ ├── feature-config.js │ │ │ ├── types.js │ │ │ └── utils.js │ ├── navigator-interface-insecure.js │ ├── navigator-interface.spec.js │ ├── page-objects │ │ ├── broker-protection.js │ │ ├── duckplayer-native.js │ │ ├── duckplayer-overlays.js │ │ └── results-collector.js │ ├── pages.spec.js │ ├── remote-pages.spec.js │ ├── shared.mjs │ ├── state │ │ └── .gitignore │ ├── test-pages │ │ ├── api-manipulation │ │ │ ├── config │ │ │ │ └── apis.json │ │ │ ├── index.html │ │ │ └── pages │ │ │ │ └── apis.html │ │ ├── autofill-password-import │ │ │ ├── config │ │ │ │ └── config.json │ │ │ └── index.html │ │ ├── blank.html │ │ ├── breakage-reporting │ │ │ ├── config │ │ │ │ └── config.json │ │ │ ├── index.html │ │ │ └── pages │ │ │ │ └── ref.html │ │ ├── broker-protection │ │ │ ├── actions │ │ │ │ ├── action-not-found.json │ │ │ │ ├── click-disabled-button-failSilently.json │ │ │ │ ├── click-disabled-button.json │ │ │ │ ├── click-multiple.json │ │ │ │ ├── click-nonexistent-selector-failSilently.json │ │ │ │ ├── click-nonexistent-selector.json │ │ │ │ ├── click-parent.json │ │ │ │ ├── click-weighted.json │ │ │ │ ├── click.json │ │ │ │ ├── conditional-clicks-hard-coded-default.json │ │ │ │ ├── conditional-clicks-hard-coded-null-default.json │ │ │ │ ├── conditional-clicks-hard-coded-success.json │ │ │ │ ├── conditional-clicks-hard-coded-undefined-default.json │ │ │ │ ├── conditional-clicks-interpolated-default.json │ │ │ │ ├── conditional-clicks-interpolated-success.json │ │ │ │ ├── expectation-actions-conditional-subaction.json │ │ │ │ ├── expectation-actions-fail-silently.json │ │ │ │ ├── expectation-actions-fail.json │ │ │ │ ├── expectation-actions-subaction-fail.json │ │ │ │ ├── expectation-actions.json │ │ │ │ ├── expectation.json │ │ │ │ ├── extract-generate-id.json │ │ │ │ ├── extract-irregular1.json │ │ │ │ ├── extract-irregular2.json │ │ │ │ ├── extract-irregular3.json │ │ │ │ ├── extract.json │ │ │ │ ├── extract2.json │ │ │ │ ├── extract3.json │ │ │ │ ├── extract4.json │ │ │ │ ├── extract5.json │ │ │ │ ├── fill-form-optional.json │ │ │ │ ├── fill-form.json │ │ │ │ ├── navigate.json │ │ │ │ ├── results-not-found-invalid.json │ │ │ │ └── results-not-found-valid.json │ │ │ ├── data │ │ │ │ └── init-data.json │ │ │ ├── index.html │ │ │ └── pages │ │ │ │ ├── click-multiple.html │ │ │ │ ├── clicks.html │ │ │ │ ├── cloudflare-captcha.html │ │ │ │ ├── conditional-clicks.html │ │ │ │ ├── empty-form.html │ │ │ │ ├── expectation-actions.html │ │ │ │ ├── form.html │ │ │ │ ├── h-captcha.html │ │ │ │ ├── image-captcha.html │ │ │ │ ├── re-captcha.html │ │ │ │ ├── results-4.html │ │ │ │ ├── results-5.html │ │ │ │ ├── results-alt.html │ │ │ │ ├── results-irregular1.html │ │ │ │ ├── results-irregular2.html │ │ │ │ ├── results-irregular3.html │ │ │ │ ├── results-multiple.html │ │ │ │ ├── results-not-found.html │ │ │ │ ├── results-parent.html │ │ │ │ ├── results-weighted.html │ │ │ │ ├── results.html │ │ │ │ └── retry.html │ │ ├── duckplayer-native │ │ │ ├── config │ │ │ │ └── native.json │ │ │ └── pages │ │ │ │ ├── player.html │ │ │ │ ├── thumbnail-dark.jpg │ │ │ │ └── thumbnail-light.jpg │ │ ├── duckplayer │ │ │ ├── config │ │ │ │ ├── click-interceptions-disabled.json │ │ │ │ ├── disabled.json │ │ │ │ ├── overlays-drawer.json │ │ │ │ ├── overlays-live.json │ │ │ │ ├── overlays.json │ │ │ │ ├── thumbnail-overlays-disabled.json │ │ │ │ ├── video-alt-selectors.json │ │ │ │ └── video-overlays-disabled.json │ │ │ ├── index.html │ │ │ ├── pages │ │ │ │ ├── overlays.html │ │ │ │ ├── player.html │ │ │ │ ├── serp-proxy.html │ │ │ │ ├── thumbnail-dark.jpg │ │ │ │ ├── thumbnail-light.jpg │ │ │ │ └── video-alt-selectors.html │ │ │ └── scripts │ │ │ │ └── test.mjs │ │ ├── favicon │ │ │ ├── config │ │ │ │ ├── favicon-absent.json │ │ │ │ ├── favicon-disabled.json │ │ │ │ ├── favicon-enabled.json │ │ │ │ └── favicon-monitor-disabled.json │ │ │ ├── favicon.png │ │ │ ├── index.html │ │ │ └── new_favicon.png │ │ ├── harmful-apis │ │ │ ├── config │ │ │ │ └── apis.json │ │ │ └── index.html │ │ ├── index.html │ │ ├── infra │ │ │ ├── config │ │ │ │ ├── conditional-matching-experiments.json │ │ │ │ └── conditional-matching.json │ │ │ ├── index.html │ │ │ └── pages │ │ │ │ ├── conditional-matching-experiments.html │ │ │ │ └── conditional-matching.html │ │ ├── message-bridge │ │ │ ├── config │ │ │ │ ├── message-bridge-disabled.json │ │ │ │ └── message-bridge-enabled.json │ │ │ ├── index.html │ │ │ └── pages │ │ │ │ ├── disabled.html │ │ │ │ └── enabled.html │ │ ├── permissions │ │ │ ├── config │ │ │ │ └── permissions.json │ │ │ └── index.html │ │ ├── shared │ │ │ ├── replay.js │ │ │ ├── scripty.js │ │ │ ├── style.css │ │ │ └── utils.js │ │ └── webcompat │ │ │ ├── config │ │ │ ├── message-handlers.json │ │ │ ├── modify-cookies.json │ │ │ ├── modify-localstorage.json │ │ │ └── shims.json │ │ │ ├── index.html │ │ │ └── pages │ │ │ ├── message-handlers.html │ │ │ ├── modify-cookies.html │ │ │ ├── modify-localstorage.html │ │ │ └── shims.html │ ├── type-helpers.mjs │ ├── utils.spec.js │ ├── web-compat-android.spec.js │ ├── web-compat.spec.js │ ├── webcompat.spec.js │ └── windows-permissions.spec.js ├── lib │ └── sjcl.js ├── package.json ├── playwright-e2e.config.js ├── playwright.config.js ├── scripts │ ├── buildLocales.js │ ├── bundleTrackers.mjs │ ├── entry-points.js │ ├── generate-har.js │ ├── generateSJCL.js │ ├── server.mjs │ ├── types.mjs │ └── utils │ │ ├── build.js │ │ └── comment-plugin.js ├── src │ ├── canvas.js │ ├── captured-globals.js │ ├── config-feature.js │ ├── content-feature.js │ ├── content-scope-features.js │ ├── cookie.js │ ├── crypto.js │ ├── dom-utils.js │ ├── features.js │ ├── features │ │ ├── api-manipulation.js │ │ ├── autofill-password-import.js │ │ ├── breakage-reporting.js │ │ ├── breakage-reporting │ │ │ └── utils.js │ │ ├── broker-protection.js │ │ ├── broker-protection │ │ │ ├── actions │ │ │ │ ├── actions.js │ │ │ │ ├── build-url-transforms.js │ │ │ │ ├── build-url.js │ │ │ │ ├── captcha-callback.js │ │ │ │ ├── captcha-deprecated.js │ │ │ │ ├── click.js │ │ │ │ ├── expectation.js │ │ │ │ ├── extract.js │ │ │ │ ├── fill-form.js │ │ │ │ ├── generators.js │ │ │ │ └── navigate.js │ │ │ ├── broker-protection.md │ │ │ ├── captcha-services │ │ │ │ ├── captcha.service.js │ │ │ │ ├── factory.js │ │ │ │ ├── get-captcha-container.js │ │ │ │ ├── get-captcha-provider.js │ │ │ │ ├── providers │ │ │ │ │ ├── cloudflare-turnstile.js │ │ │ │ │ ├── hcaptcha.js │ │ │ │ │ ├── image.js │ │ │ │ │ ├── provider.interface.js │ │ │ │ │ ├── recaptcha.js │ │ │ │ │ └── registry.js │ │ │ │ └── utils │ │ │ │ │ ├── attribute.js │ │ │ │ │ ├── element.js │ │ │ │ │ ├── image.js │ │ │ │ │ ├── sitekey.js │ │ │ │ │ ├── stringify-function.js │ │ │ │ │ └── token.js │ │ │ ├── comparisons │ │ │ │ ├── address.js │ │ │ │ ├── constants.js │ │ │ │ ├── is-same-age.js │ │ │ │ └── is-same-name.js │ │ │ ├── execute.js │ │ │ ├── extractors │ │ │ │ ├── address.js │ │ │ │ ├── age.js │ │ │ │ ├── name.js │ │ │ │ ├── phone.js │ │ │ │ ├── profile-url.js │ │ │ │ └── relatives.js │ │ │ ├── types.js │ │ │ └── utils │ │ │ │ ├── safe-call.js │ │ │ │ ├── url.js │ │ │ │ └── utils.js │ │ ├── click-to-load.js │ │ ├── click-to-load │ │ │ ├── assets │ │ │ │ ├── ctl-login-button.css │ │ │ │ ├── ctl-placeholder-block.css │ │ │ │ └── shared.css │ │ │ ├── components │ │ │ │ ├── ctl-login-button.js │ │ │ │ ├── ctl-placeholder-blocked.js │ │ │ │ └── index.js │ │ │ ├── ctl-assets.js │ │ │ └── ctl-config.js │ │ ├── cookie.js │ │ ├── duck-player-native.js │ │ ├── duck-player.js │ │ ├── duckplayer-native │ │ │ ├── constants.js │ │ │ ├── custom-error │ │ │ │ ├── custom-error.css │ │ │ │ └── custom-error.js │ │ │ ├── error-detection.js │ │ │ ├── get-current-timestamp.js │ │ │ ├── messages.js │ │ │ ├── mute-audio.js │ │ │ ├── overlays │ │ │ │ ├── thumbnail-overlay.css │ │ │ │ └── thumbnail-overlay.js │ │ │ ├── pause-video.js │ │ │ ├── sub-feature.js │ │ │ └── sub-features │ │ │ │ ├── duck-player-native-no-cookie.js │ │ │ │ ├── duck-player-native-serp.js │ │ │ │ └── duck-player-native-youtube.js │ │ ├── duckplayer │ │ │ ├── assets │ │ │ │ ├── dax.svg │ │ │ │ ├── eyeball.svg │ │ │ │ ├── info-solid.svg │ │ │ │ ├── info.svg │ │ │ │ ├── mobile-video-drawer.css │ │ │ │ ├── mobile-video-overlay.css │ │ │ │ ├── mobile-video-thumbnail-overlay.css │ │ │ │ ├── styles.css │ │ │ │ └── video-overlay.css │ │ │ ├── components │ │ │ │ ├── ddg-video-drawer-mobile.js │ │ │ │ ├── ddg-video-overlay-mobile.js │ │ │ │ ├── ddg-video-overlay.js │ │ │ │ ├── ddg-video-thumbnail-overlay-mobile.js │ │ │ │ └── index.js │ │ │ ├── constants.js │ │ │ ├── environment.js │ │ │ ├── icon-overlay.js │ │ │ ├── overlay-messages.js │ │ │ ├── overlays.js │ │ │ ├── text.js │ │ │ ├── thumbnails.js │ │ │ ├── thumbnails.md │ │ │ ├── util.js │ │ │ └── video-overlay.js │ │ ├── element-hiding.js │ │ ├── exception-handler.js │ │ ├── favicon.js │ │ ├── fingerprinting-audio.js │ │ ├── fingerprinting-battery.js │ │ ├── fingerprinting-canvas.js │ │ ├── fingerprinting-hardware.js │ │ ├── fingerprinting-screen-size.js │ │ ├── fingerprinting-temporary-storage.js │ │ ├── google-rejected.js │ │ ├── gpc.js │ │ ├── harmful-apis.js │ │ ├── message-bridge.js │ │ ├── message-bridge │ │ │ ├── create-page-world-bridge.js │ │ │ └── schema.js │ │ ├── navigator-interface.js │ │ ├── performance-metrics.js │ │ ├── referrer.js │ │ ├── web-compat.js │ │ └── windows-permission-usage.js │ ├── globals.d.ts │ ├── locales │ │ ├── click-to-load │ │ │ ├── bg │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── cs │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── da │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── de │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── el │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── en │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── es │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── et │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── fi │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── fr │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── hr │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── hu │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── it │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── lt │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── lv │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── nb │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── nl │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── pl │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── pt │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── ro │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── ru │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── sk │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── sl │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ ├── sv │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ │ └── tr │ │ │ │ ├── facebook.json │ │ │ │ ├── shared.json │ │ │ │ └── youtube.json │ │ └── duckplayer │ │ │ ├── bg │ │ │ └── overlays.json │ │ │ ├── cs │ │ │ └── overlays.json │ │ │ ├── da │ │ │ └── overlays.json │ │ │ ├── de │ │ │ └── overlays.json │ │ │ ├── el │ │ │ └── overlays.json │ │ │ ├── en │ │ │ ├── native.json │ │ │ └── overlays.json │ │ │ ├── es │ │ │ └── overlays.json │ │ │ ├── et │ │ │ └── overlays.json │ │ │ ├── fi │ │ │ └── overlays.json │ │ │ ├── fr │ │ │ └── overlays.json │ │ │ ├── hr │ │ │ └── overlays.json │ │ │ ├── hu │ │ │ └── overlays.json │ │ │ ├── it │ │ │ └── overlays.json │ │ │ ├── lt │ │ │ └── overlays.json │ │ │ ├── lv │ │ │ └── overlays.json │ │ │ ├── nb │ │ │ └── overlays.json │ │ │ ├── nl │ │ │ └── overlays.json │ │ │ ├── pl │ │ │ └── overlays.json │ │ │ ├── pt │ │ │ └── overlays.json │ │ │ ├── ro │ │ │ └── overlays.json │ │ │ ├── ru │ │ │ └── overlays.json │ │ │ ├── sk │ │ │ └── overlays.json │ │ │ ├── sl │ │ │ └── overlays.json │ │ │ ├── sv │ │ │ └── overlays.json │ │ │ └── tr │ │ │ └── overlays.json │ ├── messages │ │ ├── favicon │ │ │ └── faviconFound.notify.json │ │ └── web-compat │ │ │ └── webShare.request.json │ ├── performance.js │ ├── sendmessage-transport.js │ ├── timer-utils.js │ ├── trackers.js │ ├── type-utils.js │ ├── types │ │ ├── favicon.ts │ │ └── web-compat.ts │ ├── url-change.js │ ├── utils.js │ └── wrapper-utils.js └── unit-test │ ├── broker-protection-extract.js │ ├── broker-protection-extractors.js │ ├── broker-protection.js │ ├── canvas.js │ ├── comment-plugin.js │ ├── config.json │ ├── content-feature.js │ ├── cookie.js │ ├── dom-utils.js │ ├── features.js │ ├── fixtures │ └── feature-includes.js │ ├── helpers │ └── polyfill-process-globals.js │ ├── messaging.js │ ├── timer-utils.js │ ├── utils.js │ ├── verify-artifacts.js │ └── wrapper-utils.js ├── messaging ├── index.js ├── lib │ ├── android.js │ ├── examples │ │ ├── android.example.js │ │ ├── payloads.js │ │ ├── test.example.js │ │ ├── webkit.example.js │ │ └── windows.example.js │ ├── messaging.types.d.ts │ ├── shared-types.ts │ ├── test-utils.mjs │ ├── typed-messages.js │ ├── webkit.js │ └── windows.js ├── native.js ├── package.json └── schema.js ├── netlify.toml ├── package-lock.json ├── package.json ├── scripts ├── changelog.sh ├── check-for-changes.sh └── script-utils.js ├── special-pages ├── .gitignore ├── README.md ├── index.mjs ├── opts.mjs ├── package.json ├── pages │ ├── duckplayer │ │ ├── .gitignore │ │ ├── app │ │ │ ├── base.css │ │ │ ├── components │ │ │ │ ├── Button.jsx │ │ │ │ ├── Button.module.css │ │ │ │ ├── Components.jsx │ │ │ │ ├── Components.module.css │ │ │ │ ├── DesktopApp.jsx │ │ │ │ ├── DesktopApp.module.css │ │ │ │ ├── FloatingBar.jsx │ │ │ │ ├── FloatingBar.module.css │ │ │ │ ├── FocusMode.jsx │ │ │ │ ├── FocusMode.module.css │ │ │ │ ├── InfoBar.jsx │ │ │ │ ├── InfoBar.module.css │ │ │ │ ├── MobileApp.jsx │ │ │ │ ├── MobileApp.module.css │ │ │ │ ├── MobileButtons.jsx │ │ │ │ ├── MobileButtons.module.css │ │ │ │ ├── Player.jsx │ │ │ │ ├── Player.module.css │ │ │ │ ├── PlayerContainer.jsx │ │ │ │ ├── PlayerContainer.module.css │ │ │ │ ├── Switch.jsx │ │ │ │ ├── Switch.module.css │ │ │ │ ├── SwitchBarDesktop.jsx │ │ │ │ ├── SwitchBarDesktop.module.css │ │ │ │ ├── SwitchBarMobile.jsx │ │ │ │ ├── SwitchBarMobile.module.css │ │ │ │ ├── Tooltip.jsx │ │ │ │ ├── Tooltip.module.css │ │ │ │ ├── Wordmark-mobile.module.css │ │ │ │ ├── Wordmark.jsx │ │ │ │ ├── Wordmark.module.css │ │ │ │ ├── YouTubeError.jsx │ │ │ │ └── YouTubeError.module.css │ │ │ ├── embed-settings.js │ │ │ ├── features │ │ │ │ ├── app.js │ │ │ │ ├── autofocus.js │ │ │ │ ├── click-capture.js │ │ │ │ ├── error-detection.js │ │ │ │ ├── iframe.js │ │ │ │ ├── mouse-capture.js │ │ │ │ ├── pip.js │ │ │ │ └── title-capture.js │ │ │ ├── img │ │ │ │ ├── cog.data.svg │ │ │ │ ├── dax.data.svg │ │ │ │ ├── info.data.svg │ │ │ │ ├── mobile-bg.jpg │ │ │ │ ├── player-bg.jpg │ │ │ │ ├── warning-128.data.svg │ │ │ │ └── warning-96.data.svg │ │ │ ├── index.css │ │ │ ├── index.js │ │ │ ├── providers │ │ │ │ ├── OrientationProvider.jsx │ │ │ │ ├── SettingsProvider.jsx │ │ │ │ ├── SwitchProvider.jsx │ │ │ │ ├── UserValuesProvider.jsx │ │ │ │ └── YouTubeErrorProvider.jsx │ │ │ ├── settings.js │ │ │ └── types.js │ │ ├── integration-tests │ │ │ ├── duck-player.js │ │ │ ├── duckplayer-screenshots.spec.js │ │ │ ├── duckplayer-screenshots.spec.js-snapshots │ │ │ │ ├── enabled-layout-android-darwin.png │ │ │ │ ├── enabled-layout-android-landscape-darwin.png │ │ │ │ ├── enabled-layout-ios-darwin.png │ │ │ │ ├── enabled-layout-macos-darwin.png │ │ │ │ ├── enabled-layout-windows-darwin.png │ │ │ │ ├── error-layout-android-darwin.png │ │ │ │ ├── error-layout-android-landscape-darwin.png │ │ │ │ ├── error-layout-ios-darwin.png │ │ │ │ ├── error-layout-macos-darwin.png │ │ │ │ ├── error-layout-windows-darwin.png │ │ │ │ ├── regular-layout-android-darwin.png │ │ │ │ ├── regular-layout-android-landscape-darwin.png │ │ │ │ ├── regular-layout-ios-darwin.png │ │ │ │ ├── regular-layout-macos-darwin.png │ │ │ │ ├── regular-layout-windows-darwin.png │ │ │ │ ├── tooltip-macos-darwin.png │ │ │ │ ├── tooltip-windows-darwin.png │ │ │ │ ├── youtube-error-sign-in-required-android-darwin.png │ │ │ │ ├── youtube-error-sign-in-required-android-landscape-darwin.png │ │ │ │ ├── youtube-error-sign-in-required-ios-darwin.png │ │ │ │ ├── youtube-error-sign-in-required-macos-darwin.png │ │ │ │ ├── youtube-error-sign-in-required-windows-darwin.png │ │ │ │ ├── youtube-error-unknown-android-darwin.png │ │ │ │ ├── youtube-error-unknown-android-landscape-darwin.png │ │ │ │ ├── youtube-error-unknown-ios-darwin.png │ │ │ │ ├── youtube-error-unknown-macos-darwin.png │ │ │ │ └── youtube-error-unknown-windows-darwin.png │ │ │ ├── duckplayer-telemetry.spec.js │ │ │ └── duckplayer.spec.js │ │ ├── messages │ │ │ ├── customErrorSettings.shared.json │ │ │ ├── getUserValues.request.json │ │ │ ├── getUserValues.response.json │ │ │ ├── initialSetup.request.json │ │ │ ├── initialSetup.response.json │ │ │ ├── onUserValuesChanged.subscribe.json │ │ │ ├── openInfo.notify.json │ │ │ ├── openSettings.notify.json │ │ │ ├── reportInitException.notify.json │ │ │ ├── reportPageException.notify.json │ │ │ ├── reportYouTubeError.notify.json │ │ │ ├── setUserValues.request.json │ │ │ ├── setUserValues.response.json │ │ │ ├── telemetryEvent.notify.json │ │ │ ├── userValues.shared.json │ │ │ └── youtubeError.shared.json │ │ ├── public │ │ │ ├── index.html │ │ │ └── locales │ │ │ │ ├── bg │ │ │ │ └── duckplayer.json │ │ │ │ ├── cs │ │ │ │ └── duckplayer.json │ │ │ │ ├── da │ │ │ │ └── duckplayer.json │ │ │ │ ├── de │ │ │ │ └── duckplayer.json │ │ │ │ ├── el │ │ │ │ └── duckplayer.json │ │ │ │ ├── en │ │ │ │ └── duckplayer.json │ │ │ │ ├── es │ │ │ │ └── duckplayer.json │ │ │ │ ├── et │ │ │ │ └── duckplayer.json │ │ │ │ ├── fi │ │ │ │ └── duckplayer.json │ │ │ │ ├── fr │ │ │ │ └── duckplayer.json │ │ │ │ ├── hr │ │ │ │ └── duckplayer.json │ │ │ │ ├── hu │ │ │ │ └── duckplayer.json │ │ │ │ ├── it │ │ │ │ └── duckplayer.json │ │ │ │ ├── lt │ │ │ │ └── duckplayer.json │ │ │ │ ├── lv │ │ │ │ └── duckplayer.json │ │ │ │ ├── nb │ │ │ │ └── duckplayer.json │ │ │ │ ├── nl │ │ │ │ └── duckplayer.json │ │ │ │ ├── pl │ │ │ │ └── duckplayer.json │ │ │ │ ├── pt │ │ │ │ └── duckplayer.json │ │ │ │ ├── ro │ │ │ │ └── duckplayer.json │ │ │ │ ├── ru │ │ │ │ └── duckplayer.json │ │ │ │ ├── sk │ │ │ │ └── duckplayer.json │ │ │ │ ├── sl │ │ │ │ └── duckplayer.json │ │ │ │ ├── sv │ │ │ │ └── duckplayer.json │ │ │ │ └── tr │ │ │ │ └── duckplayer.json │ │ ├── readme.md │ │ ├── src │ │ │ ├── index.js │ │ │ ├── inline.js │ │ │ ├── storage.js │ │ │ └── utils.js │ │ ├── types │ │ │ └── duckplayer.ts │ │ └── unit-tests │ │ │ ├── embed-settings.mjs │ │ │ └── settings.mjs │ ├── errorpage │ │ ├── .gitignore │ │ ├── public │ │ │ ├── img │ │ │ │ └── logo-horizontal.svg │ │ │ ├── index.html │ │ │ └── style.css │ │ └── readme.md │ ├── example │ │ ├── app │ │ │ ├── components │ │ │ │ ├── App.jsx │ │ │ │ ├── App.module.css │ │ │ │ ├── Components.jsx │ │ │ │ └── Components.module.css │ │ │ ├── index.js │ │ │ └── types.js │ │ ├── messages │ │ │ ├── initialSetup.request.json │ │ │ ├── initialSetup.response.json │ │ │ ├── reportInitException.notify.json │ │ │ └── reportPageException.notify.json │ │ ├── public │ │ │ ├── index.html │ │ │ └── locales │ │ │ │ └── en │ │ │ │ └── example.json │ │ ├── readme.md │ │ ├── src │ │ │ ├── index.js │ │ │ └── inline.js │ │ └── types │ │ │ └── example.ts │ ├── history │ │ ├── app │ │ │ ├── Settings.js │ │ │ ├── components │ │ │ │ ├── App.jsx │ │ │ │ ├── App.module.css │ │ │ │ ├── Components.jsx │ │ │ │ ├── Components.module.css │ │ │ │ ├── Empty.js │ │ │ │ ├── Header.js │ │ │ │ ├── Header.module.css │ │ │ │ ├── Item.js │ │ │ │ ├── Item.module.css │ │ │ │ ├── Results.js │ │ │ │ ├── SearchForm.js │ │ │ │ ├── Sidebar.js │ │ │ │ ├── Sidebar.module.css │ │ │ │ ├── VirtualizedList.js │ │ │ │ └── VirtualizedList.module.css │ │ │ ├── constants.js │ │ │ ├── global │ │ │ │ ├── Providers │ │ │ │ │ ├── HistoryServiceProvider.js │ │ │ │ │ ├── QueryProvider.js │ │ │ │ │ └── SelectionProvider.js │ │ │ │ └── hooks │ │ │ │ │ ├── useAuxClickHandler.js │ │ │ │ │ ├── useButtonClickHandler.js │ │ │ │ │ ├── useClickAnywhereElse.jsx │ │ │ │ │ ├── useContextMenuForEntries.js │ │ │ │ │ ├── useLayoutMode.js │ │ │ │ │ ├── useLinkClickHandler.js │ │ │ │ │ ├── useResetSelectionsOnQueryChange.js │ │ │ │ │ ├── useSearchCommit.js │ │ │ │ │ ├── useSearchCommitForRange.js │ │ │ │ │ ├── useSelectionState.js │ │ │ │ │ └── useURLReflection.js │ │ │ ├── history.md │ │ │ ├── history.range.service.js │ │ │ ├── history.service.js │ │ │ ├── icons │ │ │ │ ├── Cross.js │ │ │ │ ├── Fire.js │ │ │ │ ├── Search.js │ │ │ │ ├── Trash.js │ │ │ │ └── dots.js │ │ │ ├── index.js │ │ │ ├── mocks │ │ │ │ ├── history.mocks.js │ │ │ │ └── mock-transport.js │ │ │ ├── strings.json │ │ │ ├── types.js │ │ │ └── utils.js │ │ ├── integration-tests │ │ │ ├── history-selections.spec.js │ │ │ ├── history.page.js │ │ │ ├── history.screenshots.spec.js │ │ │ ├── history.screenshots.spec.js-snapshots │ │ │ │ ├── full-empty-dark-integration-darwin.png │ │ │ │ ├── full-empty-light-integration-darwin.png │ │ │ │ ├── full-short-dark-integration-darwin.png │ │ │ │ ├── full-short-light-integration-darwin.png │ │ │ │ ├── header-delete-dark-integration-darwin.png │ │ │ │ ├── header-delete-light-integration-darwin.png │ │ │ │ ├── header-idle-dark-integration-darwin.png │ │ │ │ ├── header-idle-light-integration-darwin.png │ │ │ │ ├── header-search-dark-integration-darwin.png │ │ │ │ ├── header-search-light-integration-darwin.png │ │ │ │ ├── main-hover-dark-integration-darwin.png │ │ │ │ ├── main-hover-light-integration-darwin.png │ │ │ │ ├── main-select-dark-integration-darwin.png │ │ │ │ ├── main-select-hover-dark-integration-darwin.png │ │ │ │ ├── main-select-hover-light-integration-darwin.png │ │ │ │ ├── main-select-light-integration-darwin.png │ │ │ │ ├── sidebar-dark-integration-darwin.png │ │ │ │ ├── sidebar-delete-dark-integration-darwin.png │ │ │ │ ├── sidebar-delete-light-integration-darwin.png │ │ │ │ └── sidebar-light-integration-darwin.png │ │ │ └── history.spec.js │ │ ├── messages │ │ │ ├── deleteDomain.request.json │ │ │ ├── deleteDomain.response.json │ │ │ ├── deleteRange.request.json │ │ │ ├── deleteRange.response.json │ │ │ ├── deleteTerm.request.json │ │ │ ├── deleteTerm.response.json │ │ │ ├── entries_delete.request.json │ │ │ ├── entries_delete.response.json │ │ │ ├── entries_menu.request.json │ │ │ ├── entries_menu.response.json │ │ │ ├── getRanges.request.json │ │ │ ├── getRanges.response.json │ │ │ ├── initialSetup.request.json │ │ │ ├── initialSetup.response.json │ │ │ ├── open.notify.json │ │ │ ├── query.request.json │ │ │ ├── query.response.json │ │ │ ├── reportInitException.notify.json │ │ │ ├── reportPageException.notify.json │ │ │ └── types │ │ │ │ ├── action-response.json │ │ │ │ ├── default-styles.json │ │ │ │ ├── favicon.json │ │ │ │ ├── history-item.json │ │ │ │ ├── open-target.json │ │ │ │ ├── query.json │ │ │ │ └── range.json │ │ ├── public │ │ │ ├── company-icons │ │ │ │ ├── fake.svg │ │ │ │ ├── other-dark.svg │ │ │ │ └── other.svg │ │ │ ├── icons │ │ │ │ ├── all.svg │ │ │ │ ├── backdrop.svg │ │ │ │ ├── clear-dark.svg │ │ │ │ ├── clear.svg │ │ │ │ ├── clock.svg │ │ │ │ ├── closed.svg │ │ │ │ ├── day.svg │ │ │ │ ├── older.svg │ │ │ │ ├── today.svg │ │ │ │ └── yesterday.svg │ │ │ ├── index.html │ │ │ └── locales │ │ │ │ ├── de │ │ │ │ └── history.json │ │ │ │ ├── en │ │ │ │ └── history.json │ │ │ │ ├── es │ │ │ │ └── history.json │ │ │ │ ├── fr │ │ │ │ └── history.json │ │ │ │ ├── it │ │ │ │ └── history.json │ │ │ │ ├── nl │ │ │ │ └── history.json │ │ │ │ ├── pl │ │ │ │ └── history.json │ │ │ │ ├── pt │ │ │ │ └── history.json │ │ │ │ └── ru │ │ │ │ └── history.json │ │ ├── readme.md │ │ ├── src │ │ │ ├── index.js │ │ │ └── inline.js │ │ ├── styles │ │ │ ├── base.css │ │ │ └── history-theme.css │ │ ├── types │ │ │ └── history.ts │ │ └── unit-tests │ │ │ └── useSelectionState.spec.js │ ├── new-tab │ │ ├── app │ │ │ ├── InlineErrorBoundary.js │ │ │ ├── activity │ │ │ │ ├── ActivityProvider.js │ │ │ │ ├── NormalizeDataProvider.js │ │ │ │ ├── activity.md │ │ │ │ ├── batched-activity.service.js │ │ │ │ ├── components │ │ │ │ │ ├── Activity.examples.js │ │ │ │ │ ├── Activity.js │ │ │ │ │ ├── Activity.module.css │ │ │ │ │ ├── ActivityItem.js │ │ │ │ │ ├── ActivityItemAnimationWrapper.js │ │ │ │ │ └── HistoryItems.js │ │ │ │ ├── constants.js │ │ │ │ ├── integration-tests │ │ │ │ │ ├── activity.page.js │ │ │ │ │ ├── activity.spec.js │ │ │ │ │ └── batching.page.js │ │ │ │ ├── mocks │ │ │ │ │ ├── activity.mock-transport.js │ │ │ │ │ └── activity.mocks.js │ │ │ │ └── strings.json │ │ │ ├── burning │ │ │ │ ├── ActivityInteractionsContext.js │ │ │ │ ├── BurnAnimationLottieWeb.js │ │ │ │ └── BurnProvider.js │ │ │ ├── components │ │ │ │ ├── App.js │ │ │ │ ├── App.module.css │ │ │ │ ├── BackgroundProvider.js │ │ │ │ ├── BackgroundReceiver.module.css │ │ │ │ ├── CompanyIcon.js │ │ │ │ ├── CompanyIcon.module.css │ │ │ │ ├── Components.jsx │ │ │ │ ├── Components.module.css │ │ │ │ ├── DismissButton.jsx │ │ │ │ ├── DismissButton.module.css │ │ │ │ ├── Drawer.js │ │ │ │ ├── Examples.js │ │ │ │ ├── Examples.jsx │ │ │ │ ├── Icons.js │ │ │ │ ├── Icons.module.css │ │ │ │ ├── Layout.js │ │ │ │ ├── ShowHide.module.css │ │ │ │ ├── ShowHideButton.jsx │ │ │ │ └── icons │ │ │ │ │ ├── Fire.js │ │ │ │ │ ├── Open.js │ │ │ │ │ └── Star.js │ │ │ ├── customizer │ │ │ │ ├── CustomizerProvider.js │ │ │ │ ├── components │ │ │ │ │ ├── BackgroundSection.js │ │ │ │ │ ├── BrowserThemeSection.js │ │ │ │ │ ├── BrowserThemeSection.module.css │ │ │ │ │ ├── ColorSelection.js │ │ │ │ │ ├── Customizer.examples.js │ │ │ │ │ ├── Customizer.module.css │ │ │ │ │ ├── CustomizerDrawer.js │ │ │ │ │ ├── CustomizerDrawer.module.css │ │ │ │ │ ├── CustomizerDrawerInner.js │ │ │ │ │ ├── CustomizerDrawerInner.module.css │ │ │ │ │ ├── CustomizerMenu.js │ │ │ │ │ ├── CustomizerSection.js │ │ │ │ │ ├── GradientSelection.js │ │ │ │ │ ├── ImageSelection.js │ │ │ │ │ ├── SettingsLink.js │ │ │ │ │ ├── VisibilityMenu.js │ │ │ │ │ ├── VisibilityMenu.module.css │ │ │ │ │ └── VisibilityMenuSection.js │ │ │ │ ├── customizer.md │ │ │ │ ├── customizer.service.js │ │ │ │ ├── integration-tests │ │ │ │ │ ├── customizer.page.js │ │ │ │ │ └── customizer.spec.js │ │ │ │ ├── mocks.js │ │ │ │ ├── strings.json │ │ │ │ ├── themes.js │ │ │ │ ├── utils.js │ │ │ │ └── values.js │ │ │ ├── dropzone.js │ │ │ ├── entry-points │ │ │ │ ├── activity.js │ │ │ │ ├── favorites.js │ │ │ │ ├── freemiumPIRBanner.js │ │ │ │ ├── nextSteps.js │ │ │ │ ├── privacyStats.js │ │ │ │ ├── protections.js │ │ │ │ ├── rmf.js │ │ │ │ └── updateNotification.js │ │ │ ├── favorites │ │ │ │ ├── components │ │ │ │ │ ├── Favorites.examples.js │ │ │ │ │ ├── Favorites.js │ │ │ │ │ ├── Favorites.module.css │ │ │ │ │ ├── FavoritesCustomized.js │ │ │ │ │ ├── FavoritesProvider.js │ │ │ │ │ ├── PragmaticDND.js │ │ │ │ │ ├── Tile.js │ │ │ │ │ ├── Tile.module.css │ │ │ │ │ └── TileRow.js │ │ │ │ ├── constants.js │ │ │ │ ├── favorites.md │ │ │ │ ├── favorites.service.js │ │ │ │ ├── integration-tests │ │ │ │ │ ├── favorites.page.js │ │ │ │ │ └── favorites.spec.js │ │ │ │ ├── mocks │ │ │ │ │ ├── MockFavoritesProvider.js │ │ │ │ │ └── favorites.data.js │ │ │ │ └── strings.json │ │ │ ├── freemium-pir-banner │ │ │ │ ├── FreemiumPIRBannerProvider.js │ │ │ │ ├── components │ │ │ │ │ ├── FreemiumPIRBanner.examples.js │ │ │ │ │ ├── FreemiumPIRBanner.js │ │ │ │ │ └── FreemiumPIRBanner.module.css │ │ │ │ ├── freemium-pir-banner.md │ │ │ │ ├── freemiumPIRBanner.service.js │ │ │ │ ├── freemiumPIRBanner.utils.js │ │ │ │ ├── integration-tests │ │ │ │ │ └── freemium-pir-banner.spec.js │ │ │ │ ├── mocks │ │ │ │ │ └── freemiumPIRBanner.data.js │ │ │ │ └── unit-tests │ │ │ │ │ └── utils.spec.mjs │ │ │ ├── index.js │ │ │ ├── mock-transport.js │ │ │ ├── new-tab.md │ │ │ ├── next-steps │ │ │ │ ├── NextSteps.js │ │ │ │ ├── NextStepsProvider.js │ │ │ │ ├── components │ │ │ │ │ ├── NextSteps.examples.js │ │ │ │ │ ├── NextSteps.module.css │ │ │ │ │ ├── NextStepsCard.js │ │ │ │ │ └── NextStepsGroup.js │ │ │ │ ├── integrations-tests │ │ │ │ │ └── next-steps.spec.js │ │ │ │ ├── next-steps.md │ │ │ │ ├── next-steps.service.js │ │ │ │ ├── nextsteps.data.js │ │ │ │ └── strings.json │ │ │ ├── privacy-stats │ │ │ │ ├── components │ │ │ │ │ ├── BodyExpansionProvider.js │ │ │ │ │ ├── PrivacyStats.examples.js │ │ │ │ │ ├── PrivacyStats.js │ │ │ │ │ ├── PrivacyStats.module.css │ │ │ │ │ ├── PrivacyStatsConsumer.js │ │ │ │ │ └── PrivacyStatsProvider.js │ │ │ │ ├── constants.js │ │ │ │ ├── integration-tests │ │ │ │ │ ├── privacy-stats.page.js │ │ │ │ │ └── privacy-stats.spec.js │ │ │ │ ├── mocks │ │ │ │ │ ├── PrivacyStatsMockProvider.js │ │ │ │ │ └── privacy-stats.mocks.js │ │ │ │ ├── privacy-stats.md │ │ │ │ ├── privacy-stats.service.js │ │ │ │ ├── privacy-stats.utils.js │ │ │ │ ├── strings.json │ │ │ │ └── unit-tests │ │ │ │ │ └── stats-ordering.js │ │ │ ├── protections │ │ │ │ ├── components │ │ │ │ │ ├── Protections.js │ │ │ │ │ ├── Protections.module.css │ │ │ │ │ ├── ProtectionsConsumer.js │ │ │ │ │ ├── ProtectionsCustomized.js │ │ │ │ │ ├── ProtectionsHeading.examples.js │ │ │ │ │ ├── ProtectionsHeading.js │ │ │ │ │ └── ProtectionsProvider.js │ │ │ │ ├── integrations-tests │ │ │ │ │ ├── protections.page.js │ │ │ │ │ ├── protections.screenshots.spec.js │ │ │ │ │ ├── protections.screenshots.spec.js-snapshots │ │ │ │ │ │ ├── protections-activity-integration-darwin.png │ │ │ │ │ │ ├── protections-stats-dark-integration-darwin.png │ │ │ │ │ │ ├── protections-stats-empty-integration-darwin.png │ │ │ │ │ │ └── protections-stats-integration-darwin.png │ │ │ │ │ └── protections.spec.js │ │ │ │ ├── mocks │ │ │ │ │ ├── protections.mock-transport.js │ │ │ │ │ └── protections.mocks.js │ │ │ │ ├── protections.md │ │ │ │ ├── protections.service.js │ │ │ │ └── strings.json │ │ │ ├── remote-messaging-framework │ │ │ │ ├── RMFProvider.js │ │ │ │ ├── components │ │ │ │ │ ├── RMF.examples.js │ │ │ │ │ ├── RemoteMessagingFramework.js │ │ │ │ │ └── RemoteMessagingFramework.module.css │ │ │ │ ├── integration-tests │ │ │ │ │ └── rmf.spec.js │ │ │ │ ├── mocks │ │ │ │ │ └── rmf.data.js │ │ │ │ ├── rmf.md │ │ │ │ └── rmf.service.js │ │ │ ├── service.hooks.js │ │ │ ├── service.js │ │ │ ├── settings.js │ │ │ ├── settings.provider.js │ │ │ ├── strings.json │ │ │ ├── styles │ │ │ │ ├── base.css │ │ │ │ └── ntp-theme.css │ │ │ ├── telemetry │ │ │ │ ├── Debug.js │ │ │ │ └── telemetry.js │ │ │ ├── types.js │ │ │ ├── update-notification │ │ │ │ ├── UpdateNotificationProvider.js │ │ │ │ ├── components │ │ │ │ │ ├── UpdateNotification.examples.js │ │ │ │ │ ├── UpdateNotification.js │ │ │ │ │ └── UpdateNotification.module.css │ │ │ │ ├── integration-tests │ │ │ │ │ └── update-notification.spec.js │ │ │ │ ├── mocks │ │ │ │ │ └── update-notification.data.js │ │ │ │ ├── strings.json │ │ │ │ ├── update-notification.md │ │ │ │ └── update-notification.service.js │ │ │ ├── utils.js │ │ │ └── widget-list │ │ │ │ ├── WidgetList.js │ │ │ │ ├── widget-config.md │ │ │ │ ├── widget-config.provider.js │ │ │ │ └── widget-config.service.js │ │ ├── integration-tests │ │ │ ├── new-tab.page.js │ │ │ ├── new-tab.screenshots.spec.js │ │ │ ├── new-tab.screenshots.spec.js-snapshots │ │ │ │ ├── narrow-default-integration-darwin.png │ │ │ │ ├── narrow-empty-integration-darwin.png │ │ │ │ ├── stats-few-dark-integration-darwin.png │ │ │ │ ├── stats-few-integration-darwin.png │ │ │ │ ├── wide-default-drawer-integration-darwin.png │ │ │ │ ├── wide-default-integration-darwin.png │ │ │ │ └── wide-empty-integration-darwin.png │ │ │ └── new-tab.spec.js │ │ ├── messages │ │ │ ├── activity_addFavorite.notify.json │ │ │ ├── activity_confirmBurn.request.json │ │ │ ├── activity_confirmBurn.response.json │ │ │ ├── activity_getData.request.json │ │ │ ├── activity_getData.response.json │ │ │ ├── activity_getDataForUrls.request.json │ │ │ ├── activity_getDataForUrls.response.json │ │ │ ├── activity_getUrls.request.json │ │ │ ├── activity_getUrls.response.json │ │ │ ├── activity_onBurnComplete.subscribe.json │ │ │ ├── activity_onDataPatch.subscribe.json │ │ │ ├── activity_onDataUpdate.subscribe.json │ │ │ ├── activity_open.notify.json │ │ │ ├── activity_removeFavorite.notify.json │ │ │ ├── activity_removeItem.notify.json │ │ │ ├── contextMenu.notify.json │ │ │ ├── customizer_autoOpen.subscribe.json │ │ │ ├── customizer_contextMenu.notify.json │ │ │ ├── customizer_deleteImage.notify.json │ │ │ ├── customizer_onBackgroundUpdate.subscribe.json │ │ │ ├── customizer_onColorUpdate.subscribe.json │ │ │ ├── customizer_onImagesUpdate.subscribe.json │ │ │ ├── customizer_onThemeUpdate.subscribe.json │ │ │ ├── customizer_setBackground.notify.json │ │ │ ├── customizer_setTheme.notify.json │ │ │ ├── customizer_upload.notify.json │ │ │ ├── examples │ │ │ │ ├── freemiumPIRBanner.js │ │ │ │ ├── rmf.js │ │ │ │ ├── stats.js │ │ │ │ └── widgets.js │ │ │ ├── favorites_add.notify.json │ │ │ ├── favorites_getConfig.request.json │ │ │ ├── favorites_getConfig.response.json │ │ │ ├── favorites_getData.request.json │ │ │ ├── favorites_getData.response.json │ │ │ ├── favorites_move.notify.json │ │ │ ├── favorites_onConfigUpdate.subscribe.json │ │ │ ├── favorites_onDataUpdate.subscribe.json │ │ │ ├── favorites_open.notify.json │ │ │ ├── favorites_openContextMenu.notify.json │ │ │ ├── favorites_setConfig.notify.json │ │ │ ├── freemiumPIRBanner_action.notify.json │ │ │ ├── freemiumPIRBanner_dismiss.notify.json │ │ │ ├── freemiumPIRBanner_getData.request.json │ │ │ ├── freemiumPIRBanner_getData.response.json │ │ │ ├── freemiumPIRBanner_onDataUpdate.subscribe.json │ │ │ ├── initialSetup.request.json │ │ │ ├── initialSetup.response.json │ │ │ ├── nextSteps_action.notify.json │ │ │ ├── nextSteps_dismiss.notify.json │ │ │ ├── nextSteps_getConfig.request.json │ │ │ ├── nextSteps_getConfig.response.json │ │ │ ├── nextSteps_getData.request.json │ │ │ ├── nextSteps_getData.response.json │ │ │ ├── nextSteps_onConfigUpdate.subscribe.json │ │ │ ├── nextSteps_onDataUpdate.subscribe.json │ │ │ ├── nextSteps_setConfig.notify.json │ │ │ ├── open.notify.json │ │ │ ├── protections_getConfig.request.json │ │ │ ├── protections_getConfig.response.json │ │ │ ├── protections_getData.request.json │ │ │ ├── protections_getData.response.json │ │ │ ├── protections_onConfigUpdate.subscribe.json │ │ │ ├── protections_onDataUpdate.subscribe.json │ │ │ ├── protections_setConfig.notify.json │ │ │ ├── reportInitException.notify.json │ │ │ ├── reportPageException.notify.json │ │ │ ├── rmf_dismiss.notify.json │ │ │ ├── rmf_getData.request.json │ │ │ ├── rmf_getData.response.json │ │ │ ├── rmf_onDataUpdate.subscribe.json │ │ │ ├── rmf_primaryAction.notify.json │ │ │ ├── rmf_secondaryAction.notify.json │ │ │ ├── stats_getData.request.json │ │ │ ├── stats_getData.response.json │ │ │ ├── stats_onDataUpdate.subscribe.json │ │ │ ├── stats_showLess.notify.json │ │ │ ├── stats_showMore.notify.json │ │ │ ├── telemetryEvent.notify.json │ │ │ ├── types │ │ │ │ ├── activity-config.json │ │ │ │ ├── activity.json │ │ │ │ ├── animation.json │ │ │ │ ├── background-data.json │ │ │ │ ├── background.json │ │ │ │ ├── browser-theme.json │ │ │ │ ├── colors.json │ │ │ │ ├── customizer-data.json │ │ │ │ ├── default-styles.json │ │ │ │ ├── expansion.json │ │ │ │ ├── favicon.json │ │ │ │ ├── favorites-config.json │ │ │ │ ├── favorites-data.json │ │ │ │ ├── freemiumPIRBanner-message.json │ │ │ │ ├── next-steps-config.json │ │ │ │ ├── next-steps.json │ │ │ │ ├── open-target.json │ │ │ │ ├── privacy-stats.json │ │ │ │ ├── protections-config.json │ │ │ │ ├── protections-data.json │ │ │ │ ├── rmf-message.json │ │ │ │ ├── settings.json │ │ │ │ ├── stats-config.json │ │ │ │ ├── theme-data.json │ │ │ │ ├── update-notification.json │ │ │ │ ├── url-info.json │ │ │ │ ├── user-color-data.json │ │ │ │ ├── user-image-data.json │ │ │ │ ├── user-image.json │ │ │ │ ├── widget-configs.json │ │ │ │ └── widget-list.json │ │ │ ├── updateNotification_dismiss.notify.json │ │ │ ├── updateNotification_onDataUpdate.subscribe.json │ │ │ ├── widgets_onConfigUpdated.subscribe.json │ │ │ └── widgets_setConfig.notify.json │ │ ├── public │ │ │ ├── backgrounds │ │ │ │ ├── bg-01-thumb.jpg │ │ │ │ ├── bg-01.jpg │ │ │ │ ├── bg-02-thumb.jpg │ │ │ │ ├── bg-02.jpg │ │ │ │ ├── bg-03-thumb.jpg │ │ │ │ └── bg-03.jpg │ │ │ ├── burn.json │ │ │ ├── company-icons │ │ │ │ ├── 33across.svg │ │ │ │ ├── a.svg │ │ │ │ ├── acuityads.svg │ │ │ │ ├── adform.svg │ │ │ │ ├── adjust.svg │ │ │ │ ├── adobe.svg │ │ │ │ ├── akamai.svg │ │ │ │ ├── amazon.svg │ │ │ │ ├── amplitude.svg │ │ │ │ ├── appsflyer.svg │ │ │ │ ├── automattic.svg │ │ │ │ ├── b.svg │ │ │ │ ├── beeswax.svg │ │ │ │ ├── bidtellect.svg │ │ │ │ ├── branch-metrics.svg │ │ │ │ ├── braze.svg │ │ │ │ ├── bugsnag.svg │ │ │ │ ├── bytedance.svg │ │ │ │ ├── c.svg │ │ │ │ ├── chartbeat.svg │ │ │ │ ├── cloudflare.svg │ │ │ │ ├── cognitiv.svg │ │ │ │ ├── comscore.svg │ │ │ │ ├── crimtan-holdings.svg │ │ │ │ ├── criteo.svg │ │ │ │ ├── d.svg │ │ │ │ ├── deepintent.svg │ │ │ │ ├── e.svg │ │ │ │ ├── exoclick.svg │ │ │ │ ├── eyeota.svg │ │ │ │ ├── f.svg │ │ │ │ ├── facebook.svg │ │ │ │ ├── g.svg │ │ │ │ ├── google-ads.svg │ │ │ │ ├── google-analytics.svg │ │ │ │ ├── google.svg │ │ │ │ ├── gumgum.svg │ │ │ │ ├── h.svg │ │ │ │ ├── hotjar.svg │ │ │ │ ├── i.svg │ │ │ │ ├── id5.svg │ │ │ │ ├── improve-digital.svg │ │ │ │ ├── index-exchange.svg │ │ │ │ ├── inmar.svg │ │ │ │ ├── instagram.svg │ │ │ │ ├── intent-iq.svg │ │ │ │ ├── iponweb.svg │ │ │ │ ├── j.svg │ │ │ │ ├── k.svg │ │ │ │ ├── kargo.svg │ │ │ │ ├── kochava.svg │ │ │ │ ├── l.svg │ │ │ │ ├── line.svg │ │ │ │ ├── linkedin.svg │ │ │ │ ├── liveintent.svg │ │ │ │ ├── liveramp.svg │ │ │ │ ├── loopme-ltd.svg │ │ │ │ ├── lotame-solutions.svg │ │ │ │ ├── m.svg │ │ │ │ ├── magnite.svg │ │ │ │ ├── mediamath.svg │ │ │ │ ├── medianet-advertising.svg │ │ │ │ ├── mediavine.svg │ │ │ │ ├── merkle.svg │ │ │ │ ├── microsoft.svg │ │ │ │ ├── mixpanel.svg │ │ │ │ ├── n.svg │ │ │ │ ├── narrative.svg │ │ │ │ ├── nativo.svg │ │ │ │ ├── neustar.svg │ │ │ │ ├── new-relic.svg │ │ │ │ ├── o.svg │ │ │ │ ├── onetrust.svg │ │ │ │ ├── openjs-foundation.svg │ │ │ │ ├── openx.svg │ │ │ │ ├── opera-software.svg │ │ │ │ ├── oracle.svg │ │ │ │ ├── other-dark.svg │ │ │ │ ├── other.svg │ │ │ │ ├── outbrain.svg │ │ │ │ ├── p.svg │ │ │ │ ├── pinterest.svg │ │ │ │ ├── prospect-one.svg │ │ │ │ ├── pubmatic.svg │ │ │ │ ├── pulsepoint.svg │ │ │ │ ├── q.svg │ │ │ │ ├── quantcast.svg │ │ │ │ ├── r.svg │ │ │ │ ├── rhythmone.svg │ │ │ │ ├── roku.svg │ │ │ │ ├── rtb-house.svg │ │ │ │ ├── rubicon.svg │ │ │ │ ├── s.svg │ │ │ │ ├── salesforce.svg │ │ │ │ ├── semasio.svg │ │ │ │ ├── sharethrough.svg │ │ │ │ ├── simplifi-holdings.svg │ │ │ │ ├── smaato.svg │ │ │ │ ├── snap.svg │ │ │ │ ├── sonobi.svg │ │ │ │ ├── sovrn-holdings.svg │ │ │ │ ├── spotx.svg │ │ │ │ ├── supership.svg │ │ │ │ ├── synacor.svg │ │ │ │ ├── t.svg │ │ │ │ ├── taboola.svg │ │ │ │ ├── tapad.svg │ │ │ │ ├── teads.svg │ │ │ │ ├── the-nielsen-company.svg │ │ │ │ ├── the-trade-desk.svg │ │ │ │ ├── triplelift.svg │ │ │ │ ├── twitter.svg │ │ │ │ ├── u.svg │ │ │ │ ├── unruly-group.svg │ │ │ │ ├── urban-airship.svg │ │ │ │ ├── v.svg │ │ │ │ ├── verizon-media.svg │ │ │ │ ├── w.svg │ │ │ │ ├── warnermedia.svg │ │ │ │ ├── wpp.svg │ │ │ │ ├── x.svg │ │ │ │ ├── xaxis.svg │ │ │ │ ├── y.svg │ │ │ │ ├── yahoo-japan.svg │ │ │ │ ├── yandex.svg │ │ │ │ ├── yieldmo.svg │ │ │ │ ├── youtube.svg │ │ │ │ ├── z.svg │ │ │ │ ├── zeotap.svg │ │ │ │ └── zeta-global.svg │ │ │ ├── gradients │ │ │ │ ├── gradient01.svg │ │ │ │ ├── gradient02.01.svg │ │ │ │ ├── gradient02.svg │ │ │ │ ├── gradient03.svg │ │ │ │ ├── gradient04.svg │ │ │ │ ├── gradient05.svg │ │ │ │ ├── gradient06.svg │ │ │ │ ├── gradient07.svg │ │ │ │ └── grain.png │ │ │ ├── icons │ │ │ │ ├── Announce.svg │ │ │ │ ├── AppUpdate.svg │ │ │ │ ├── Bring-Stuff-128.svg │ │ │ │ ├── Cookie-Pops-128.svg │ │ │ │ ├── CriticalUpdate.svg │ │ │ │ ├── DDGAnnounce.svg │ │ │ │ ├── Default-App-128.svg │ │ │ │ ├── Dock-Add-Mac-128.svg │ │ │ │ ├── Dock-Add-Windows-128.svg │ │ │ │ ├── Email-Protection-128.svg │ │ │ │ ├── Information-Remover-96.svg │ │ │ │ ├── PrivacyPro.svg │ │ │ │ ├── Tube-Clean-128.svg │ │ │ │ ├── ddg-favicon.png │ │ │ │ ├── favicon@2x.png │ │ │ │ ├── shield-green.svg │ │ │ │ └── shield.svg │ │ │ ├── index.html │ │ │ ├── letters │ │ │ │ ├── a.svg │ │ │ │ ├── b.svg │ │ │ │ ├── c.svg │ │ │ │ ├── d.svg │ │ │ │ ├── e.svg │ │ │ │ ├── f.svg │ │ │ │ ├── g.svg │ │ │ │ ├── h.svg │ │ │ │ ├── i.svg │ │ │ │ ├── j.svg │ │ │ │ ├── k.svg │ │ │ │ ├── l.svg │ │ │ │ ├── m.svg │ │ │ │ ├── n.svg │ │ │ │ ├── o.svg │ │ │ │ ├── p.svg │ │ │ │ ├── q.svg │ │ │ │ ├── r.svg │ │ │ │ ├── s.svg │ │ │ │ ├── t.svg │ │ │ │ ├── u.svg │ │ │ │ ├── v.svg │ │ │ │ ├── w.svg │ │ │ │ ├── x.svg │ │ │ │ ├── y.svg │ │ │ │ └── z.svg │ │ │ └── locales │ │ │ │ ├── de │ │ │ │ └── new-tab.json │ │ │ │ ├── en │ │ │ │ └── new-tab.json │ │ │ │ ├── es │ │ │ │ └── new-tab.json │ │ │ │ ├── fr │ │ │ │ └── new-tab.json │ │ │ │ ├── it │ │ │ │ └── new-tab.json │ │ │ │ ├── nl │ │ │ │ └── new-tab.json │ │ │ │ ├── pl │ │ │ │ └── new-tab.json │ │ │ │ ├── pt │ │ │ │ └── new-tab.json │ │ │ │ └── ru │ │ │ │ └── new-tab.json │ │ ├── readme.md │ │ ├── src │ │ │ ├── index.js │ │ │ └── inline.js │ │ └── types │ │ │ └── new-tab.ts │ ├── onboarding │ │ ├── .gitignore │ │ ├── app │ │ │ ├── Components.js │ │ │ ├── animations │ │ │ │ ├── Onboarding.riv │ │ │ │ ├── import.riv │ │ │ │ ├── set_default.riv │ │ │ │ └── taskbar_pinning.riv │ │ │ ├── components │ │ │ │ ├── Animate.js │ │ │ │ ├── App.js │ │ │ │ ├── App.module.css │ │ │ │ ├── App2.js │ │ │ │ ├── App2.module.css │ │ │ │ ├── Background.js │ │ │ │ ├── Background.module.css │ │ │ │ ├── BeforeAfter.js │ │ │ │ ├── BeforeAfter.module.css │ │ │ │ ├── Buttons.js │ │ │ │ ├── Buttons.module.css │ │ │ │ ├── Content.js │ │ │ │ ├── Content.module.css │ │ │ │ ├── Header.js │ │ │ │ ├── Header.module.css │ │ │ │ ├── Icons.js │ │ │ │ ├── Icons.module.css │ │ │ │ ├── List.js │ │ │ │ ├── List.module.css │ │ │ │ ├── ListItem.js │ │ │ │ ├── ListItem.module.css │ │ │ │ ├── Progress.js │ │ │ │ ├── Progress.module.css │ │ │ │ ├── RiveAnimation.js │ │ │ │ ├── SettingsProvider.js │ │ │ │ ├── Stack.js │ │ │ │ ├── Stack.module.css │ │ │ │ ├── Timeout.js │ │ │ │ ├── Typed.js │ │ │ │ └── v3 │ │ │ │ │ ├── Animation.js │ │ │ │ │ ├── Animation.module.css │ │ │ │ │ ├── Background.js │ │ │ │ │ ├── Background.module.css │ │ │ │ │ ├── BeforeAfterProvider.js │ │ │ │ │ ├── Buttons.js │ │ │ │ │ ├── Buttons.module.css │ │ │ │ │ ├── ComparisonTable.js │ │ │ │ │ ├── ComparisonTable.module.css │ │ │ │ │ ├── DuckPlayerStep.js │ │ │ │ │ ├── DuckPlayerStep.module.css │ │ │ │ │ ├── ElasticButton.js │ │ │ │ │ ├── ElasticButton.module.css │ │ │ │ │ ├── Heading.js │ │ │ │ │ ├── Heading.module.css │ │ │ │ │ ├── Hiker.js │ │ │ │ │ ├── Hiker.module.css │ │ │ │ │ ├── MakeDefaultStep.js │ │ │ │ │ ├── SettingsStep.js │ │ │ │ │ ├── SingleStep.js │ │ │ │ │ ├── SingleStep.module.css │ │ │ │ │ ├── data-comparison-table.js │ │ │ │ │ ├── data-types.js │ │ │ │ │ ├── data.js │ │ │ │ │ └── useStepConfig.js │ │ │ ├── data.js │ │ │ ├── global.js │ │ │ ├── hooks │ │ │ │ └── useRollin.js │ │ │ ├── index.js │ │ │ ├── messages.js │ │ │ ├── pages │ │ │ │ ├── CleanBrowsing.js │ │ │ │ ├── Fallback.js │ │ │ │ ├── PrivacyDefault.js │ │ │ │ ├── SettingsStep.js │ │ │ │ ├── Summary.js │ │ │ │ └── Welcome.js │ │ │ ├── settings.js │ │ │ ├── styles │ │ │ │ ├── base.css │ │ │ │ ├── global.css │ │ │ │ └── variables.css │ │ │ └── types.js │ │ ├── integration-tests │ │ │ ├── onboarding.js │ │ │ └── onboarding.spec.js │ │ ├── integration.md │ │ ├── public │ │ │ ├── assets │ │ │ │ └── img │ │ │ │ │ ├── background-dark-v3.jpg │ │ │ │ │ ├── background-dark.jpg │ │ │ │ │ ├── background-v3.jpg │ │ │ │ │ ├── background.jpg │ │ │ │ │ ├── check.svg │ │ │ │ │ ├── clouds.svg │ │ │ │ │ ├── dax.svg │ │ │ │ │ ├── grain-dark.png │ │ │ │ │ ├── grain.png │ │ │ │ │ ├── hiker.svg │ │ │ │ │ ├── icons │ │ │ │ │ ├── check-24.svg │ │ │ │ │ ├── chrome.svg │ │ │ │ │ ├── cross-24.svg │ │ │ │ │ ├── ddg.svg │ │ │ │ │ ├── safari.svg │ │ │ │ │ └── stop-24.svg │ │ │ │ │ ├── layer1_legacy.svg │ │ │ │ │ ├── layer2_legacy.svg │ │ │ │ │ ├── layer3_legacy.svg │ │ │ │ │ ├── mountains.svg │ │ │ │ │ ├── stars.svg │ │ │ │ │ └── steps │ │ │ │ │ ├── bookmarks.png │ │ │ │ │ ├── browsing.png │ │ │ │ │ ├── cookie.png │ │ │ │ │ ├── dock.png │ │ │ │ │ ├── duckplayer.png │ │ │ │ │ ├── home.png │ │ │ │ │ ├── import.png │ │ │ │ │ ├── search.png │ │ │ │ │ ├── session-restore.png │ │ │ │ │ ├── shield.png │ │ │ │ │ ├── switch.png │ │ │ │ │ └── v3 │ │ │ │ │ ├── ads.svg │ │ │ │ │ ├── cookie.svg │ │ │ │ │ ├── default-browser.svg │ │ │ │ │ ├── dock.svg │ │ │ │ │ ├── favorite.svg │ │ │ │ │ ├── fire.svg │ │ │ │ │ ├── home.svg │ │ │ │ │ ├── import.svg │ │ │ │ │ ├── search.svg │ │ │ │ │ ├── session-restore.svg │ │ │ │ │ ├── shield.svg │ │ │ │ │ └── video-player.svg │ │ │ ├── index.html │ │ │ ├── locales │ │ │ │ ├── de │ │ │ │ │ └── onboarding.json │ │ │ │ ├── en │ │ │ │ │ └── onboarding.json │ │ │ │ ├── es │ │ │ │ │ └── onboarding.json │ │ │ │ ├── fr │ │ │ │ │ └── onboarding.json │ │ │ │ ├── it │ │ │ │ │ └── onboarding.json │ │ │ │ ├── nl │ │ │ │ │ └── onboarding.json │ │ │ │ ├── pl │ │ │ │ │ └── onboarding.json │ │ │ │ ├── pt │ │ │ │ │ └── onboarding.json │ │ │ │ └── ru │ │ │ │ │ └── onboarding.json │ │ │ └── robots.txt │ │ ├── readme.md │ │ └── src │ │ │ ├── index.js │ │ │ ├── inline.js │ │ │ └── mock-transport.js │ ├── release-notes │ │ ├── .gitignore │ │ ├── app │ │ │ ├── Components.js │ │ │ ├── Components.module.css │ │ │ ├── components │ │ │ │ ├── App.js │ │ │ │ ├── App.module.css │ │ │ │ ├── ContentPlaceholder.js │ │ │ │ ├── ContentPlaceholder.module.css │ │ │ │ ├── ErrorFallback.js │ │ │ │ ├── OpenIn16.js │ │ │ │ ├── ReleaseNotes.js │ │ │ │ └── ReleaseNotes.module.css │ │ │ ├── index.js │ │ │ ├── sampleData.js │ │ │ ├── settings.js │ │ │ ├── settings.provider.js │ │ │ └── types.js │ │ ├── integration-tests │ │ │ ├── release-notes.js │ │ │ └── release-notes.spec.js │ │ ├── messages │ │ │ ├── browserRestart.notify.json │ │ │ ├── initialSetup.request.json │ │ │ ├── initialSetup.response.json │ │ │ ├── onUpdate.subscribe.json │ │ │ ├── reportInitException.notify.json │ │ │ ├── reportPageException.notify.json │ │ │ ├── retryFetchReleaseNotes.notify.json │ │ │ └── retryUpdate.notify.json │ │ ├── public │ │ │ ├── index.html │ │ │ ├── locales │ │ │ │ ├── de │ │ │ │ │ └── release-notes.json │ │ │ │ ├── en │ │ │ │ │ └── release-notes.json │ │ │ │ ├── es │ │ │ │ │ └── release-notes.json │ │ │ │ ├── fr │ │ │ │ │ └── release-notes.json │ │ │ │ ├── it │ │ │ │ │ └── release-notes.json │ │ │ │ ├── nl │ │ │ │ │ └── release-notes.json │ │ │ │ ├── pl │ │ │ │ │ └── release-notes.json │ │ │ │ ├── pt │ │ │ │ │ └── release-notes.json │ │ │ │ └── ru │ │ │ │ │ └── release-notes.json │ │ │ └── robots.txt │ │ ├── readme.md │ │ ├── src │ │ │ ├── index.js │ │ │ ├── inline.js │ │ │ └── mock-transport.js │ │ └── types │ │ │ └── release-notes.ts │ └── special-error │ │ ├── app │ │ ├── components │ │ │ ├── AdvancedInfo.jsx │ │ │ ├── AdvancedInfo.module.css │ │ │ ├── App.jsx │ │ │ ├── App.module.css │ │ │ ├── Components.jsx │ │ │ ├── Components.module.css │ │ │ ├── ErrorFallback.js │ │ │ ├── Warning.jsx │ │ │ └── Warning.module.css │ │ ├── constants.js │ │ ├── hooks │ │ │ └── ErrorStrings.jsx │ │ ├── index.js │ │ ├── providers │ │ │ ├── MessagingProvider.js │ │ │ ├── SettingsProvider.jsx │ │ │ └── SpecialErrorProvider.js │ │ ├── settings.js │ │ ├── specialError.js │ │ ├── styles │ │ │ └── variables.css │ │ └── types.js │ │ ├── integration-tests │ │ ├── special-error-screenshots.spec.js │ │ ├── special-error-screenshots.spec.js-snapshots │ │ │ ├── malware-warning-ru-ios-darwin.png │ │ │ ├── malware-warning-ru-macos-darwin.png │ │ │ ├── malware-warning-ru-windows-darwin.png │ │ │ ├── phishing-warning-advanced-ios-darwin.png │ │ │ ├── phishing-warning-advanced-macos-darwin.png │ │ │ ├── phishing-warning-advanced-windows-darwin.png │ │ │ ├── scam-warning-advanced-ios-darwin.png │ │ │ ├── scam-warning-advanced-macos-darwin.png │ │ │ ├── scam-warning-advanced-windows-darwin.png │ │ │ ├── ssl-expired-cert-ios-darwin.png │ │ │ ├── ssl-expired-cert-macos-darwin.png │ │ │ ├── ssl-expired-cert-reduced-motion-ios-darwin.png │ │ │ ├── ssl-expired-cert-reduced-motion-macos-darwin.png │ │ │ ├── ssl-expired-cert-reduced-motion-windows-darwin.png │ │ │ └── ssl-expired-cert-windows-darwin.png │ │ ├── special-error.js │ │ └── special-error.spec.js │ │ ├── messages │ │ ├── advancedInfo.notify.json │ │ ├── initialSetup.request.json │ │ ├── initialSetup.response.json │ │ ├── leaveSite.notify.json │ │ ├── reportInitException.notify.json │ │ ├── reportPageException.notify.json │ │ └── visitSite.notify.json │ │ ├── public │ │ ├── index.html │ │ └── locales │ │ │ ├── bg │ │ │ └── special-error.json │ │ │ ├── cs │ │ │ └── special-error.json │ │ │ ├── da │ │ │ └── special-error.json │ │ │ ├── de │ │ │ └── special-error.json │ │ │ ├── el │ │ │ └── special-error.json │ │ │ ├── en │ │ │ └── special-error.json │ │ │ ├── es │ │ │ └── special-error.json │ │ │ ├── et │ │ │ └── special-error.json │ │ │ ├── fi │ │ │ └── special-error.json │ │ │ ├── fr │ │ │ └── special-error.json │ │ │ ├── hr │ │ │ └── special-error.json │ │ │ ├── hu │ │ │ └── special-error.json │ │ │ ├── it │ │ │ └── special-error.json │ │ │ ├── lt │ │ │ └── special-error.json │ │ │ ├── lv │ │ │ └── special-error.json │ │ │ ├── nb │ │ │ └── special-error.json │ │ │ ├── nl │ │ │ └── special-error.json │ │ │ ├── pl │ │ │ └── special-error.json │ │ │ ├── pt │ │ │ └── special-error.json │ │ │ ├── ro │ │ │ └── special-error.json │ │ │ ├── ru │ │ │ └── special-error.json │ │ │ ├── sk │ │ │ └── special-error.json │ │ │ ├── sl │ │ │ └── special-error.json │ │ │ ├── sv │ │ │ └── special-error.json │ │ │ └── tr │ │ │ └── special-error.json │ │ ├── readme.md │ │ ├── src │ │ ├── index.js │ │ ├── inline.js │ │ ├── mock-transport.js │ │ └── sampleData.js │ │ └── types │ │ └── special-error.ts ├── playwright.config.js ├── shared │ ├── assets │ │ └── img │ │ │ ├── Logo-Horizontal-Dark.svg │ │ │ ├── Logo-Horizontal.svg │ │ │ └── icons │ │ │ ├── Check-Color-24.svg │ │ │ ├── Exclamation-Color-24.svg │ │ │ ├── Exclamation-High-Color-24.svg │ │ │ ├── Malware-Site-128.svg │ │ │ ├── Malware-Site-96.svg │ │ │ ├── Privacy-Pro-Color-16.svg │ │ │ ├── Shield-Alert-128.svg │ │ │ ├── Shield-Alert-96.svg │ │ │ ├── Spinner-16-Dark.svg │ │ │ ├── Spinner-16.svg │ │ │ └── readme.md │ ├── call-with-retry.js │ ├── components │ │ ├── Button │ │ │ ├── Button.js │ │ │ └── Button.module.css │ │ ├── Card │ │ │ ├── Card.js │ │ │ └── Card.module.css │ │ ├── DocumentVisibility.js │ │ ├── DuckDuckGoLogo │ │ │ ├── DuckDuckGoLogo.js │ │ │ └── DuckDuckGoLogo.module.css │ │ ├── EnvironmentProvider.js │ │ ├── ErrorBoundary.js │ │ ├── Fallback │ │ │ ├── Fallback.jsx │ │ │ └── Fallback.module.css │ │ ├── FaviconWithState.js │ │ ├── FaviconWithState.module.css │ │ ├── InlineErrorBoundary.js │ │ ├── Switch │ │ │ ├── Switch.js │ │ │ └── Switch.module.css │ │ ├── Text │ │ │ ├── Text.js │ │ │ └── Text.module.css │ │ └── TranslationsProvider.js │ ├── create-special-page-messaging.js │ ├── environment.js │ ├── getColorForString.js │ ├── handlers.js │ ├── live-reload.js │ ├── mocks.js │ ├── styles │ │ ├── global.css │ │ ├── reset.css │ │ ├── utilities.css │ │ └── variables.css │ └── translations.js ├── translations.mjs ├── types.mjs ├── unit-test │ ├── color.spec.mjs │ └── translations.mjs └── watch.mjs ├── tsconfig.json ├── typedoc.js └── types-generator ├── README.md ├── build-types.mjs ├── json-schema-fs.mjs ├── json-schema.mjs ├── package.json └── unit-test ├── build-types.js ├── config.json └── generate-schema.js /.git-blame-ignore-revs: -------------------------------------------------------------------------------- 1 | # .git-blame-ignore-revs 2 | # Moved all packaged to root level https://github.com/duckduckgo/content-scope-scripts/pull/1103 3 | f16b140c7731f9a66619e426b1f24414abaeb954 4 | # Switched to a shared DDG ESLint config https://github.com/duckduckgo/content-scope-scripts/pull/1185 5 | 76bab4d80982ddab63265c694ab96c27a0fa5138 6 | # introduced Prettier https://github.com/duckduckgo/content-scope-scripts/pull/1198 7 | 53818cc0152d4a814d170563145004b65f5d404d 8 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | src/locales/** linguist-generated 2 | src/types/* text eol=lf 3 | * text=auto eol=lf 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | .swiftpm 4 | .env 5 | .build/ 6 | build/ 7 | /docs 8 | /screens 9 | test-results/ 10 | playwright-report/ 11 | Sources/ContentScopeScripts/dist/ 12 | test-results 13 | !Sources/ContentScopeScripts/dist/pages/.gitignore 14 | 15 | # Local Netlify folder 16 | .netlify 17 | # VS Code user config 18 | .vscode 19 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | 22 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | build/**/* 2 | docs/**/* 3 | injected/src/types 4 | special-pages/pages/**/types 5 | injected/integration-test/extension/contentScope.js 6 | **/*.json 7 | **/*.md 8 | **/*.html 9 | **/*.har 10 | **/*.css 11 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "printWidth": 140, 4 | "tabWidth": 4 5 | } 6 | -------------------------------------------------------------------------------- /.swift-version: -------------------------------------------------------------------------------- 1 | 5.5 2 | -------------------------------------------------------------------------------- /Sources/ContentScopeScripts/ContentScopeScripts.swift: -------------------------------------------------------------------------------- 1 | import Foundation 2 | 3 | public struct ContentScopeScripts { 4 | public static var Bundle: Bundle = .module 5 | } 6 | -------------------------------------------------------------------------------- /Sources/ContentScopeScripts/dist/pages/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /build-output.eslint.config.js: -------------------------------------------------------------------------------- 1 | // this belongs to the injected/ package, but eslint has issues with linting files outside of the base directory: 2 | // https://github.com/eslint/eslint/discussions/18806#discussioncomment-10848750 3 | 4 | export default [ 5 | { 6 | languageOptions: { 7 | ecmaVersion: 'latest', 8 | sourceType: 'script', 9 | }, 10 | rules: { 11 | 'no-implicit-globals': 'error', 12 | }, 13 | }, 14 | ]; 15 | -------------------------------------------------------------------------------- /injected/integration-test/broker-protection-tests/tests-config.js: -------------------------------------------------------------------------------- 1 | import { createFeatureConfig } from '../mocks/broker-protection/feature-config'; 2 | 3 | export const BROKER_PROTECTION_CONFIGS = Object.freeze({ 4 | default: createFeatureConfig(), 5 | }); 6 | -------------------------------------------------------------------------------- /injected/integration-test/duckplayer-mobile-drawer.spec.js-snapshots/drawer-android-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/injected/integration-test/duckplayer-mobile-drawer.spec.js-snapshots/drawer-android-darwin.png -------------------------------------------------------------------------------- /injected/integration-test/duckplayer-mobile-drawer.spec.js-snapshots/drawer-ios-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/injected/integration-test/duckplayer-mobile-drawer.spec.js-snapshots/drawer-ios-darwin.png -------------------------------------------------------------------------------- /injected/integration-test/duckplayer-mobile.spec.js-snapshots/overlay-android-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/injected/integration-test/duckplayer-mobile.spec.js-snapshots/overlay-android-darwin.png -------------------------------------------------------------------------------- /injected/integration-test/duckplayer-mobile.spec.js-snapshots/overlay-ios-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/injected/integration-test/duckplayer-mobile.spec.js-snapshots/overlay-ios-darwin.png -------------------------------------------------------------------------------- /injected/integration-test/extension/.gitignore: -------------------------------------------------------------------------------- 1 | /contentScope.js 2 | -------------------------------------------------------------------------------- /injected/integration-test/extension/inject.js: -------------------------------------------------------------------------------- 1 | function injectContentScript(src) { 2 | const elem = document.head || document.documentElement; 3 | const script = document.createElement('script'); 4 | script.src = src; 5 | script.onload = function () { 6 | this.remove(); 7 | }; 8 | elem.appendChild(script); 9 | } 10 | 11 | injectContentScript(chrome.runtime.getURL('/contentScope.js')); 12 | -------------------------------------------------------------------------------- /injected/integration-test/extension/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "integration-test-extension", 3 | "description": "integration-test-extension", 4 | "version": "1.0", 5 | "manifest_version": 3, 6 | "content_scripts": [ 7 | { 8 | "matches": [""], 9 | "run_at": "document_start", 10 | "js": ["inject.js"], 11 | "all_frames": true, 12 | "match_about_blank": true 13 | } 14 | ], 15 | "web_accessible_resources": [ 16 | { 17 | "resources": [ "contentScope.js" ], 18 | "matches": [ "*://*/*" ] 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /injected/integration-test/mocks/broker-protection/types.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @typedef {Object} PirState 3 | * @property {Object} state 4 | * @property {import("../../../src/features/broker-protection/types").PirAction} state.action 5 | * @property {Record} [state.data] 6 | */ 7 | -------------------------------------------------------------------------------- /injected/integration-test/mocks/broker-protection/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {string} fileName 3 | */ 4 | export function getBrokerProtectionTestPageUrl(fileName) { 5 | return `http://localhost:3220/broker-protection/pages/${fileName}`; 6 | } 7 | 8 | /** 9 | * @param {PirState['state']} state 10 | * @returns {PirState} 11 | */ 12 | export function createPirState(state) { 13 | return { state }; 14 | } 15 | -------------------------------------------------------------------------------- /injected/integration-test/state/.gitignore: -------------------------------------------------------------------------------- 1 | *.json 2 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/api-manipulation/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | API Interventions 7 | 8 | 9 | 10 |

[Home]

11 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/blank.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Blank Integration page

4 |

This page is used by extension test code, which will inject a content script

5 | 6 | 7 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/breakage-reporting/config/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "unprotectedTemporary": [], 3 | "features": { 4 | "breakageReporting": { 5 | "state": "enabled", 6 | "exceptions": [] 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/breakage-reporting/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Breakage Reporting 7 | 8 | 9 |

Breakage Reporting

10 | 11 | 12 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/breakage-reporting/pages/ref.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Breakage Reporting with Referrer 7 | 8 | 9 |

Breakage Reporting with Referrer

10 | 11 | 12 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/actions/action-not-found.json: -------------------------------------------------------------------------------- 1 | { 2 | "state": { 3 | "action": null 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/actions/click-disabled-button-failSilently.json: -------------------------------------------------------------------------------- 1 | { 2 | "state": { 3 | "action": { 4 | "actionType": "click", 5 | "id": "1", 6 | "elements": [ 7 | { 8 | "type": "button", 9 | "selector": ".btn", 10 | "failSilently": true 11 | } 12 | ] 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/actions/click-disabled-button.json: -------------------------------------------------------------------------------- 1 | { 2 | "state": { 3 | "action": { 4 | "actionType": "click", 5 | "id": "1", 6 | "elements": [ 7 | { 8 | "type": "button", 9 | "selector": ".btn" 10 | } 11 | ] 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/actions/click-multiple.json: -------------------------------------------------------------------------------- 1 | { 2 | "state": { 3 | "action": { 4 | "actionType": "click", 5 | "id": "1", 6 | "elements": [ 7 | { 8 | "type": "button", 9 | "selector": ".view-more", 10 | "multiple": true 11 | } 12 | ] 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/actions/click-nonexistent-selector-failSilently.json: -------------------------------------------------------------------------------- 1 | { 2 | "state": { 3 | "action": { 4 | "actionType": "click", 5 | "id": "1", 6 | "elements": [ 7 | { 8 | "type": "button", 9 | "selector": ".test", 10 | "failSilently": true 11 | } 12 | ] 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/actions/click-nonexistent-selector.json: -------------------------------------------------------------------------------- 1 | { 2 | "state": { 3 | "action": { 4 | "actionType": "click", 5 | "id": "1", 6 | "elements": [ 7 | { 8 | "type": "button", 9 | "selector": ".test" 10 | } 11 | ] 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/actions/click.json: -------------------------------------------------------------------------------- 1 | { 2 | "state": { 3 | "action": { 4 | "actionType": "click", 5 | "id": "1", 6 | "elements": [ 7 | { 8 | "type": "button", 9 | "selector": ".btn-sbmt" 10 | } 11 | ] 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/actions/conditional-clicks-hard-coded-null-default.json: -------------------------------------------------------------------------------- 1 | { 2 | "state": { 3 | "action": { 4 | "actionType": "click", 5 | "id": "1", 6 | "choices": [ 7 | { 8 | "condition": { 9 | "left": "40", 10 | "operation": ">=", 11 | "right": "45" 12 | }, 13 | "elements": [ 14 | { "type": "button", "selector": ".//a[text()='Yes']" } 15 | ] 16 | } 17 | ], 18 | "default": null 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/actions/expectation.json: -------------------------------------------------------------------------------- 1 | { 2 | "state": { 3 | "action": { 4 | "actionType": "expectation", 5 | "id": "2", 6 | "expectations": [ 7 | { 8 | "type": "text", 9 | "selector": ".message", 10 | "expect": "Please complete the form" 11 | } 12 | ] 13 | } 14 | } 15 | } -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Broker Protection 7 | 8 | 9 |

[Home]

10 | 11 |

Broker Protection

12 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/pages/clicks.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Broker Protection 7 | 8 | 9 |
10 |
John Doe
11 |
32
12 |
13 | New York, NY 14 | Los Angeles, CA 15 | View More 16 |
17 | 18 |
19 | 20 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/pages/empty-form.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Broker Protection 7 | 8 | 9 | 10 | 11 | 12 |

[Broker Protection]

13 | 14 |
15 |
16 | 17 | 18 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/pages/h-captcha.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 |
5 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/broker-protection/pages/results-5.html: -------------------------------------------------------------------------------- 1 |
2 |
Jonathan Smith, age 3 | 50
4 |
Orlando, FL
5 |
123 Main St, Orlando, FL 81010
6 |
(970) 214-05106
7 |
-------------------------------------------------------------------------------- /injected/integration-test/test-pages/duckplayer-native/pages/thumbnail-dark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/injected/integration-test/test-pages/duckplayer-native/pages/thumbnail-dark.jpg -------------------------------------------------------------------------------- /injected/integration-test/test-pages/duckplayer-native/pages/thumbnail-light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/injected/integration-test/test-pages/duckplayer-native/pages/thumbnail-light.jpg -------------------------------------------------------------------------------- /injected/integration-test/test-pages/duckplayer/config/disabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "unprotectedTemporary": [], 3 | "features": { 4 | "duckPlayer": { 5 | "state": "disabled", 6 | "exceptions": [] 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/duckplayer/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Runtime checks 7 | 8 | 9 |

[Home]

10 | 11 |

Duck Player

12 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/duckplayer/pages/thumbnail-dark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/injected/integration-test/test-pages/duckplayer/pages/thumbnail-dark.jpg -------------------------------------------------------------------------------- /injected/integration-test/test-pages/duckplayer/pages/thumbnail-light.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/injected/integration-test/test-pages/duckplayer/pages/thumbnail-light.jpg -------------------------------------------------------------------------------- /injected/integration-test/test-pages/favicon/config/favicon-absent.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": { 3 | 4 | }, 5 | "unprotectedTemporary": [] 6 | } 7 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/favicon/config/favicon-disabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": { 3 | "favicon": { 4 | "state": "disabled", 5 | "exceptions": [] 6 | } 7 | }, 8 | "unprotectedTemporary": [] 9 | } 10 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/favicon/config/favicon-enabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": { 3 | "favicon": { 4 | "state": "enabled", 5 | "exceptions": [], 6 | "settings": { 7 | "monitor": true 8 | } 9 | } 10 | }, 11 | "unprotectedTemporary": [] 12 | } 13 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/favicon/config/favicon-monitor-disabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": { 3 | "favicon": { 4 | "state": "enabled", 5 | "exceptions": [], 6 | "settings": { 7 | "monitor": false 8 | } 9 | } 10 | }, 11 | "unprotectedTemporary": [] 12 | } 13 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/favicon/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/injected/integration-test/test-pages/favicon/favicon.png -------------------------------------------------------------------------------- /injected/integration-test/test-pages/favicon/new_favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/injected/integration-test/test-pages/favicon/new_favicon.png -------------------------------------------------------------------------------- /injected/integration-test/test-pages/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

Integration page

4 |

This loads the injection file as if it were loaded through the content script.

5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/message-bridge/config/message-bridge-disabled.json: -------------------------------------------------------------------------------- 1 | { 2 | "unprotectedTemporary": [], 3 | "features": { 4 | "favicon": { 5 | "state": "disabled", 6 | "exceptions": [] 7 | }, 8 | "navigatorInterface": { 9 | "state": "enabled", 10 | "exceptions": [] 11 | }, 12 | "messageBridge": { 13 | "exceptions": [], 14 | "state": "enabled", 15 | "settings": { 16 | "exampleFeature": "disabled" 17 | } 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/message-bridge/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Message Bridge 7 | 8 | 9 | 10 |

[Home]

11 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/permissions/config/permissions.json: -------------------------------------------------------------------------------- 1 | { 2 | "unprotectedTemporary": [], 3 | "features": { 4 | "windowsPermissionUsage": { 5 | "state": "enabled", 6 | "exceptions": [] 7 | } 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/shared/replay.js: -------------------------------------------------------------------------------- 1 | function replayScript(scriptText) { 2 | const scriptElement = document.createElement('script'); 3 | scriptElement.innerText = scriptText; 4 | document.head.appendChild(scriptElement); 5 | } 6 | window.replayScript = replayScript; 7 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/shared/scripty.js: -------------------------------------------------------------------------------- 1 | // @ts-expect-error not a global variable 2 | window.externalScriptRan = true; 3 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/shared/style.css: -------------------------------------------------------------------------------- 1 | .results { 2 | font-family: Arial, Helvetica, sans-serif; 3 | border-collapse: collapse; 4 | width: 70%; 5 | } 6 | 7 | .results td, .results th { 8 | border: 1px solid #ddd; 9 | padding: 8px; 10 | } 11 | 12 | .results th { 13 | padding-top: 12px; 14 | padding-bottom: 12px; 15 | text-align: left; 16 | background-color: #f2f2f2; 17 | color: black; 18 | } 19 | 20 | .pass td:nth-child(3) { 21 | background-color: green; 22 | } 23 | 24 | .fail td:nth-child(3) { 25 | background-color: rgb(249, 114, 104);; 26 | } 27 | -------------------------------------------------------------------------------- /injected/integration-test/test-pages/webcompat/config/shims.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": { 3 | "webCompat": { 4 | "state": "enabled", 5 | "settings": { 6 | "mediaSession": "enabled", 7 | "presentation": "enabled" 8 | } 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /injected/scripts/generate-har.js: -------------------------------------------------------------------------------- 1 | import { chromium } from '@playwright/test'; 2 | 3 | const testPath = 'integration-test/data/har/duckduckgo.com/search.har'; 4 | 5 | async function init() { 6 | const browser = await chromium.launch(); 7 | const context = await browser.newContext({ 8 | recordHar: { path: testPath }, 9 | }); 10 | 11 | const page = await context.newPage(); 12 | 13 | await page.goto('https://duckduckgo.com/c-s-s-says-hello'); 14 | await page.waitForLoadState('networkidle'); 15 | 16 | // Close context to ensure HAR is saved to disk. 17 | await context.close(); 18 | await browser.close(); 19 | } 20 | 21 | init(); 22 | -------------------------------------------------------------------------------- /injected/scripts/server.mjs: -------------------------------------------------------------------------------- 1 | import { createServer } from 'http-server'; 2 | 3 | const server = createServer({ root: process.env.SERVER_DIR }); 4 | server.listen(process.env.SERVER_PORT); 5 | server.server.on('listening', () => { 6 | process.send?.({ port: server.server.address().port }); 7 | }); 8 | server.server.on('error', () => { 9 | process.exit(1); 10 | }); 11 | -------------------------------------------------------------------------------- /injected/src/crypto.js: -------------------------------------------------------------------------------- 1 | import { sjcl } from '../lib/sjcl.js'; 2 | 3 | export function getDataKeySync(sessionKey, domainKey, inputData) { 4 | // eslint-disable-next-line new-cap 5 | const hmac = new sjcl.misc.hmac(sjcl.codec.utf8String.toBits(sessionKey + domainKey), sjcl.hash.sha256); 6 | return sjcl.codec.hex.fromBits(hmac.encrypt(inputData)); 7 | } 8 | -------------------------------------------------------------------------------- /injected/src/features/breakage-reporting.js: -------------------------------------------------------------------------------- 1 | import ContentFeature from '../content-feature'; 2 | import { getJsPerformanceMetrics } from './breakage-reporting/utils.js'; 3 | 4 | export default class BreakageReporting extends ContentFeature { 5 | init() { 6 | this.messaging.subscribe('getBreakageReportValues', () => { 7 | const jsPerformance = getJsPerformanceMetrics(); 8 | const referrer = document.referrer; 9 | 10 | this.messaging.notify('breakageReportResult', { 11 | jsPerformance, 12 | referrer, 13 | }); 14 | }); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /injected/src/features/breakage-reporting/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @returns array of performance metrics 3 | */ 4 | export function getJsPerformanceMetrics() { 5 | const paintResources = performance.getEntriesByType('paint'); 6 | const firstPaint = paintResources.find((entry) => entry.name === 'first-contentful-paint'); 7 | return firstPaint ? [firstPaint.startTime] : []; 8 | } 9 | -------------------------------------------------------------------------------- /injected/src/features/broker-protection/actions/actions.js: -------------------------------------------------------------------------------- 1 | export { extract } from './extract.js'; 2 | export { fillForm } from './fill-form.js'; 3 | export { click } from './click.js'; 4 | export { expectation } from './expectation.js'; 5 | export { navigate } from './navigate.js'; 6 | export { getCaptchaInfo, solveCaptcha } from '../captcha-services/captcha.service.js'; 7 | -------------------------------------------------------------------------------- /injected/src/features/broker-protection/captcha-services/utils/element.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | * @param {HTMLElement} element - The element to check 4 | * @param {string | string[]} tag - The tag name(s) to check against 5 | * @returns {boolean} - True if the element is of the specified tag name(s), false otherwise 6 | */ 7 | export function isElementType(element, tag) { 8 | if (Array.isArray(tag)) { 9 | return tag.some((t) => isElementType(element, t)); 10 | } 11 | 12 | return element.tagName.toLowerCase() === tag.toLowerCase(); 13 | } 14 | -------------------------------------------------------------------------------- /injected/src/features/broker-protection/comparisons/is-same-age.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param userAge 3 | * @param ageFound 4 | * @return {boolean} 5 | */ 6 | export function isSameAge(userAge, ageFound) { 7 | // variance allows for +/- 1 on the data broker and +/- 1 based on the only having a birth year 8 | const ageVariance = 2; 9 | userAge = parseInt(userAge); 10 | ageFound = parseInt(ageFound); 11 | 12 | if (isNaN(ageFound)) { 13 | return false; 14 | } 15 | 16 | if (Math.abs(userAge - ageFound) < ageVariance) { 17 | return true; 18 | } 19 | 20 | return false; 21 | } 22 | -------------------------------------------------------------------------------- /injected/src/features/broker-protection/extractors/age.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 2 | import { Extractor } from '../types.js'; 3 | 4 | /** 5 | * @implements {Extractor} 6 | */ 7 | export class AgeExtractor { 8 | /** 9 | * @param {string[]} strs 10 | * @param {import('../actions/extract.js').ExtractorParams} _extractorParams 11 | */ 12 | 13 | extract(strs, _extractorParams) { 14 | if (!strs[0]) return null; 15 | return strs[0].match(/\d+/)?.[0] ?? null; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /injected/src/features/click-to-load/components/index.js: -------------------------------------------------------------------------------- 1 | import { DDGCtlPlaceholderBlockedElement } from './ctl-placeholder-blocked.js'; 2 | 3 | /** 4 | * Register custom elements in this wrapper function to be called only when we need to 5 | * and also to allow remote-config later if needed. 6 | */ 7 | export function registerCustomElements() { 8 | if (!customElements.get(DDGCtlPlaceholderBlockedElement.CUSTOM_TAG_NAME)) { 9 | customElements.define(DDGCtlPlaceholderBlockedElement.CUSTOM_TAG_NAME, DDGCtlPlaceholderBlockedElement); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /injected/src/features/duckplayer-native/constants.js: -------------------------------------------------------------------------------- 1 | export const MSG_NAME_INITIAL_SETUP = 'initialSetup'; 2 | export const MSG_NAME_CURRENT_TIMESTAMP = 'onCurrentTimestamp'; 3 | export const MSG_NAME_MEDIA_CONTROL = 'onMediaControl'; 4 | export const MSG_NAME_MUTE_AUDIO = 'onMuteAudio'; 5 | export const MSG_NAME_SERP_NOTIFY = 'onSerpNotify'; 6 | export const MSG_NAME_YOUTUBE_ERROR = 'onYoutubeError'; 7 | export const MSG_NAME_URL_CHANGE = 'onUrlChanged'; 8 | export const MSG_NAME_FEATURE_READY = 'onDuckPlayerFeatureReady'; 9 | export const MSG_NAME_SCRIPTS_READY = 'onDuckPlayerScriptsReady'; 10 | export const MSG_NAME_DISMISS_OVERLAY = 'didDismissOverlay'; 11 | -------------------------------------------------------------------------------- /injected/src/features/duckplayer-native/mute-audio.js: -------------------------------------------------------------------------------- 1 | // eslint-disable-next-line @typescript-eslint/ban-ts-comment 2 | // @ts-nocheck - Typing will be fixed in the future 3 | 4 | export function muteAudio(mute) { 5 | document.querySelectorAll('audio, video').forEach((media) => { 6 | media.muted = mute; 7 | }); 8 | } 9 | -------------------------------------------------------------------------------- /injected/src/features/duckplayer/constants.js: -------------------------------------------------------------------------------- 1 | export const MSG_NAME_INITIAL_SETUP = 'initialSetup'; 2 | export const MSG_NAME_SET_VALUES = 'setUserValues'; 3 | export const MSG_NAME_READ_VALUES = 'getUserValues'; 4 | export const MSG_NAME_READ_VALUES_SERP = 'readUserValues'; 5 | export const MSG_NAME_OPEN_PLAYER = 'openDuckPlayer'; 6 | export const MSG_NAME_OPEN_INFO = 'openInfo'; 7 | export const MSG_NAME_PUSH_DATA = 'onUserValuesChanged'; 8 | export const MSG_NAME_PIXEL = 'sendDuckPlayerPixel'; 9 | export const MSG_NAME_PROXY_INCOMING = 'ddg-serp-yt'; 10 | export const MSG_NAME_PROXY_RESPONSE = 'ddg-serp-yt-response'; 11 | -------------------------------------------------------------------------------- /injected/src/features/performance-metrics.js: -------------------------------------------------------------------------------- 1 | import ContentFeature from '../content-feature'; 2 | import { getJsPerformanceMetrics } from './breakage-reporting/utils.js'; 3 | 4 | export default class PerformanceMetrics extends ContentFeature { 5 | init() { 6 | this.messaging.subscribe('getVitals', () => { 7 | const vitals = getJsPerformanceMetrics(); 8 | this.messaging.notify('vitalsResult', { vitals }); 9 | }); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /injected/src/features/referrer.js: -------------------------------------------------------------------------------- 1 | import ContentFeature from '../content-feature'; 2 | 3 | export default class Referrer extends ContentFeature { 4 | init() { 5 | // If the referer is a different host to the current one, trim it. 6 | if (document.referrer && new URL(document.URL).hostname !== new URL(document.referrer).hostname) { 7 | // trim referrer to origin. 8 | const trimmedReferer = new URL(document.referrer).origin + '/'; 9 | this.wrapProperty(Document.prototype, 'referrer', { 10 | get: () => trimmedReferer, 11 | }); 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/bg/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Научете повече", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Прочетете за тази защита на поверителността", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Споделяне на отзив", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/cs/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Více informací", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Přečti si o téhle ochraně soukromí", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Podělte se o zpětnou vazbu", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/da/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Mere info", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Læs om denne beskyttelse af privatlivet", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Del feedback", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/de/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Mehr erfahren", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Weitere Informationen über diesen Datenschutz", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Feedback teilen", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/el/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Μάθετε περισσότερα", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Διαβάστε σχετικά με την παρούσα προστασίας προσωπικών δεδομένων", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Κοινοποίηση σχολίου", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/en/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling": { 3 | "string_format" : "icu", 4 | "translate_paths": [{ 5 | "path": "*/title", 6 | "key": "{*}/title", 7 | "instruction": "*/note" 8 | }] 9 | }, 10 | "learnMore": { 11 | "title": "Learn More", 12 | "note": "Link to learn more about a given topic" 13 | }, 14 | "readAbout": { 15 | "title": "Read about this privacy protection", 16 | "note": "Alt text for learnMore link" 17 | }, 18 | "shareFeedback": { 19 | "title": "Share Feedback", 20 | "note": "Link to open Share Feedback form" 21 | } 22 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/es/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Más información", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Lee acerca de esta protección de privacidad", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Compartir opiniones", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/et/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Loe edasi", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Loe selle privaatsuskaitse kohta", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Jaga tagasisidet", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/fi/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Lue lisää", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Lue tästä yksityisyydensuojasta", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Jaa palaute", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/fr/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "En savoir plus", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "En savoir plus sur cette protection de la confidentialité", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Partagez vos commentaires", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/hr/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Saznajte više", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Pročitaj više o ovoj zaštiti privatnosti", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Podijeli povratne informacije", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/hu/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "További részletek", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Tudj meg többet erről az adatvédelemről", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Visszajelzés megosztása", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/it/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Ulteriori informazioni", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Leggi di più su questa protezione della privacy", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Condividi feedback", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/lt/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Sužinoti daugiau", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Skaitykite apie šią privatumo apsaugą", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Bendrinti atsiliepimą", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/lv/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Uzzināt vairāk", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Lasi par šo privātuma aizsardzību", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Kopīgot atsauksmi", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/nb/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Finn ut mer", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Les om denne personvernfunksjonen", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Del tilbakemelding", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/nl/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Meer informatie", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Lees meer over deze privacybescherming", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Feedback delen", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/pl/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Dowiedz się więcej", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Dowiedz się więcej o tej ochronie prywatności", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Podziel się opinią", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/pt/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Saiba mais", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Ler mais sobre esta proteção de privacidade", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Partilhar comentários", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/ro/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Află mai multe", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Citește despre această protecție a confidențialității", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Partajează feedback", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/ru/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Узнать больше", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Подробнее об этом виде защиты конфиденциальности", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Оставьте нам отзыв", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/sk/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Zistite viac", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Prečítajte si o tejto ochrane súkromia", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Zdieľať spätnú väzbu", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/sl/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Več", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Preberite več o tej zaščiti zasebnosti", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Deli povratne informacije", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/sv/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Läs mer", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Läs mer om detta integritetsskydd", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Berätta vad du tycker", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/locales/click-to-load/tr/shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling" : { 3 | "string_format" : "icu", 4 | "translate_paths" : [ 5 | { 6 | "path" : "*/title", 7 | "key" : "{*}/title", 8 | "instruction" : "*/note" 9 | }] 10 | }, 11 | "learnMore" : { 12 | "title" : "Daha Fazla Bilgi", 13 | "note" : "Link to learn more about a given topic" 14 | }, 15 | "readAbout" : { 16 | "title" : "Bu gizlilik koruması hakkında bilgi edinin", 17 | "note" : "Alt text for learnMore link" 18 | }, 19 | "shareFeedback" : { 20 | "title" : "Geri Bildirim Paylaş", 21 | "note" : "Link to open Share Feedback form" 22 | } 23 | } -------------------------------------------------------------------------------- /injected/src/type-utils.js: -------------------------------------------------------------------------------- 1 | import { toString as capturedToString } from './captured-globals.js'; 2 | 3 | /** 4 | * @param {unknown} input 5 | * @return {input is Object} 6 | */ 7 | export function isObject(input) { 8 | return capturedToString.call(input) === '[object Object]'; 9 | } 10 | 11 | /** 12 | * @param {unknown} input 13 | * @return {input is string} 14 | */ 15 | export function isString(input) { 16 | return typeof input === 'string'; 17 | } 18 | -------------------------------------------------------------------------------- /injected/unit-test/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "spec_dir": "unit-test", 3 | "spec_files": [ 4 | "**/*[sS]pec.?(m)js", 5 | "**/*.js", 6 | "!./fixtures/**/*" 7 | ], 8 | "jsLoader": "import", 9 | "helpers": [ 10 | "helpers/**/*.?(m)js" 11 | ], 12 | "stopSpecOnExpectationFailure": false, 13 | "random": true 14 | } 15 | -------------------------------------------------------------------------------- /injected/unit-test/fixtures/feature-includes.js: -------------------------------------------------------------------------------- 1 | import platformFeatures from 'ddg:platformFeatures'; 2 | console.log(platformFeatures); 3 | -------------------------------------------------------------------------------- /messaging/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@duckduckgo/messaging", 3 | "private": true, 4 | "version": "1.0.0", 5 | "description": "", 6 | "main": "index.js", 7 | "type": "module", 8 | "scripts": { 9 | "test": "echo '✅ Tests are within parent project, for now'" 10 | }, 11 | "author": "", 12 | "license": "ISC" 13 | } 14 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | ignore = "git log -1 --pretty=%B | grep dependabot" 3 | -------------------------------------------------------------------------------- /scripts/changelog.sh: -------------------------------------------------------------------------------- 1 | git log main --since "$(git show -s --format=%ci $(git rev-list --tags --max-count=1))" --pretty='format:- %s' 2 | -------------------------------------------------------------------------------- /scripts/check-for-changes.sh: -------------------------------------------------------------------------------- 1 | git update-index --refresh 2 | git diff-index --patch-with-raw HEAD -- 3 | git diff-index --quiet HEAD -- 4 | -------------------------------------------------------------------------------- /special-pages/.gitignore: -------------------------------------------------------------------------------- 1 | test-results 2 | playwright-report 3 | pages/**/public/dist 4 | /timestamp.json -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/.gitignore -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/app/components/Components.module.css: -------------------------------------------------------------------------------- 1 | .main { 2 | background-color: #000; 3 | color: white; 4 | max-width: 3840px; 5 | margin: 0 auto; 6 | padding: 2rem 8px; 7 | position: relative; 8 | z-index: 1; 9 | } 10 | 11 | .tube { 12 | max-width: 750px; 13 | margin: 0 auto; 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/app/components/FloatingBar.module.css: -------------------------------------------------------------------------------- 1 | .floatingBar { 2 | display: flex; 3 | gap: 8px; 4 | } 5 | 6 | .inset { 7 | border-radius: var(--outer-radius); 8 | padding: 8px; 9 | background: rgba(0, 0, 0, 0.3); 10 | } 11 | 12 | .topBar { 13 | display: grid; 14 | justify-content: center; 15 | width: 100%; 16 | } 17 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/app/components/FocusMode.module.css: -------------------------------------------------------------------------------- 1 | [data-focus-mode="on"] .fade { 2 | opacity: 0; 3 | visibility: hidden; 4 | } 5 | 6 | [data-focus-mode="on"] .slide { 7 | opacity: 0; 8 | visibility: hidden; 9 | transform: translateY(-100%); 10 | } 11 | 12 | .hideInFocus { 13 | opacity: 1; 14 | visibility: visible; 15 | top: 0; 16 | transition: all .3s; 17 | } 18 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/app/components/MobileButtons.module.css: -------------------------------------------------------------------------------- 1 | .buttons { 2 | display: grid; 3 | grid-template-columns: max-content max-content auto; 4 | grid-column-gap: 8px; 5 | } 6 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/app/components/PlayerContainer.module.css: -------------------------------------------------------------------------------- 1 | .container { 2 | border-radius: 14px; 3 | } 4 | 5 | .inset { 6 | padding: 8px; 7 | border-radius: var(--outer-radius); 8 | background: rgba(0, 0, 0, 0.3); 9 | transition: background 1s; 10 | } 11 | 12 | [data-focus-mode=on] .inset { 13 | background: none; 14 | } 15 | 16 | .internals { 17 | display: grid; 18 | overflow: hidden; 19 | } 20 | 21 | .insetInternals { 22 | gap: 8px; 23 | } 24 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/app/components/Wordmark.module.css: -------------------------------------------------------------------------------- 1 | .wordmark { 2 | display: flex; 3 | white-space: nowrap; 4 | align-items: center; 5 | gap: 8px; 6 | } 7 | .logo { 8 | width: 32px; 9 | height: 32px; 10 | } 11 | .img { 12 | display: block; 13 | width: 100%; 14 | } 15 | .text { 16 | font-size: 19px; 17 | font-weight: bold; 18 | } 19 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/app/features/app.js: -------------------------------------------------------------------------------- 1 | import { FocusMode } from '../components/FocusMode.jsx'; 2 | import { h } from 'preact'; 3 | 4 | /** 5 | * @param {import("../settings.js").Settings} settings 6 | */ 7 | export function createAppFeaturesFrom(settings) { 8 | return { 9 | focusMode: () => { 10 | if (settings.focusMode.state === 'enabled') { 11 | return ; 12 | } else { 13 | return null; 14 | } 15 | }, 16 | }; 17 | } 18 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/app/img/mobile-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/app/img/mobile-bg.jpg -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/app/img/player-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/app/img/player-bg.jpg -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/app/index.css: -------------------------------------------------------------------------------- 1 | @import url("base.css"); 2 | 3 | html:has(body[data-display="app"]) { 4 | height: 100%; 5 | margin: 0; 6 | padding: 0; 7 | overflow: hidden; 8 | } 9 | 10 | body[data-display="app"] { 11 | color: rgba(242, 242, 242, 1); 12 | background: #000; 13 | height: 100vh; 14 | overflow: hidden; 15 | padding: 16px; 16 | } 17 | 18 | @media screen and (min-width: 600px) and (max-height: 450px) { 19 | body[data-display="app"] { 20 | padding: 8px; 21 | } 22 | } 23 | 24 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/enabled-layout-android-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/enabled-layout-android-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/enabled-layout-android-landscape-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/enabled-layout-android-landscape-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/enabled-layout-ios-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/enabled-layout-ios-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/enabled-layout-macos-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/enabled-layout-macos-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/enabled-layout-windows-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/enabled-layout-windows-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/error-layout-android-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/error-layout-android-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/error-layout-android-landscape-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/error-layout-android-landscape-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/error-layout-ios-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/error-layout-ios-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/error-layout-macos-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/error-layout-macos-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/error-layout-windows-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/error-layout-windows-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/regular-layout-android-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/regular-layout-android-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/regular-layout-android-landscape-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/regular-layout-android-landscape-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/regular-layout-ios-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/regular-layout-ios-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/regular-layout-macos-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/regular-layout-macos-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/regular-layout-windows-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/regular-layout-windows-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/tooltip-macos-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/tooltip-macos-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/tooltip-windows-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/tooltip-windows-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-sign-in-required-android-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-sign-in-required-android-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-sign-in-required-android-landscape-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-sign-in-required-android-landscape-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-sign-in-required-ios-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-sign-in-required-ios-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-sign-in-required-macos-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-sign-in-required-macos-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-sign-in-required-windows-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-sign-in-required-windows-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-unknown-android-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-unknown-android-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-unknown-android-landscape-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-unknown-android-landscape-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-unknown-ios-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-unknown-ios-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-unknown-macos-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-unknown-macos-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-unknown-windows-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/duckplayer/integration-tests/duckplayer-screenshots.spec.js-snapshots/youtube-error-unknown-windows-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/messages/getUserValues.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/messages/getUserValues.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "userValues.shared.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/messages/initialSetup.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/messages/onUserValuesChanged.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "userValues.shared.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/messages/openInfo.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/messages/openSettings.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/messages/reportInitException.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["message"], 5 | "properties": { 6 | "message": { 7 | "type": "string" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/messages/reportPageException.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["message"], 5 | "properties": { 6 | "message": { 7 | "type": "string" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/messages/reportYouTubeError.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["error"], 5 | "properties": { 6 | "error": { "$ref": "youtubeError.shared.json"} 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/messages/setUserValues.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "userValues.shared.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/messages/setUserValues.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "userValues.shared.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/messages/youtubeError.shared.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "YouTubeError", 4 | "type": "string", 5 | "enum": ["age-restricted", "sign-in-required", "no-embed", "unknown"] 6 | } 7 | -------------------------------------------------------------------------------- /special-pages/pages/duckplayer/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Duck Player 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /special-pages/pages/errorpage/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/errorpage/.gitignore -------------------------------------------------------------------------------- /special-pages/pages/example/app/components/App.jsx: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import styles from './App.module.css'; 3 | import { useTypedTranslation } from '../types.js'; 4 | 5 | export function App() { 6 | const { t } = useTypedTranslation(); 7 | return
{t('helloWorld')}
; 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/example/app/components/App.module.css: -------------------------------------------------------------------------------- 1 | .main { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/example/app/components/Components.jsx: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import styles from './Components.module.css'; 3 | 4 | export function Components() { 5 | return
Component list here!
; 6 | } 7 | -------------------------------------------------------------------------------- /special-pages/pages/example/app/components/Components.module.css: -------------------------------------------------------------------------------- 1 | .main { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/example/app/types.js: -------------------------------------------------------------------------------- 1 | import { useContext } from 'preact/hooks'; 2 | import { TranslationContext } from '../../../shared/components/TranslationsProvider.js'; 3 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 4 | import json from '../public/locales/en/example.json'; 5 | 6 | /** 7 | * This is a wrapper to only allow keys from the default translation file 8 | * @type {() => { t: (key: keyof json, replacements?: Record) => string }} 9 | */ 10 | export function useTypedTranslation() { 11 | return { 12 | t: useContext(TranslationContext).t, 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/pages/example/messages/initialSetup.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/example/messages/initialSetup.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["locale", "env"], 5 | "properties": { 6 | "locale": { 7 | "type": "string" 8 | }, 9 | "env": { 10 | "type": "string", 11 | "enum": ["development", "production"] 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/pages/example/messages/reportInitException.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["message"], 5 | "properties": { 6 | "message": { 7 | "type": "string" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/example/messages/reportPageException.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["message"], 5 | "properties": { 6 | "message": { 7 | "type": "string" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/example/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Example 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /special-pages/pages/example/public/locales/en/example.json: -------------------------------------------------------------------------------- 1 | { 2 | "smartling": { 3 | "string_format": "icu", 4 | "translate_paths": [ 5 | { 6 | "path": "*/title", 7 | "key": "{*}/title", 8 | "instruction": "*/note" 9 | } 10 | ] 11 | }, 12 | "helloWorld": { 13 | "title": "Hello World", 14 | "note": "Note for translators" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /special-pages/pages/example/readme.md: -------------------------------------------------------------------------------- 1 | ### Integration 2 | 3 | Serve the entire folder found under `build//pages/example` 4 | 5 | -------------------------------------------------------------------------------- /special-pages/pages/history/app/components/Components.jsx: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import styles from './Components.module.css'; 3 | 4 | export function Components() { 5 | return
Component list here!
; 6 | } 7 | -------------------------------------------------------------------------------- /special-pages/pages/history/app/components/Components.module.css: -------------------------------------------------------------------------------- 1 | .main { 2 | 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/history/app/constants.js: -------------------------------------------------------------------------------- 1 | export const DDG_DEFAULT_ICON_SIZE = 32; 2 | export const OVERSCAN_AMOUNT = 5; 3 | export const BTN_ACTION_ENTRIES_MENU = 'entries_menu'; 4 | export const BTN_ACTION_DELETE_RANGE = 'deleteRange'; 5 | export const KNOWN_ACTIONS = /** @type {const} */ ([BTN_ACTION_ENTRIES_MENU, BTN_ACTION_DELETE_RANGE]); 6 | -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/full-empty-dark-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/full-empty-dark-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/full-empty-light-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/full-empty-light-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/full-short-dark-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/full-short-dark-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/full-short-light-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/full-short-light-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/header-delete-dark-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/header-delete-dark-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/header-delete-light-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/header-delete-light-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/header-idle-dark-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/header-idle-dark-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/header-idle-light-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/header-idle-light-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/header-search-dark-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/header-search-dark-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/header-search-light-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/header-search-light-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/main-hover-dark-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/main-hover-dark-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/main-hover-light-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/main-hover-light-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/main-select-dark-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/main-select-dark-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/main-select-hover-dark-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/main-select-hover-dark-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/main-select-hover-light-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/main-select-hover-light-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/main-select-light-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/main-select-light-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/sidebar-dark-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/sidebar-dark-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/sidebar-delete-dark-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/sidebar-delete-dark-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/sidebar-delete-light-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/sidebar-delete-light-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/sidebar-light-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/history/integration-tests/history.screenshots.spec.js-snapshots/sidebar-light-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/history/messages/deleteDomain.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "required": ["domain"], 4 | "title": "Delete Domain Params", 5 | "properties": { 6 | "domain": { 7 | "type": "string" 8 | } 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/deleteDomain.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["action"], 5 | "properties": { 6 | "action": { 7 | "$ref": "types/action-response.json" 8 | } 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/deleteRange.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "required": ["range"], 4 | "title": "Delete Range Params", 5 | "properties": { 6 | "range": { 7 | "$ref": "./types/range.json#/definitions/RangeId" 8 | } 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/deleteRange.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["action"], 5 | "properties": { 6 | "action": { 7 | "$ref": "types/action-response.json" 8 | } 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/deleteTerm.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "required": ["term"], 4 | "title": "Delete Term Params", 5 | "properties": { 6 | "term": { 7 | "type": "string" 8 | } 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/deleteTerm.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["action"], 5 | "properties": { 6 | "action": { 7 | "$ref": "types/action-response.json" 8 | } 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/entries_delete.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "title": "Entries Delete Params", 5 | "required": [ 6 | "ids" 7 | ], 8 | "properties": { 9 | "ids": { 10 | "type": "array", 11 | "items": { 12 | "type": "string" 13 | } 14 | } 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/entries_delete.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["action"], 5 | "properties": { 6 | "action": { 7 | "$ref": "types/action-response.json" 8 | } 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/entries_menu.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "title": "Entries Menu Params", 5 | "required": [ 6 | "ids" 7 | ], 8 | "properties": { 9 | "ids": { 10 | "type": "array", 11 | "items": { 12 | "type": "string" 13 | } 14 | } 15 | } 16 | } 17 | 18 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/entries_menu.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["action"], 5 | "properties": { 6 | "action": { 7 | "$ref": "types/action-response.json" 8 | } 9 | } 10 | } 11 | 12 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/getRanges.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | 5 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/getRanges.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["ranges"], 5 | "properties": { 6 | "ranges": { 7 | "type": "array", 8 | "items": { 9 | "$ref": "types/range.json" 10 | } 11 | } 12 | } 13 | } 14 | 15 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/initialSetup.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/open.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "History Open Action", 4 | "type": "object", 5 | "required": [ 6 | "target", 7 | "url" 8 | ], 9 | "properties": { 10 | "url": { 11 | "description": "The url to open", 12 | "type": "string" 13 | }, 14 | "target": { 15 | "$ref": "./types/open-target.json" 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/reportInitException.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["message"], 5 | "properties": { 6 | "message": { 7 | "type": "string" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/reportPageException.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["message"], 5 | "properties": { 6 | "message": { 7 | "type": "string" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/types/favicon.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Favicon", 4 | "oneOf": [ 5 | { 6 | "type": "null" 7 | }, 8 | { 9 | "type": "object", 10 | "required": ["src"], 11 | "properties": { 12 | "src": { 13 | "type": "string" 14 | }, 15 | "maxAvailableSize": { 16 | "type": "number" 17 | } 18 | } 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /special-pages/pages/history/messages/types/open-target.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Open Target", 4 | "type": "string", 5 | "enum": ["same-tab", "new-tab", "new-window"] 6 | } 7 | -------------------------------------------------------------------------------- /special-pages/pages/history/public/company-icons/fake.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /special-pages/pages/history/public/icons/clear-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /special-pages/pages/history/public/icons/clear.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /special-pages/pages/history/readme.md: -------------------------------------------------------------------------------- 1 | ### Integration 2 | 3 | Serve the entire folder found under `build//pages/history`w 4 | 5 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/activity/constants.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @module Privacy Stats Constants 3 | */ 4 | export const ACTION_ADD_FAVORITE = 'add-favorite'; 5 | export const ACTION_REMOVE_FAVORITE = 'remove-favorite'; 6 | export const ACTION_REMOVE = 'remove'; 7 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/burning/ActivityInteractionsContext.js: -------------------------------------------------------------------------------- 1 | import { createContext } from 'preact'; 2 | 3 | export const ActivityInteractionsContext = createContext({ 4 | /** 5 | * @type {(evt: MouseEvent) => void} _event 6 | */ 7 | didClick(_event) {}, 8 | }); 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/components/BackgroundReceiver.module.css: -------------------------------------------------------------------------------- 1 | .root { 2 | position: fixed; 3 | z-index: 0; 4 | inset: 0; 5 | width: 100vw; 6 | height: 100vh; 7 | object-fit: cover; 8 | pointer-events: none; 9 | 10 | &[data-state="loadingFirst"] { 11 | animation-name: fade-in; 12 | animation-fill-mode: both; 13 | animation-duration: .25s; 14 | animation-iteration-count: 1; 15 | } 16 | } 17 | 18 | @keyframes fade-in { 19 | from { 20 | opacity: 0; 21 | } 22 | to { 23 | opacity: 1; 24 | } 25 | } 26 | 27 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/components/Examples.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/app/components/Examples.js -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/components/Icons.module.css: -------------------------------------------------------------------------------- 1 | .chevronButton { 2 | transition: all .3s; 3 | .chevronCircle { 4 | fill: black; 5 | fill-opacity: 0.06; 6 | 7 | [data-theme=dark] & { 8 | fill: white; 9 | fill-opacity: 0.12; 10 | } 11 | } 12 | } 13 | 14 | .chevronArrow { 15 | [data-theme=dark] & { 16 | fill: white; 17 | fill-opacity: 0.5; 18 | } 19 | } 20 | 21 | 22 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/customizer/components/CustomizerDrawer.module.css: -------------------------------------------------------------------------------- 1 | .root {} 2 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/entry-points/activity.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This is a temporary fix to work around release problems in CI 3 | * It will be removed 4 | */ 5 | export function factory() {} 6 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/entry-points/favorites.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import { Centered } from '../components/Layout.js'; 3 | import { FavoritesCustomized } from '../favorites/components/FavoritesCustomized.js'; 4 | 5 | export function factory() { 6 | return ( 7 | 8 | 9 | 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/entry-points/freemiumPIRBanner.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import { Centered } from '../components/Layout.js'; 3 | import { FreemiumPIRBannerConsumer } from '../freemium-pir-banner/components/FreemiumPIRBanner.js'; 4 | import { FreemiumPIRBannerProvider } from '../freemium-pir-banner/FreemiumPIRBannerProvider.js'; 5 | 6 | export function factory() { 7 | return ( 8 | 9 | 10 | 11 | 12 | 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/entry-points/nextSteps.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import { Centered } from '../components/Layout.js'; 3 | import { NextStepsCustomized } from '../next-steps/NextSteps.js'; 4 | 5 | export function factory() { 6 | return ( 7 | 8 | 9 | 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/entry-points/privacyStats.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This is a temporary fix to work around release problems in CI 3 | * It will be removed 4 | */ 5 | export function factory() {} 6 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/entry-points/protections.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import { Centered } from '../components/Layout.js'; 3 | import { ProtectionsCustomized } from '../protections/components/ProtectionsCustomized.js'; 4 | 5 | export function factory() { 6 | return ( 7 | 8 | 9 | 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/entry-points/rmf.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import { Centered } from '../components/Layout.js'; 3 | import { RMFConsumer } from '../remote-messaging-framework/components/RemoteMessagingFramework.js'; 4 | import { RMFProvider } from '../remote-messaging-framework/RMFProvider.js'; 5 | 6 | export function factory() { 7 | return ( 8 | 9 | 10 | 11 | 12 | 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/entry-points/updateNotification.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import { UpdateNotificationConsumer } from '../update-notification/components/UpdateNotification.js'; 3 | import { UpdateNotificationProvider } from '../update-notification/UpdateNotificationProvider.js'; 4 | 5 | export function factory() { 6 | return ( 7 |
8 | 9 | 10 | 11 |
12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/favorites/constants.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @module New Tab Constants 3 | */ 4 | export const DDG_MIME_TYPE = 'application/vnd.duckduckgo.bookmark-by-id'; 5 | export const DDG_FALLBACK_ICON = './company-icons/other.svg'; 6 | export const DDG_FALLBACK_ICON_DARK = './company-icons/other-dark.svg'; 7 | export const DDG_DEFAULT_ICON_SIZE = 64; 8 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/privacy-stats/constants.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @module Privacy Stats Constants 3 | */ 4 | export const DDG_STATS_OTHER_COMPANY_IDENTIFIER = '__other__'; 5 | export const DDG_STATS_DEFAULT_ROWS = 5; 6 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/protections/integrations-tests/protections.screenshots.spec.js-snapshots/protections-activity-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/app/protections/integrations-tests/protections.screenshots.spec.js-snapshots/protections-activity-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/protections/integrations-tests/protections.screenshots.spec.js-snapshots/protections-stats-dark-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/app/protections/integrations-tests/protections.screenshots.spec.js-snapshots/protections-stats-dark-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/protections/integrations-tests/protections.screenshots.spec.js-snapshots/protections-stats-empty-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/app/protections/integrations-tests/protections.screenshots.spec.js-snapshots/protections-stats-empty-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/protections/integrations-tests/protections.screenshots.spec.js-snapshots/protections-stats-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/app/protections/integrations-tests/protections.screenshots.spec.js-snapshots/protections-stats-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/protections/mocks/protections.mocks.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @import { ProtectionsData } from "../../../types/new-tab"; 3 | * @type {Record} 4 | */ 5 | export const protectionsMocks = { 6 | empty: { 7 | totalCount: 0, 8 | }, 9 | few: { 10 | totalCount: 86, 11 | }, 12 | many: { 13 | totalCount: 1_000_020, 14 | }, 15 | }; 16 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/app/update-notification/strings.json: -------------------------------------------------------------------------------- 1 | { 2 | "updateNotification_updated_version": { 3 | "title": "Browser Updated to version {version}.", 4 | "note": "Text to indicate which new version was updated. `{version}` will be formatted like `1.22.0`" 5 | }, 6 | "updateNotification_whats_new": { 7 | "title": "See what's new in this release.", 8 | "note": "The `` tag represents a clickable link, please preserve it." 9 | }, 10 | "updateNotification_dismiss_btn": { 11 | "title": "Dismiss", 12 | "note": "Button label text for an action that removes the widget from the screen." 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/narrow-default-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/narrow-default-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/narrow-empty-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/narrow-empty-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/stats-few-dark-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/stats-few-dark-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/stats-few-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/stats-few-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/wide-default-drawer-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/wide-default-drawer-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/wide-default-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/wide-default-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/wide-empty-integration-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/integration-tests/new-tab.screenshots.spec.js-snapshots/wide-empty-integration-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_addFavorite.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["url"], 5 | "properties": { 6 | "url": { 7 | "description": "The History Entry url to be added to favorites", 8 | "type": "string" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_confirmBurn.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["url"], 5 | "title": "Confirm Burn Params", 6 | "properties": { 7 | "url": { 8 | "description": "The History Entry url that will be burned", 9 | "type": "string" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_confirmBurn.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["action"], 5 | "title": "Confirm Burn Response", 6 | "properties": { 7 | "action": { 8 | "type": "string", 9 | "enum": ["burn", "none"] 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_getData.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_getData.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/activity.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_getDataForUrls.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["urls"], 5 | "title": "Data For Urls Params", 6 | "properties": { 7 | "urls": { 8 | "type": "array", 9 | "items": { 10 | "type": "string" 11 | } 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_getDataForUrls.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/activity.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_getUrls.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_getUrls.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/url-info.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_onBurnComplete.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_onDataPatch.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/url-info.json" 6 | }, 7 | { 8 | "type": "object", 9 | "title": "Patch Data", 10 | "properties": { 11 | "patch": {"$ref": "./types/activity.json#/definitions/DomainActivity"} 12 | } 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_onDataUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/activity.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_open.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Activity Open Action", 4 | "type": "object", 5 | "required": [ 6 | "target", 7 | "url" 8 | ], 9 | "properties": { 10 | "url": { 11 | "description": "The url to open", 12 | "type": "string" 13 | }, 14 | "target": { 15 | "$ref": "./types/open-target.json" 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_removeFavorite.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["url"], 5 | "properties": { 6 | "url": { 7 | "description": "The History Entry url to be removed from favorites", 8 | "type": "string" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/activity_removeItem.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["url"], 5 | "properties": { 6 | "url": { 7 | "description": "The History Entry url to be removed", 8 | "type": "string" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/customizer_autoOpen.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/customizer_contextMenu.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "oneOf": [ 4 | { 5 | "type": "object", 6 | "title": "UserImageContextMenu", 7 | "required": ["id", "target"], 8 | "properties": { 9 | "id": { 10 | "type": "string" 11 | }, 12 | "target": { 13 | "type": "string", 14 | "const": "userImage" 15 | } 16 | } 17 | } 18 | ] 19 | } 20 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/customizer_deleteImage.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": [ 5 | "id" 6 | ], 7 | "properties": { 8 | "id": { 9 | "type": "string" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/customizer_onBackgroundUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/background-data.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/customizer_onColorUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/user-color-data.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/customizer_onImagesUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "./types/user-image-data.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/customizer_onThemeUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/theme-data.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/customizer_setBackground.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": [ 5 | "background" 6 | ], 7 | "properties": { 8 | "background": { 9 | "$ref": "./types/background.json#/definitions/background-variant" 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/customizer_setTheme.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["theme"], 5 | "properties": { 6 | "theme": { 7 | "$ref": "types/browser-theme.json" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/customizer_upload.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/examples/stats.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @type {import("../../types/new-tab.js").PrivacyStatsData} 3 | */ 4 | const privacyStatsData = { 5 | trackerCompanies: [ 6 | { displayName: 'Tracker Co. C', count: 91011 }, 7 | { displayName: 'Tracker Co. A', count: 1234 }, 8 | { displayName: '__other__', count: 89901 }, 9 | { displayName: 'Tracker Co. B', count: 5678 }, 10 | ], 11 | }; 12 | 13 | export {}; 14 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/favorites_add.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/favorites_getConfig.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/favorites_getConfig.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/favorites-config.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/favorites_getData.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/favorites_getData.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/favorites-data.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/favorites_move.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Favorites Move Action", 4 | "type": "object", 5 | "required": [ 6 | "id", 7 | "fromIndex", 8 | "targetIndex" 9 | ], 10 | "properties": { 11 | "id": { 12 | "description": "Entity ID", 13 | "type": "string" 14 | }, 15 | "targetIndex": { 16 | "description": "zero-indexed target", 17 | "type": "number" 18 | }, 19 | "fromIndex": { 20 | "description": "zero-indexed source", 21 | "type": "number" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/favorites_onConfigUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/favorites-config.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/favorites_onDataUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/favorites-data.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/favorites_open.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Favorites Open Action", 4 | "type": "object", 5 | "required": [ 6 | "id", 7 | "target", 8 | "url" 9 | ], 10 | "properties": { 11 | "id": { 12 | "description": "Entity ID", 13 | "type": "string" 14 | }, 15 | "url": { 16 | "description": "The url to open", 17 | "type": "string" 18 | }, 19 | "target": { 20 | "$ref": "./types/open-target.json" 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/favorites_openContextMenu.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Favorites Open Context Menu Action", 4 | "type": "object", 5 | "required": [ 6 | "id" 7 | ], 8 | "properties": { 9 | "id": { 10 | "description": "Entity ID", 11 | "type": "string" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/favorites_setConfig.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/favorites-config.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/freemiumPIRBanner_action.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Freemium PIR Banner Action", 4 | "type": "object", 5 | "required": ["id"], 6 | "properties": { 7 | "id": { 8 | "type": "string" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/freemiumPIRBanner_dismiss.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Freemium PIR Banner Dismiss Action", 4 | "type": "object", 5 | "required": [ 6 | "id" 7 | ], 8 | "properties": { 9 | "id": { 10 | "type": "string" 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/freemiumPIRBanner_getData.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/freemiumPIRBanner_getData.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/freemiumPIRBanner-message.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/freemiumPIRBanner_onDataUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/freemiumPIRBanner-message.json" 6 | } 7 | ] 8 | } -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/initialSetup.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/nextSteps_action.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": [ 5 | "id" 6 | ], 7 | "properties": { 8 | "id": { 9 | "type": "string" 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/nextSteps_dismiss.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": [ 5 | "id" 6 | ], 7 | "properties": { 8 | "id": { 9 | "type": "string" 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/nextSteps_getConfig.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/nextSteps_getConfig.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/next-steps-config.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/nextSteps_getData.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/nextSteps_getData.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/next-steps.json" 6 | } 7 | ] 8 | } -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/nextSteps_onConfigUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/next-steps-config.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/nextSteps_onDataUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/next-steps.json" 6 | } 7 | ] 8 | } -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/nextSteps_setConfig.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/next-steps-config.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/open.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Open Action", 4 | "type": "object", 5 | "required": ["target"], 6 | "properties": { 7 | "target": { 8 | "enum": [ 9 | "settings" 10 | ] 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/protections_getConfig.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/protections_getConfig.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/protections-config.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/protections_getData.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/protections_getData.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/protections-data.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/protections_onConfigUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/protections-config.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/protections_onDataUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/protections-data.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/protections_setConfig.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/protections-config.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/reportInitException.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["message"], 5 | "properties": { 6 | "message": { 7 | "type": "string" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/reportPageException.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["message"], 5 | "properties": { 6 | "message": { 7 | "type": "string" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/rmf_dismiss.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "RMF Dismiss Action", 4 | "type": "object", 5 | "required": [ 6 | "id" 7 | ], 8 | "properties": { 9 | "id": { 10 | "type": "string" 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/rmf_getData.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/rmf_getData.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/rmf-message.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/rmf_onDataUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/rmf-message.json" 6 | } 7 | ] 8 | } -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/rmf_primaryAction.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "RMF Primary Action", 4 | "type": "object", 5 | "required": ["id"], 6 | "properties": { 7 | "id": { 8 | "type": "string" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/rmf_secondaryAction.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "RMF Secondary Action", 4 | "type": "object", 5 | "required": [ 6 | "id" 7 | ], 8 | "properties": { 9 | "id": { 10 | "type": "string" 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/stats_getData.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/stats_getData.response.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/privacy-stats.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/stats_onDataUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/privacy-stats.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/stats_showLess.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/stats_showMore.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/activity-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Activity Config", 4 | "type": "object", 5 | "required": ["expansion"], 6 | "properties": { 7 | "expansion": {"$ref": "expansion.json"}, 8 | "animation": {"$ref": "animation.json"} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/background-data.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Background Data", 4 | "type": "object", 5 | "required": ["background"], 6 | "properties": { 7 | "background": { 8 | "$ref": "./background.json#/definitions/background-variant" 9 | } 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/browser-theme.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Browser Theme", 4 | "enum": [ 5 | "light", 6 | "dark", 7 | "system" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/expansion.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Expansion", 4 | "type": "string", 5 | "description": "Represents the expansion state of a widget", 6 | "enum": ["expanded", "collapsed"] 7 | } 8 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/favicon.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Favicon", 4 | "oneOf": [ 5 | { 6 | "type": "null" 7 | }, 8 | { 9 | "type": "object", 10 | "required": ["src"], 11 | "properties": { 12 | "src": { 13 | "type": "string" 14 | }, 15 | "maxAvailableSize": { 16 | "type": "number" 17 | } 18 | } 19 | } 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/favorites-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "FavoritesConfig", 4 | "type": "object", 5 | "required": ["expansion"], 6 | "properties": { 7 | "expansion": { "$ref": "expansion.json"}, 8 | "animation": { "$ref": "animation.json"} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/next-steps-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Next Steps Config", 4 | "type": "object", 5 | "required": [ 6 | "expansion" 7 | ], 8 | "properties": { 9 | "expansion": { 10 | "$ref": "expansion.json" 11 | }, 12 | "animation": { 13 | "$ref": "animation.json" 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/open-target.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Open Target", 4 | "type": "string", 5 | "enum": ["same-tab", "new-tab", "new-window"] 6 | } 7 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/protections-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Protections Config", 4 | "type": "object", 5 | "required": [ 6 | "expansion", 7 | "feed" 8 | ], 9 | "properties": { 10 | "expansion": { 11 | "$ref": "expansion.json" 12 | }, 13 | "feed": { 14 | "title": "Feed Type", 15 | "enum": [ 16 | "privacy-stats", 17 | "activity" 18 | ] 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/protections-data.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "Protections Data", 4 | "description": "", 5 | "type": "object", 6 | "required": [ 7 | "totalCount" 8 | ], 9 | "properties": { 10 | "totalCount": { 11 | "description": "Total number of trackers or ads blocked since install", 12 | "type": "number" 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/stats-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "StatsConfig", 4 | "type": "object", 5 | "required": ["expansion"], 6 | "properties": { 7 | "expansion": {"$ref": "expansion.json"}, 8 | "animation": {"$ref": "animation.json"} 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/theme-data.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": [ 5 | "theme" 6 | ], 7 | "properties": { 8 | "theme": { 9 | "$ref": "./browser-theme.json" 10 | }, 11 | "defaultStyles": { 12 | "oneOf": [ 13 | { 14 | "type": "null" 15 | }, 16 | { 17 | "$ref": "./default-styles.json" 18 | } 19 | ] 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/url-info.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["urls", "totalTrackersBlocked"], 5 | "properties": { 6 | "urls": { 7 | "type": "array", 8 | "items": { 9 | "type": "string" 10 | } 11 | }, 12 | "totalTrackersBlocked": { 13 | "type": "number" 14 | } 15 | } 16 | } -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/user-color-data.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "User Color Data", 4 | "type": "object", 5 | "required": [ 6 | "userColor" 7 | ], 8 | "properties": { 9 | "userColor": {"$ref": "#/definitions/userColor"} 10 | }, 11 | "definitions": { 12 | "userColor": { 13 | "oneOf": [ 14 | {"type": "null"}, 15 | {"$ref": "./background.json#/definitions/hex"} 16 | ] 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/user-image-data.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "User Image Data", 4 | "type": "object", 5 | "required": [ 6 | "userImages" 7 | ], 8 | "properties": { 9 | "userImages": { 10 | "type": "array", 11 | "items": { 12 | "$ref": "./user-image.json" 13 | } 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/user-image.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "title": "UserImage", 4 | "type": "object", 5 | "required": ["id", "colorScheme", "src", "thumb"], 6 | "properties": { 7 | "id": { 8 | "type": "string" 9 | }, 10 | "src": { 11 | "type": "string" 12 | }, 13 | "thumb": { 14 | "type": "string" 15 | }, 16 | "colorScheme": { 17 | "$ref": "./colors.json#/definitions/colorScheme" 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/types/widget-list.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "array", 4 | "title": "Widgets", 5 | "description": "An ordered list of supported Widgets. Use this to communicate what's supported", 6 | "items": { 7 | "type": "object", 8 | "required": ["id"], 9 | "title": "Widget List Item", 10 | "properties": { 11 | "id": { 12 | "type": "string", 13 | "description": "A unique identifier for the widget." 14 | } 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/updateNotification_dismiss.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/updateNotification_onDataUpdate.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/update-notification.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/widgets_onConfigUpdated.subscribe.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/widget-configs.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/messages/widgets_setConfig.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "allOf": [ 4 | { 5 | "$ref": "types/widget-configs.json" 6 | } 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/backgrounds/bg-01-thumb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/public/backgrounds/bg-01-thumb.jpg -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/backgrounds/bg-01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/public/backgrounds/bg-01.jpg -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/backgrounds/bg-02-thumb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/public/backgrounds/bg-02-thumb.jpg -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/backgrounds/bg-02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/public/backgrounds/bg-02.jpg -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/backgrounds/bg-03-thumb.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/public/backgrounds/bg-03-thumb.jpg -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/backgrounds/bg-03.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/public/backgrounds/bg-03.jpg -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/company-icons/automattic.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/gradients/grain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/public/gradients/grain.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/icons/ddg-favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/public/icons/ddg-favicon.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/icons/favicon@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/new-tab/public/icons/favicon@2x.png -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/a.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/b.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/c.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/d.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/e.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/f.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/g.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/h.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/i.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/j.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/k.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/l.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/m.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/n.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/o.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/p.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/q.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/r.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/t.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/u.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/v.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/w.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/x.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/y.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/public/letters/z.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/new-tab/src/inline.js: -------------------------------------------------------------------------------- 1 | // remove 2 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/.gitignore -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/animations/Onboarding.riv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/app/animations/Onboarding.riv -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/animations/import.riv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/app/animations/import.riv -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/animations/set_default.riv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/app/animations/set_default.riv -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/animations/taskbar_pinning.riv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/app/animations/taskbar_pinning.riv -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/components/Background.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import styles from './Background.module.css'; 3 | import cn from 'classnames'; 4 | 5 | export function Background() { 6 | return ( 7 |
8 |
9 |
10 |
11 |
12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/components/BeforeAfter.module.css: -------------------------------------------------------------------------------- 1 | .imgWrap { 2 | padding-bottom: 48%; 3 | height: 0; 4 | position: relative; 5 | } 6 | 7 | .imgWrap img, .imgWrap canvas, .media { 8 | border-radius: 8px; 9 | display: block; 10 | width: 100%; 11 | height: 100%; 12 | position: absolute; 13 | top: 0; 14 | left: 0; 15 | } 16 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/components/Content.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import styles from './Content.module.css'; 3 | 4 | export function Content({ children }) { 5 | return ( 6 |
7 |
{children}
8 |
9 | ); 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/components/Content.module.css: -------------------------------------------------------------------------------- 1 | .wrapper { 2 | display: flex; 3 | align-items: stretch; 4 | flex-direction: column; 5 | flex-grow: 1; 6 | width: 100%; 7 | 8 | @media only screen and (min-width: 481px) { 9 | display: flex; 10 | align-items: start; 11 | flex-direction: column; 12 | } 13 | } 14 | 15 | .indent { 16 | max-width: 400px; 17 | @media only screen and (min-width: 481px) { 18 | margin-left: 80px; 19 | max-width: 480px; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/components/Stack.module.css: -------------------------------------------------------------------------------- 1 | .stack { 2 | display: flex; 3 | flex-direction: column; 4 | gap: var(--sp-8); 5 | width: 100%; 6 | 7 | &[data-debug="true"] { 8 | > * { 9 | outline: 1px dotted black; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/components/v3/Background.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import styles from './Background.module.css'; 3 | import cn from 'classnames'; 4 | 5 | export function Background() { 6 | return ( 7 |
8 |
9 |
10 |
11 |
12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/components/v3/DuckPlayerStep.module.css: -------------------------------------------------------------------------------- 1 | .animationContainer { 2 | display: flex; 3 | height: 208px; 4 | justify-content: center; 5 | width: 100%; 6 | 7 | & canvas { 8 | border: 1px solid rgba(0, 0, 0, 0.06); 9 | } 10 | } -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/components/v3/Hiker.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | 3 | import styles from './Hiker.module.css'; 4 | 5 | export function Hiker() { 6 | return Image of hiker; 7 | } 8 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/components/v3/Hiker.module.css: -------------------------------------------------------------------------------- 1 | .hiker { 2 | bottom: 0; 3 | position: fixed; 4 | right: var(--sp-35); 5 | 6 | animation-name: hiker-appear; 7 | animation-duration: 500ms; 8 | animation-fill-mode: both; 9 | } 10 | 11 | @keyframes hiker-appear { 12 | from { 13 | transform: translateX(-300px) translateY(400px); 14 | } 15 | 16 | to { 17 | transform: translateX(0) translateY(0); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/components/v3/MakeDefaultStep.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import { ComparisonTable } from './ComparisonTable'; 3 | import { SlideIn } from './Animation'; 4 | 5 | export function MakeDefaultStep() { 6 | return ( 7 | 8 | 9 | 10 | ); 11 | } 12 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/pages/Fallback.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import { Stack } from '../components/Stack'; 3 | import { Content } from '../components/Content'; 4 | import { useTypedTranslation } from '../types'; 5 | 6 | export function Fallback() { 7 | const { t } = useTypedTranslation(); 8 | return ( 9 | 10 | 11 |

{t('somethingWentWrong')}

12 |
13 |
14 | ); 15 | } 16 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/app/styles/global.css: -------------------------------------------------------------------------------- 1 | @import url("variables.css"); 2 | @import url("base.css"); 3 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/integration.md: -------------------------------------------------------------------------------- 1 | ## Integration 2 | 3 | - Serve the entire folder found under `build//pages/onboarding` 4 | - Ensure that assets can be resolved, for example, `js/index.js` should resolve to `build//pages/onboarding/js/index.js` 5 | - Implement [message handlers](/classes/Onboarding_Page.OnboardingMessages.html) 6 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/background-dark-v3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/background-dark-v3.jpg -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/background-dark.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/background-dark.jpg -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/background-v3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/background-v3.jpg -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/background.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/background.jpg -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/grain-dark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/grain-dark.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/grain.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/grain.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/icons/check-24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/icons/cross-24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/icons/stop-24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/steps/bookmarks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/steps/bookmarks.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/steps/browsing.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/steps/browsing.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/steps/cookie.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/steps/cookie.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/steps/dock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/steps/dock.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/steps/duckplayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/steps/duckplayer.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/steps/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/steps/home.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/steps/import.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/steps/import.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/steps/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/steps/search.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/steps/session-restore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/steps/session-restore.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/steps/shield.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/steps/shield.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/steps/switch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/onboarding/public/assets/img/steps/switch.png -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/assets/img/steps/v3/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Welcome 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / 3 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/src/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @module Onboarding Page 3 | */ 4 | import '../app/index.js'; 5 | import '../../../shared/live-reload.js'; 6 | 7 | export * from '../app/messages.js'; 8 | -------------------------------------------------------------------------------- /special-pages/pages/onboarding/src/inline.js: -------------------------------------------------------------------------------- 1 | /** 2 | * This script is designed to be run before the application loads, use it to set values 3 | * that might be needed in CSS or JS 4 | */ 5 | 6 | document.documentElement.dataset.platform = import.meta.injectName; 7 | -------------------------------------------------------------------------------- /special-pages/pages/release-notes/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/release-notes/.gitignore -------------------------------------------------------------------------------- /special-pages/pages/release-notes/app/Components.module.css: -------------------------------------------------------------------------------- 1 | .main { 2 | display: grid; 3 | gap: var(--sp-10); 4 | padding: var(--sp-10); 5 | 6 | & hr { 7 | border: 0; 8 | border-bottom: 1px solid black; 9 | width: 100%; 10 | 11 | [data-theme=dark] & { 12 | border-bottom: 1px solid white; 13 | } 14 | } 15 | } 16 | 17 | .card { 18 | display: grid; 19 | width: 100%; 20 | gap: var(--sp-6); 21 | } 22 | -------------------------------------------------------------------------------- /special-pages/pages/release-notes/app/components/App.module.css: -------------------------------------------------------------------------------- 1 | :root { 2 | --sp-145: calc(580 * var(--px-in-rem)); 3 | /* 580px */ 4 | } 5 | 6 | body { 7 | color: var(--theme-text-primary-color); 8 | margin: var(--sp-6) 0 var(--sp-8); 9 | } 10 | 11 | .main { 12 | padding: var(--sp-6) var(--sp-5); 13 | position: relative; 14 | display: grid; 15 | gap: var(--sp-8); 16 | } 17 | 18 | .header { 19 | max-width: var(--sp-320); 20 | width: 100%; 21 | margin: 0 auto; 22 | } 23 | 24 | .core { 25 | width: 100%; 26 | max-width: var(--sp-145); 27 | margin: 0 auto; 28 | } 29 | -------------------------------------------------------------------------------- /special-pages/pages/release-notes/app/components/ErrorFallback.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import { useTypedTranslation } from '../types'; 3 | 4 | export function ErrorFallback() { 5 | const { t } = useTypedTranslation(); 6 | 7 | return

{t('somethingWentWrong')}

; 8 | } 9 | -------------------------------------------------------------------------------- /special-pages/pages/release-notes/messages/browserRestart.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "title": "BrowserRestart", 5 | "additionalProperties": false, 6 | "description": "Notifies browser that user has requested a restart" 7 | } 8 | -------------------------------------------------------------------------------- /special-pages/pages/release-notes/messages/initialSetup.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/release-notes/messages/reportInitException.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "title": "ReportInitException", 5 | "additionalProperties": false, 6 | "description": "Notifies browser of a page initialization exception", 7 | "properties": { 8 | "message": { 9 | "description": "Exception description", 10 | "type": "string" 11 | } 12 | }, 13 | "required": ["message"] 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/pages/release-notes/messages/reportPageException.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "title": "ReportPageException", 5 | "additionalProperties": false, 6 | "description": "Notifies browser of an in-page exception", 7 | "properties": { 8 | "message": { 9 | "description": "Exception description", 10 | "type": "string" 11 | } 12 | }, 13 | "required": ["message"] 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/pages/release-notes/messages/retryFetchReleaseNotes.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "title": "RetryFetchReleaseNotes", 5 | "additionalProperties": false, 6 | "description": "Notifies browser that user has requested to retry fetching release notes after failed attempt." 7 | } 8 | -------------------------------------------------------------------------------- /special-pages/pages/release-notes/messages/retryUpdate.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "title": "RetryUpdate", 5 | "additionalProperties": false, 6 | "description": "Notifies browser that user has requested to retry a failed update" 7 | } 8 | -------------------------------------------------------------------------------- /special-pages/pages/release-notes/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Browser Release Notes 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /special-pages/pages/release-notes/public/robots.txt: -------------------------------------------------------------------------------- 1 | User-agent: * 2 | Disallow: / 3 | -------------------------------------------------------------------------------- /special-pages/pages/release-notes/src/inline.js: -------------------------------------------------------------------------------- 1 | // Not used for Release notes, but cannot delete file or it'll break the build 2 | -------------------------------------------------------------------------------- /special-pages/pages/special-error/app/components/ErrorFallback.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | 3 | export function ErrorFallback() { 4 | return

Something went wrong

; 5 | } 6 | -------------------------------------------------------------------------------- /special-pages/pages/special-error/app/constants.js: -------------------------------------------------------------------------------- 1 | export const phishingMalwareHelpPageURL = 'https://duckduckgo.com/duckduckgo-help-pages/privacy/phishing-and-malware-protection'; 2 | export const reportSiteAsSafeFormURL = 'https://duckduckgo.com/malicious-site-protection/report-error'; 3 | -------------------------------------------------------------------------------- /special-pages/pages/special-error/app/types.js: -------------------------------------------------------------------------------- 1 | import { useContext } from 'preact/hooks'; 2 | import { TranslationContext } from '../../../shared/components/TranslationsProvider.js'; 3 | // eslint-disable-next-line @typescript-eslint/no-unused-vars 4 | import json from '../public/locales/en/special-error.json'; 5 | 6 | /** 7 | * This is a wrapper to only allow keys from the default translation file 8 | * @type {() => { t: (key: keyof json, replacements?: Record) => string }} 9 | */ 10 | export function useTypedTranslation() { 11 | return { 12 | t: useContext(TranslationContext).t, 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/malware-warning-ru-ios-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/malware-warning-ru-ios-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/malware-warning-ru-macos-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/malware-warning-ru-macos-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/malware-warning-ru-windows-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/malware-warning-ru-windows-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/phishing-warning-advanced-ios-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/phishing-warning-advanced-ios-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/phishing-warning-advanced-macos-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/phishing-warning-advanced-macos-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/phishing-warning-advanced-windows-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/phishing-warning-advanced-windows-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/scam-warning-advanced-ios-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/scam-warning-advanced-ios-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/scam-warning-advanced-macos-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/scam-warning-advanced-macos-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/scam-warning-advanced-windows-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/scam-warning-advanced-windows-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/ssl-expired-cert-ios-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/ssl-expired-cert-ios-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/ssl-expired-cert-macos-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/ssl-expired-cert-macos-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/ssl-expired-cert-reduced-motion-ios-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/ssl-expired-cert-reduced-motion-ios-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/ssl-expired-cert-reduced-motion-macos-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/ssl-expired-cert-reduced-motion-macos-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/ssl-expired-cert-reduced-motion-windows-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/ssl-expired-cert-reduced-motion-windows-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/ssl-expired-cert-windows-darwin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/duckduckgo/content-scope-scripts/f066d77b92c5e8c2aea16eadbcdf819793c4ca69/special-pages/pages/special-error/integration-tests/special-error-screenshots.spec.js-snapshots/ssl-expired-cert-windows-darwin.png -------------------------------------------------------------------------------- /special-pages/pages/special-error/messages/advancedInfo.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/special-error/messages/initialSetup.request.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/special-error/messages/leaveSite.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/special-error/messages/reportInitException.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["message"], 5 | "properties": { 6 | "message": { 7 | "type": "string" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/special-error/messages/reportPageException.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#", 3 | "type": "object", 4 | "required": ["message"], 5 | "properties": { 6 | "message": { 7 | "type": "string" 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/pages/special-error/messages/visitSite.notify.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "http://json-schema.org/draft-07/schema#" 3 | } 4 | -------------------------------------------------------------------------------- /special-pages/pages/special-error/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Error 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /special-pages/pages/special-error/readme.md: -------------------------------------------------------------------------------- 1 | ### Integration 2 | 3 | Serve the entire folder found under `build//pages/special-error` 4 | 5 | -------------------------------------------------------------------------------- /special-pages/shared/assets/img/icons/Check-Color-24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /special-pages/shared/assets/img/icons/Exclamation-Color-24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /special-pages/shared/assets/img/icons/Exclamation-High-Color-24.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /special-pages/shared/assets/img/icons/readme.md: -------------------------------------------------------------------------------- 1 | # Shared Icons 2 | 3 | All icons sourced from the DuckDuckGo Icons repository on GitHub unless specified otherwise. 4 | 5 | -------------------------------------------------------------------------------- /special-pages/shared/components/Card/Card.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import classNames from 'classnames'; 3 | import styles from './Card.module.css'; 4 | 5 | /** 6 | * @param {object} props 7 | * @param {string} [props.className] 8 | * @param {import("preact").ComponentChild} [props.children] 9 | */ 10 | export function Card({ className, children }) { 11 | return
{children}
; 12 | } 13 | -------------------------------------------------------------------------------- /special-pages/shared/components/Card/Card.module.css: -------------------------------------------------------------------------------- 1 | .card { 2 | background: var(--color-black-at-1); 3 | border: 1px solid var(--color-black-at-9); 4 | border-radius: var(--sp-3); 5 | padding: var(--sp-6) var(--sp-6) var(--sp-8); 6 | 7 | @media (prefers-color-scheme: dark) { 8 | background: var(--color-white-at-3); 9 | border-color: var(--color-white-at-9); 10 | } 11 | } -------------------------------------------------------------------------------- /special-pages/shared/components/DuckDuckGoLogo/DuckDuckGoLogo.js: -------------------------------------------------------------------------------- 1 | import { h } from 'preact'; 2 | import classNames from 'classnames'; 3 | import styles from './DuckDuckGoLogo.module.css'; 4 | 5 | /** 6 | * Renders a header component. 7 | */ 8 | export function DuckDuckGoLogo() { 9 | return ( 10 | 11 | DuckDuckGo 12 | 13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/shared/components/DuckDuckGoLogo/DuckDuckGoLogo.module.css: -------------------------------------------------------------------------------- 1 | /* Header */ 2 | .logo { 3 | background: url(../../assets/img/Logo-Horizontal.svg) no-repeat; 4 | height: var(--sp-10); 5 | display: block; 6 | 7 | @media (prefers-color-scheme: dark) { 8 | background: url(../../assets/img/Logo-Horizontal-Dark.svg) no-repeat; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /special-pages/shared/components/Fallback/Fallback.module.css: -------------------------------------------------------------------------------- 1 | .fallback { 2 | height: 100%; 3 | width: 100%; 4 | } 5 | -------------------------------------------------------------------------------- /special-pages/shared/handlers.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {MouseEvent|KeyboardEvent} event 3 | * @param {ImportMeta['platform']} platformName 4 | * @return {'new-tab' | 'new-window' | 'same-tab'} 5 | */ 6 | export function eventToTarget(event, platformName) { 7 | const isControlClick = platformName === 'macos' ? event.metaKey : event.ctrlKey; 8 | if (isControlClick || ('button' in event && event.button === 1) /* middle click */) { 9 | return 'new-tab'; 10 | } else if (event.shiftKey) { 11 | return 'new-window'; 12 | } 13 | return 'same-tab'; 14 | } 15 | -------------------------------------------------------------------------------- /special-pages/shared/styles/global.css: -------------------------------------------------------------------------------- 1 | @import url("variables.css"); 2 | @import url("reset.css"); 3 | @import url("utilities.css"); 4 | -------------------------------------------------------------------------------- /special-pages/shared/styles/utilities.css: -------------------------------------------------------------------------------- 1 | .offscreen { 2 | border: 0; 3 | clip: rect(0 0 0 0); 4 | height: 1px; 5 | margin: -1px; 6 | overflow: hidden; 7 | padding: 0; 8 | position: absolute; 9 | width: 1px; 10 | } -------------------------------------------------------------------------------- /types-generator/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "type": "module", 4 | "scripts": { 5 | "test-unit": "jasmine --config=unit-test/config.json" 6 | }, 7 | "devDependencies": { 8 | "json-schema-to-typescript": "^15.0.4", 9 | "jasmine": "^5.7.1", 10 | "@types/jasmine": "^5.1.8" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /types-generator/unit-test/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "spec_dir": "unit-test", 3 | "spec_files": [ 4 | "**/*[sS]pec.?(m)js", 5 | "**/*.js", 6 | "!./fixtures/**/*" 7 | ], 8 | "jsLoader": "import", 9 | "helpers": [ 10 | "helpers/**/*.?(m)js" 11 | ], 12 | "stopSpecOnExpectationFailure": false, 13 | "random": true 14 | } 15 | --------------------------------------------------------------------------------