Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 25 additions & 3 deletions app/composables/useAdvertisements.ts
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ export const popunderProviders = [
key: 'profiton',
label: 'Profiton',
id: 'https://pb.burnetsasgmt.com/rjrr1lrmhPVU/140809',
weight: 0.25
weight: 0.15
},
/**
* AdsTerra
Expand All @@ -83,8 +83,24 @@ export const popunderProviders = [
label: 'AdsTerra',
id: 'https://laughedentrust.com/gOEgecu/kAi41dXqVy9f-/APTn2mopi0EK/ZYuxzOlInL9/23jslU_6yYUKuVVn_v9j/va82rI/dw-xJW2djcqgC5mfF7/4gbSUwOzf/rEAE3_4f5WEdqc3rM/VfHINUDVV3EC',
weight: 0.15
},
/**
* Kadam
*/
{
key: 'kadam',
label: 'Kadam',
id: 'https://hdbtop.com/code/hneuyk427249',
noCrossorigin: true,
weight: 0.1
}
] as const satisfies readonly { key: string; label: string; id: string; weight: number }[]
] as const satisfies readonly {
key: string
label: string
id: string
noCrossorigin?: true
weight: number
}[]

export type PopunderProvider = (typeof popunderProviders)[number]
export type PopunderProviderKey = PopunderProvider['key']
Expand Down Expand Up @@ -208,6 +224,10 @@ export function selectRandomPopunderProviderScript() {
return randomWeightedChoice(popunderProviderChoices)
}

export function getPopunderProviderCrossorigin(provider: PopunderProvider) {
return 'noCrossorigin' in provider ? undefined : ('anonymous' as const)
}

export function selectRandomPushAdProviderScript() {
return randomWeightedChoice(pushAdProviderChoices)
}
Expand All @@ -226,6 +246,8 @@ export default function () {
pushScript.value = selectRandomPushAdProviderScript()
}

const popunderProvider = popunderProviders.find(({ id }) => id === popunderScript.value)

// Load selected ads
useHead({
script: [
Expand All @@ -235,7 +257,7 @@ export default function () {
defer: true,

// Fix for CORS issues - https://unhead.unjs.io/usage/composables/use-script#referrerpolicy-and-crossorigin
crossorigin: 'anonymous'
crossorigin: popunderProvider ? getPopunderProviderCrossorigin(popunderProvider) : 'anonymous'
},
{
src: pushScript.value,
Expand Down
41 changes: 24 additions & 17 deletions app/pages/__ad-debug/popunder.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<script setup lang="ts">
import {
getPopunderProviderByKey,
getPopunderProviderCrossorigin,
parsePopunderProviderMode,
popunderProviderModes,
popunderProviders,
Expand Down Expand Up @@ -51,6 +52,9 @@
const selectedScriptUrl = computed(() =>
providerMode.value === 'random' ? selectedRandomScript.value : selectedProvider.value.id
)
const armedProvider = computed(() =>
armed.value ? popunderProviders.find(({ id }) => id === armedScriptUrl.value) : undefined
)
const reportProviderMode = computed(() => (armed.value ? armedProviderMode.value : providerMode.value))
const reportProviderLabel = computed(() => (armed.value ? armedProviderLabel.value : selectedProviderLabel.value))
const reportScriptUrl = computed(() => (armed.value ? armedScriptUrl.value : selectedScriptUrl.value))
Expand All @@ -73,6 +77,26 @@
})
})

useHead(() => ({
script: armedProvider.value
? [
{
src: armedProvider.value.id,
defer: true,
crossorigin: getPopunderProviderCrossorigin(armedProvider.value),
onload: () => {
status.value = 'script-loaded'
addEvent('script-loaded', { url: armedProvider.value?.id })
},
onerror: () => {
status.value = 'script-error'
addEvent('script-error', { url: armedProvider.value?.id })
}
}
]
: []
}))

onMounted(() => {
clientMounted.value = true
})
Expand Down Expand Up @@ -176,22 +200,6 @@

onUnmounted(uninstallInstrumentation)

function injectAdScript(scriptUrl: string) {
const script = document.createElement('script')
script.src = scriptUrl
script.defer = true
script.crossOrigin = 'anonymous'
script.onload = () => {
status.value = 'script-loaded'
addEvent('script-loaded', { url: scriptUrl })
}
script.onerror = () => {
status.value = 'script-error'
addEvent('script-error', { url: scriptUrl })
}
document.head.append(script)
}

function armAds() {
if (armed.value) {
return
Expand All @@ -206,7 +214,6 @@
startedAtMs.value = performance.now()
installInstrumentation()
addEvent('armed', { label: armedProviderLabel.value, url: armedScriptUrl.value })
injectAdScript(armedScriptUrl.value)
}

function recordTestClick(label: string) {
Expand Down
8 changes: 8 additions & 0 deletions test/assets/popunder-provider-weights.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,14 @@ describe('popunder provider weights', () => {
const total = popunderProviders.reduce((sum, provider) => sum + provider.weight, 0)
expect(total).toBeCloseTo(1, 5)
})

it('includes the Kadam trial', () => {
expect(popunderProviders.find(({ key }) => key === 'kadam')).toMatchObject({
noCrossorigin: true,
weight: 0.1
})
expect(popunderProviders.find(({ key }) => key === 'profiton')).toMatchObject({ weight: 0.15 })
})
Comment thread
coderabbitai[bot] marked this conversation as resolved.
})

describe('push ad provider weights', () => {
Expand Down
32 changes: 31 additions & 1 deletion test/pages/popunder-debug.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import { readFileSync } from 'node:fs'
import { setup, url } from '@nuxt/test-utils'
import { describe, expect, it } from 'vitest'
import { defaultSetupConfig, useTrackedPageFactory } from '../helper'

const page = readFileSync(new URL('../../app/pages/__ad-debug/popunder.vue', import.meta.url), 'utf8')

describe('popunder debug page', () => {
describe('popunder debug page', async () => {
await setup(defaultSetupConfig)

const createTrackedPage = useTrackedPageFactory()

it('uses passive instrumentation and a same-origin post link', () => {
expect(page).not.toMatch(/window\.open\s*=/)
expect(page).not.toMatch(/window\.location\.(assign|replace)\s*=/)
Expand All @@ -13,4 +19,28 @@ describe('popunder debug page', () => {
expect(page).toContain('data-testid="click-test-target"')
expect(page).toContain('href="/posts/rule34.xxx?tags=rating%3Asafe"')
})

it('injects Kadam without crossorigin', async () => {
const browserPage = await createTrackedPage()
await browserPage.route('https://hdbtop.com/code/hneuyk427249', (route) =>
route.fulfill({
contentType: 'application/javascript',
body: `window.__kadamLoaded = true`
})
)
await browserPage.goto(url('/__ad-debug/popunder?provider=kadam'))
await browserPage.waitForFunction(
() => document.querySelector('[data-testid="debug-report"]')?.textContent?.trim().length
)

expect(await browserPage.getByTestId('selected-provider').textContent()).toBe('Kadam')
await browserPage.getByRole('button', { name: 'Arm ads' }).click()

await expect
.poll(() => browserPage.evaluate(() => (window as Window & { __kadamLoaded?: boolean }).__kadamLoaded))
.toBe(true)
const script = browserPage.locator('script[src="https://hdbtop.com/code/hneuyk427249"]')
expect(await script.count()).toBe(1)
expect(await script.getAttribute('crossorigin')).toBeNull()
})
})