Skip to content

Commit a4f35ad

Browse files
shakyShanegithub-actions[bot]
authored andcommitted
Release build 4.30.0 [ci release]
1 parent c8d6ff1 commit a4f35ad

File tree

12 files changed

+658
-0
lines changed

12 files changed

+658
-0
lines changed

Sources/ContentScopeScripts/dist/contentScope.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3063,6 +3063,9 @@
30633063
if (this.getFeatureSettingEnabled('safariObject')) {
30643064
this.safariObjectFix();
30653065
}
3066+
if (this.getFeatureSettingEnabled('messageHandlers')) {
3067+
this.messageHandlersFix();
3068+
}
30663069
}
30673070

30683071
/**
@@ -3152,6 +3155,48 @@
31523155
permissionsFix(settings);
31533156
}
31543157
}
3158+
3159+
/**
3160+
* Support for proxying `window.webkit.messageHandlers`
3161+
*/
3162+
messageHandlersFix () {
3163+
const settings = this.getFeatureSetting('messageHandlers');
3164+
3165+
// Do nothing if `messageHandlers` is absent
3166+
if (!globalThis.webkit?.messageHandlers) return
3167+
3168+
const proxy = new Proxy(globalThis.webkit.messageHandlers, {
3169+
get (target, messageName, receiver) {
3170+
const handlerName = String(messageName);
3171+
3172+
// handle known message names, such as DDG webkit messaging
3173+
if (settings.handlerStrategies.reflect.includes(handlerName)) {
3174+
return Reflect.get(target, messageName, receiver)
3175+
}
3176+
3177+
if (settings.handlerStrategies.undefined.includes(handlerName)) {
3178+
return undefined
3179+
}
3180+
3181+
if (settings.handlerStrategies.polyfill.includes('*') ||
3182+
settings.handlerStrategies.polyfill.includes(handlerName)
3183+
) {
3184+
return {
3185+
postMessage () {
3186+
return Promise.resolve({})
3187+
}
3188+
}
3189+
}
3190+
// if we get here, we couldn't handle the message handler name, so we opt for doing nothing.
3191+
// It's unlikely we'll ever reach here, since `["*"]' should be present
3192+
}
3193+
});
3194+
3195+
globalThis.webkit = {
3196+
...globalThis.webkit,
3197+
messageHandlers: proxy
3198+
};
3199+
}
31553200
}
31563201

31573202
function generateUniqueID () {

build/android/contentScope.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7099,6 +7099,9 @@
70997099
if (this.getFeatureSettingEnabled('safariObject')) {
71007100
this.safariObjectFix();
71017101
}
7102+
if (this.getFeatureSettingEnabled('messageHandlers')) {
7103+
this.messageHandlersFix();
7104+
}
71027105
}
71037106

71047107
/**
@@ -7188,6 +7191,48 @@
71887191
permissionsFix(settings);
71897192
}
71907193
}
7194+
7195+
/**
7196+
* Support for proxying `window.webkit.messageHandlers`
7197+
*/
7198+
messageHandlersFix () {
7199+
const settings = this.getFeatureSetting('messageHandlers');
7200+
7201+
// Do nothing if `messageHandlers` is absent
7202+
if (!globalThis.webkit?.messageHandlers) return
7203+
7204+
const proxy = new Proxy(globalThis.webkit.messageHandlers, {
7205+
get (target, messageName, receiver) {
7206+
const handlerName = String(messageName);
7207+
7208+
// handle known message names, such as DDG webkit messaging
7209+
if (settings.handlerStrategies.reflect.includes(handlerName)) {
7210+
return Reflect.get(target, messageName, receiver)
7211+
}
7212+
7213+
if (settings.handlerStrategies.undefined.includes(handlerName)) {
7214+
return undefined
7215+
}
7216+
7217+
if (settings.handlerStrategies.polyfill.includes('*') ||
7218+
settings.handlerStrategies.polyfill.includes(handlerName)
7219+
) {
7220+
return {
7221+
postMessage () {
7222+
return Promise.resolve({})
7223+
}
7224+
}
7225+
}
7226+
// if we get here, we couldn't handle the message handler name, so we opt for doing nothing.
7227+
// It's unlikely we'll ever reach here, since `["*"]' should be present
7228+
}
7229+
});
7230+
7231+
globalThis.webkit = {
7232+
...globalThis.webkit,
7233+
messageHandlers: proxy
7234+
};
7235+
}
71917236
}
71927237

71937238
const logoImg = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFQAAABUCAYAAAAcaxDBAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAABNTSURBVHgBzV0LcFPXmf6PJFt+gkEY8wrYMSEbgst7m02ywZnOZiEJCQlJC+QB25lNs7OzlEJ2ptmZLGayfUy3EEhmW5rM7gCZBtjJgzxmSTvTRSST9IF5pCE0TUosmmBjHIKNZFmWLN2e78hHPvfqXuleSdfONyNLV7q6uve7//uc85vRlwAda25oTFK8lZGn0UPaLI2okUhrTH/KGnU7M+olTevlL0KaeM3e01LaKa/PE2p64dgpGmMwGgN0rGqtS1Ve2cB/fhk/gVbSqI5KAU4wvxlBTdNe9VJ5sOnAb0I0yhg1QiWJTGN3E0gcHQRTpO0dTXJdJ7RjzZJWflHrGaNVdiTRN2kalTfOIU9VLfnqp5ruM9TTxR+dlIqGKX7uI7IDLrl7PFS2zW1iXSMURGqkbaUc0uiprqWqxa1UOXcxVcxdxAmcRoUApMZDH9HAmeMU+8NxQbYV3Ca25ITCwaRY4immcYk0AUgcv3wtJ3CxeLgBEBw++jpF249akusWsSUltGPNoq0aY5vMVLviusU04b5HbJMoVLo/ItRaBUyBp7rGtjTHuNSGj75BkbdeN/2ckdbWdODENioRSkIopFLThl4hpi0wflZzy0pO5D9aEiDsIFfXQagtf4CAXCqronzWHHFc3CQ/f53rZuGYl198zorYEKOyW0shrUUT2rFu8bc1jdqMUplLIkFi9NhRCvOLA4mp/jCVAjAn+N2qJa1UvXSZkGYjQOylfTu4OQjqPxAhl7atef+JnVQEiiK0Y+2ipzSNq7gCXFT9o1vFRRkB6evnFxJ5642SkWgF4fD4OUxYba4dEW4GLr/0bJY2FGsCCiIUMaVWEX6FDB4cF1D/T1uzJANE4uTxPBaoWbbSlNgcZiDIYsl7mg6d6iWHcEyolb0MPLyFxq1Yq9sXqg31ihx9nb4MsCK298VnxQ3XQaNTjJXd49SuOiJUkEmJIyRy7TSgWg2bf5xlK/sO76defpJuq7ZTgMy61Y9Q7bI7de/Dlndvf8xoAhw7K9uECjX3R46okomTm/rEbt0dh1TixIzqDeI9lSPZD/ZDWDT0uT2PXmqYSSvI7HryUT2pkNTB5K121d82oZ+sWQzJbJXbZmRa3GWBces2UuXX7qOKigryeDy6z0A+wqbosaDIdEYLZtdgSiq3qVcfOH6rnWPaIlQE7MTacp1ImHvuL/Ztz63iE+qpZtN2qp8z13IX6Siix4OjYi7gQCdy+6+aADNSecKys3l/+3fyHc+bb4d0nMl+KLfNyIS9vPTfPyAtEbc8jvjevz5F45r/inIBpqF6aSvV/M1twiTYLX4UCpwzYlIRw17TMnIOS5aJ8E5eE5e8Gza2TO17+nTXb3IdLyehaSeUOsBfVsj3pv77z6hsWmNmH5AJycwFQeb3nqfBqvHU399P4XBYPMfjcWK8DOXz+bK+I4mFCo2GGRh479dZpFbMbhGkSvBzvWHTvFkHd53+zNKe5lR5bjc7SPHoE7h3rOPZjwTU/POftlE+4ORS5ZVEly+OvDm1UTw0bldRsmtoaCC/32/6/SvQgDw3rVSY9GibTv2zfps7qasPHl9o9X1LCYXd5HxnKkbIyQPrt2Q+h325uOOxnGqeOQfsE+vXvxnhN7krROzd/6PUlJkU9nOJrK4mrzf7lPxcaiCt0IxE57msgkkpAQdZNf9G8tYFMr8Ns5PoDKV3YDRl47zp7OnTnUGz75tK6HC82SG3jXbTwhM6Q0U1sZvvFERVz77e1PtbwSptLBVwndN/+PNMxocb+OnGu0acJM/7mVa20Cw+Nb2CFCW2qtsIhFUndPml5wq/mAmTiT2yjep2HKKZ/7CF6r+ylKqqqmyTCdRwlcQNRmXfDeDaEP5JgFjUJzLghSDUfM2+m3UVkE4uthvkNvJz1aZAOgpNJbWv3U/jnnyeZi5bQRMmTHBEohFprfmZa6RC9eFwJcCDmg2igI5RCeP3sq7IKJ2BhzdnXosY0Zjz2gHUm0vltAe/TYFAoCgiVUByQGqhQyf5gBxftddwyiqGh3j056RuGKUTjqhoVR8mc8bf/r2wk6VGmtTdIpIoNWRxRwISCk4UtBqlVEeoUTpRaZcAkYWoOtQ8MG+xaaxZKuCmj1u+ltwArlmtS6icABjRVbczhNqRTqfQFvGM57avU21t6aXnvTOd9PKb79O+l9rpnfYOGn/7WlekFFDNnBxykcDweMeqBZnRigyhmAqjHsSY2xbkiLh0Tpw4MbMZiQ5yAo7T1h2/oG89/iL9aHeQLvQ4jynfaQ8JEqsry6lhUi2dPXeJdr/4vmtSCgnVSalqS+HxK30b5GZGD73E1mvyTcNdKEg6m3hsOeWqjKqDuMf+43VOQA09vHoJNTcGqKbKL0h2ipuWNIqHEaloC115c78rRRUM3UhO8Cyyv+HfYZqG2TBiLEpIaDqQHynNVfHCwMhJhrMHtOzguqUi85GAet52y7W0/Ym7aP7caYJMQD6XAnBQmDjhBhAuqh7foA2tUu0FoVnqrngyjE4WdMeb5upy83uXt3DJdGdigwpjJb5UAJn9nAuJSsMIhVR7QejwBC4BqLsaLPcXIp0Az7vLy8szm1Pq3XEYRoh5US45J3UwT6q9BFf7VjynCfWMqDvGtVUUVDrjhWRx8BIF8FaQTk46OGxD7TEBwg1gQoaq9jrzwkjYSU/H/UsXqJMUVGcEz1aIumt1k/OSibDnP3cfoZ/se7cgTw/8ZN+vRdjUzb+/ekUL/fJouhjtFqFylouETu05h/BFnqQv1ah+ya+czKBL1XKQsIV7/F+89VFGygrx9t09V8RzJBrnEnpEhFOAf9a15BZUTjBjUEWSkq0ebj914+uq/SxmYkIqlbL87J3joczrmqp0Ovpue4icAtGCBGJRue1WwQRQJdRYQ2CkNfpI0+bLqqhRVYod4gWpZqof6R8pSr/85u/F880mcWU+IJ6Fs4NkNs8KZKIIT1UNuQWjTwGpsr6B9QE+D6M6GdAbp9Cod8MJWO9FzL+0JHT1innC/kmAlBsLIBRAbIuHCjte3sMVo2o2FyLuP+N8ZCbyAdmCsTgEIZTv8ZHhRp8mVlukRdQ4Pl0wBqLiCYNwZkWRe5d/RQT0cEwNnMx7V7RQKWE26068P0xi7fXc/l2l/8wuoQC4kVzpfwsqz1gdDYuoOqc9FY1QwcD4USxKiUTCchczySoVZGjjG8clqIGTN4M7qsnZJErEPiVHwPA2pSPDrHUAPquFBEXnw5zUoaEhKhpJfh69PEMZ5BoT78q/L394+H6z/oVLj42sNsWDi543yRFyDBI2ulek5KOEA5OnU8EY4Pb7Uz58Gy4s0rBLZtdBrsJ9VDK4R+jlnsIl9NIbRKE2chNQc0hmKckE3CP0Qkh4eTgmNafPi3ina2RCIsOnecHnT87tpl1wQrVQ1npKoqILDKzjA+HrBgYGnBHamb/2CmLiF7Pf940f/jyW3gfSl+DJ1BB/xP6cfi4FrKIIjNfrJBQr1Ea+VGRwzFUenn5w0OFxon/M+XHPYWchjhvAsh4JlTMuQb08rmchua16r5IMzXZ1UCwWc/adpHW4BiLHmkxAF6/rskkW8nC1PCc3jVMHiya185xwTI6cU611ETrp8N64AWN6rg+htD5O6IiEGrMjY23UMTrOiCfYUdsIWFfcx/PTKZ9MYwqjkKnpOefyFCc0FVJ3UEkttmoDxyR+NJ5/hl4GkNDASsuPpz/Mk5QVY0esWi82ajQv3Z3yeSkV1JRZjQNnTvBxmfRd8BdbqEUKygP8ft9sMQXHNq7azE+EO6eoeXGm5vr0A148zn3f4MW0V0+ZlFSRfiLILxufjgJkwA+v7zRDAlROsopHzBPyNR04Ffpk7eJemYKiBioHuuT4TFFpKFf7IT6+ZFV5MoWXhyXXvcBvxrPcsVnPpfINk4SCh2MUsOQN4ZIqoQNqKY+HTGjRIa5QS1FQvq8OGZdkfIYH+ACmgDvGtEeIWl7LaQIKQR/n4dIRcgzjWixdAV4jMSSaFhkPy4yPwmupO9beUtzFsDPHxLMjO6qinJufxq1pYhvbKOUp7AbDHIBI5O5fHEkH/06hrl+F/VT9Da/WH8KzCOw9/qE9WsybmUCKzgjyblRhVe/zRag97GhvD7ejPmd21AhO7BAfVTn/X9sxeCMKw3BM/vqRDEkFCEOWBBuLrMoss3ICaCtWOEuEs6YmpYL4Kwht2nOqt2PN4qCcPYKJ+hOGFyfgQDW33CneKxgfHKOhm253ZkdNgAmw8sYiF3crHzcDpFNNOdEtYgQsCF+EV5mrSzH2aua1Qe2rTZZqO0IxdlSBKOyOEdRpjMYmCYxSe+XrDKFQe9FkahjqFL5i+4MUbUfHGMapnWFl7VIaaXUHMoRC7bmnykip8S4Yp0M7grSjRUqom8PDuZBr4jGPvvZIdQd0Bo0XSvao2+o0RpPp0M4AO+o0rzfAqo+TEVE/o8MLy+hHd1fQQHlxXUDyTzxO6ro/6AhtOtAe5D8flNvG6dCB9ZsLr5MO5/XFSGmlDbMTvN5H2+73c0J99FmAie1CASKdSCdg4nKZjnHVlsLLFar6Mq93XM5TYMxUVFyqZfTMCj+9/NUynVT+9pq864MtYVyfpS5gSCOZ1Zsk69d2ne4MbWqZhuk5YtkwCqh+brvkglks1Ut378ozAmnEUEJMwk1yUurq9AOtF/o76YVP/ofe7v5/ev/ySUqk+LCJ10/Vvuzi9Nnuk/Re8iy9P8tLA34PNfSlhBTubS2n7rps+QC5X/04RZVxjZwg3R5pRHgw4bbvtT2Z7bR0ntxr/J7F0sQFjRrznpT5PSTjqmde0y3VO//dBxxPhtBu30DE49GpU6dSZWVl5v21h2+niC87cbi69hq6a+b91DJxIb392a/of//8PEWTepMBovq9Gnm81vHtA28nOKn2bbedpZiMkk1GdQdMzwI7ahrbJbdBYM9PR6QbxDZs+bFzezpsR41qf2HA/MZ8Ev6Ydn7wfXrglytp95mdWWQCkMBYbIA0zVoCv6ix75hwTcZ+AMb1Wbzuuc2MTPF9skDzgfY2fhsyDU5RNFGX6qFoEnhoMzmBtKNqwRnqXiwY81Aibj1LxQmhgYe2GMh81rgCJiS4sUDOPJBpyXvUYB+NBlSvj0YoaC9kG4hHOamQUDndcUr1NF7tym/ftBzTI7EkPJkjHBuwOeiKa6lR5uijAILliRlgFTIlc/YeyUmoUP2UpvNkxiYt6NXkiNTO9BCWGj5VeXOPjKLrg1bE53ZiUWPfKeOKZCCXqkvkrVQ0HzyxU2Oks6dGA40TwfJnOzaV/SGdhqpqP6V6ak4bCAlM8LTVah9I+1AiwR/mUjoxYn3sdGu5tiwys5q4cDKb97fn7Ytnq/TTvP/4JjXgN/tBqP/0H/w8/0hpV0iM10ej0cxbC+qXWpIhfo+rM8iMRvqFrcQjPhinAX6MSDhMc88O0sLzTLy+0ttHUS79g7FBcUyQXTFobi7kEvGaPB1xUE3KZTdV2I56Ny1peJWSnuX85RRspxeEHRXdY6Rkym4yObvZIB6dM5+0unqxOrmsrIy+iH1O73QeobLyMt2uIDHGJXmiN0Dfv/lp6rzyKSUScQqU1dOc2rnU0j+RVh3ppjs/9tEN5710z4c+uraH0cRwWmL7tDhFEjF6sJ1R3aBe7TGii4Y0+RthsVNscGjFrg8v2MpIHLZq4/EpeXWt2nBCaNVmLFzkamOh3XgH0R3rafz48aLoHEmE6Y5DN9G4upFKMSQQZK6evY6+Oe+fqaYs25zgpp3/7jpyAtx0ZHvGPn1wtt07HjMW0kNwQvnspgpHedmu0xd6N83jkso8raRIavhXL4lbo+baINhKWhk88l//HSWTSUEqsqKTF39H3dEu7q2TQpUDvkn0vZt20arZ3xCfm558XcBR1obsZ8rjT5v26et55t/0DWkgmSy5wgmZ4tqoAHRsWFBHMe8rmqHdpZO2ktoTe7jeVdGMGTPEZLKPL39IG498U5zQfXMepK9f+5CpVBoByep68ls597FqDisTluy1rCzIYkOj0+5Sxdk1S9qYoU2EVfdDQG3Dlly2WqSh6D2CBwDVt0OiEecfX5c1Rg7VxtBNtaFXiARI7Nm9LWusjJvtXc0Hj2+iAlF0y+Cz31i0iXnYVuPUcozBoF+JmdcXDu2zEEXG1YsYEk2wioHsbgYSy2fO4TdzZXpw0WTaoWVzWNEy2F5olAslamqd7awkrMxAKSGXDMp/KGCGdAOa58wbKQh7yVXcob00Q0kIlTAzARIgtparoFu9662Qs10xpJIXgezGmHZQUkKBYWlt4y/Xm30OSUWDA0ygcLPnEqbJXDls3d2BW5pDpCW/Uwqp1B2XXEI+YgHZigNeGJOwCiUY6hw7c0KQCGeTe1IGwzDPNgz3kAtwjVAJO8SqQFkQzgVk+yZZ/HOVz7sEacbpMJYQveq4RBLb6xaRIz81SgCxSfK0esmzXqN09wP3waWRpV6lgdSeQmLKgn6RxgAZcpnnbkFuCf9BFR8KD3K/f3Q0SdSfwpcAHevQVSLVmNLYAg+j+SBYLOrlNQ0TskP4k15swUIp0s5hFvZY/YcvI/4CeAZjCToTSnsAAAAASUVORK5CYII=';

build/contentScope.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11439,6 +11439,9 @@
1143911439
if (this.getFeatureSettingEnabled('safariObject')) {
1144011440
this.safariObjectFix();
1144111441
}
11442+
if (this.getFeatureSettingEnabled('messageHandlers')) {
11443+
this.messageHandlersFix();
11444+
}
1144211445
}
1144311446

1144411447
/**
@@ -11528,6 +11531,48 @@
1152811531
permissionsFix(settings);
1152911532
}
1153011533
}
11534+
11535+
/**
11536+
* Support for proxying `window.webkit.messageHandlers`
11537+
*/
11538+
messageHandlersFix () {
11539+
const settings = this.getFeatureSetting('messageHandlers');
11540+
11541+
// Do nothing if `messageHandlers` is absent
11542+
if (!globalThis.webkit?.messageHandlers) return
11543+
11544+
const proxy = new Proxy(globalThis.webkit.messageHandlers, {
11545+
get (target, messageName, receiver) {
11546+
const handlerName = String(messageName);
11547+
11548+
// handle known message names, such as DDG webkit messaging
11549+
if (settings.handlerStrategies.reflect.includes(handlerName)) {
11550+
return Reflect.get(target, messageName, receiver)
11551+
}
11552+
11553+
if (settings.handlerStrategies.undefined.includes(handlerName)) {
11554+
return undefined
11555+
}
11556+
11557+
if (settings.handlerStrategies.polyfill.includes('*') ||
11558+
settings.handlerStrategies.polyfill.includes(handlerName)
11559+
) {
11560+
return {
11561+
postMessage () {
11562+
return Promise.resolve({})
11563+
}
11564+
}
11565+
}
11566+
// if we get here, we couldn't handle the message handler name, so we opt for doing nothing.
11567+
// It's unlikely we'll ever reach here, since `["*"]' should be present
11568+
}
11569+
});
11570+
11571+
globalThis.webkit = {
11572+
...globalThis.webkit,
11573+
messageHandlers: proxy
11574+
};
11575+
}
1153111576
}
1153211577

1153311578
const MSG_NAME_SET_VALUES = 'setUserValues';

build/integration/contentScope.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11439,6 +11439,9 @@
1143911439
if (this.getFeatureSettingEnabled('safariObject')) {
1144011440
this.safariObjectFix();
1144111441
}
11442+
if (this.getFeatureSettingEnabled('messageHandlers')) {
11443+
this.messageHandlersFix();
11444+
}
1144211445
}
1144311446

1144411447
/**
@@ -11528,6 +11531,48 @@
1152811531
permissionsFix(settings);
1152911532
}
1153011533
}
11534+
11535+
/**
11536+
* Support for proxying `window.webkit.messageHandlers`
11537+
*/
11538+
messageHandlersFix () {
11539+
const settings = this.getFeatureSetting('messageHandlers');
11540+
11541+
// Do nothing if `messageHandlers` is absent
11542+
if (!globalThis.webkit?.messageHandlers) return
11543+
11544+
const proxy = new Proxy(globalThis.webkit.messageHandlers, {
11545+
get (target, messageName, receiver) {
11546+
const handlerName = String(messageName);
11547+
11548+
// handle known message names, such as DDG webkit messaging
11549+
if (settings.handlerStrategies.reflect.includes(handlerName)) {
11550+
return Reflect.get(target, messageName, receiver)
11551+
}
11552+
11553+
if (settings.handlerStrategies.undefined.includes(handlerName)) {
11554+
return undefined
11555+
}
11556+
11557+
if (settings.handlerStrategies.polyfill.includes('*') ||
11558+
settings.handlerStrategies.polyfill.includes(handlerName)
11559+
) {
11560+
return {
11561+
postMessage () {
11562+
return Promise.resolve({})
11563+
}
11564+
}
11565+
}
11566+
// if we get here, we couldn't handle the message handler name, so we opt for doing nothing.
11567+
// It's unlikely we'll ever reach here, since `["*"]' should be present
11568+
}
11569+
});
11570+
11571+
globalThis.webkit = {
11572+
...globalThis.webkit,
11573+
messageHandlers: proxy
11574+
};
11575+
}
1153111576
}
1153211577

1153311578
const MSG_NAME_SET_VALUES = 'setUserValues';

integration-test/playwright/type-helpers.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ export class Build {
5858
get artifact () {
5959
const path = this.switch({
6060
windows: () => 'build/windows/contentScope.js',
61+
'apple': () => './Sources/ContentScopeScripts/dist/contentScope.js',
6162
'apple-isolated': () => './Sources/ContentScopeScripts/dist/contentScopeIsolated.js'
6263
})
6364
return readFileSync(path, 'utf8')
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import { test, expect } from '@playwright/test'
2+
import { readFileSync } from 'fs'
3+
import {
4+
mockWebkitMessaging,
5+
wrapWebkitScripts
6+
} from '@duckduckgo/messaging/lib/test-utils.mjs'
7+
import { perPlatform } from './type-helpers.mjs'
8+
9+
test('web compat', async ({ page }, testInfo) => {
10+
const webcompat = WebcompatSpec.create(page, testInfo)
11+
await webcompat.enabled()
12+
const results = await webcompat.collectResults()
13+
expect(results).toMatchObject({
14+
'webkit.messageHandlers - polyfill prevents throw': [{
15+
name: 'Error not thrown polyfil',
16+
result: true,
17+
expected: true
18+
}],
19+
'webkit.messageHandlers - undefined should throw': [{
20+
name: 'undefined handler should throw',
21+
result: true,
22+
expected: true
23+
}],
24+
'webkit.messageHandlers - reflected message': [{
25+
name: 'reflected message should pass through',
26+
result: 'test',
27+
expected: 'test'
28+
}]
29+
})
30+
})
31+
32+
export class WebcompatSpec {
33+
htmlPage = '/webcompat/index.html'
34+
config = './integration-test/test-pages/webcompat/config/message-handlers.json'
35+
36+
/**
37+
* @param {import('@playwright/test').Page} page
38+
* @param {import('./type-helpers.mjs').Build} build
39+
* @param {import('./type-helpers.mjs').PlatformInfo} platform
40+
*/
41+
constructor (page, build, platform) {
42+
this.page = page
43+
this.build = build
44+
this.platform = platform
45+
page.on('console', (msg) => {
46+
console.log(msg.type(), msg.text())
47+
})
48+
}
49+
50+
async enabled () {
51+
const config = JSON.parse(readFileSync(this.config, 'utf8'))
52+
await this.setup({ config })
53+
await this.page.goto(this.htmlPage)
54+
}
55+
56+
collectResults () {
57+
return this.page.evaluate(() => {
58+
return new Promise(resolve => {
59+
// @ts-expect-error - this is added by the test framework
60+
if (window.results) return resolve(window.results)
61+
window.addEventListener('results-ready', () => {
62+
// @ts-expect-error - this is added by the test framework
63+
resolve(window.results)
64+
})
65+
})
66+
})
67+
}
68+
69+
/**
70+
* @param {object} params
71+
* @param {Record<string, any>} params.config
72+
* @return {Promise<void>}
73+
*/
74+
async setup (params) {
75+
const { config } = params
76+
77+
// read the built file from disk and do replacements
78+
const injectedJS = wrapWebkitScripts(this.build.artifact, {
79+
$CONTENT_SCOPE$: config,
80+
$USER_UNPROTECTED_DOMAINS$: [],
81+
$USER_PREFERENCES$: {
82+
platform: { name: 'windows' },
83+
debug: true
84+
}
85+
})
86+
87+
await this.page.addInitScript(mockWebkitMessaging, {
88+
messagingContext: {
89+
env: 'development',
90+
context: 'contentScopeScripts',
91+
featureName: 'n/a'
92+
},
93+
responses: {}
94+
})
95+
96+
// attach the JS
97+
await this.page.addInitScript(injectedJS)
98+
}
99+
100+
/**
101+
* Helper for creating an instance per platform
102+
* @param {import('@playwright/test').Page} page
103+
* @param {import('@playwright/test').TestInfo} testInfo
104+
*/
105+
static create (page, testInfo) {
106+
// Read the configuration object to determine which platform we're testing against
107+
const {
108+
platformInfo,
109+
build
110+
} = perPlatform(testInfo.project.use)
111+
return new WebcompatSpec(page, build, platformInfo)
112+
}
113+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
{
2+
"unprotectedTemporary": [],
3+
"features": {
4+
"webCompat": {
5+
"exceptions": [],
6+
"state": "enabled",
7+
"settings": {
8+
"windowSizing": "enabled",
9+
"navigatorCredentials": "enabled",
10+
"safariObject": "enabled",
11+
"messageHandlers": {
12+
"state": "disabled",
13+
"handlerStrategies": {
14+
"reflect": ["trackerDetectedMessage", "printHandler", "specialPages"],
15+
"polyfill": ["*"],
16+
"undefined": ["jsHandler"]
17+
}
18+
},
19+
"domains": [
20+
{
21+
"domain": "localhost",
22+
"patchSettings": [
23+
{
24+
"op": "replace",
25+
"path": "/messageHandlers/state",
26+
"value": "enabled"
27+
}
28+
]
29+
}
30+
]
31+
}
32+
}
33+
}
34+
}

0 commit comments

Comments
 (0)