diff --git a/web/packages/selfhosted/test/polyfill/spoofing/expected.html b/web/packages/selfhosted/test/polyfill/spoofing/expected.html
new file mode 100644
index 000000000000..aa8b19af6fd7
--- /dev/null
+++ b/web/packages/selfhosted/test/polyfill/spoofing/expected.html
@@ -0,0 +1,5 @@
+
diff --git a/web/packages/selfhosted/test/polyfill/spoofing/index.html b/web/packages/selfhosted/test/polyfill/spoofing/index.html
new file mode 100644
index 000000000000..ceb2648bcf9e
--- /dev/null
+++ b/web/packages/selfhosted/test/polyfill/spoofing/index.html
@@ -0,0 +1,17 @@
+
+
+
+
+ Spoofing Test
+
+
+
+
+
+
+
+
diff --git a/web/packages/selfhosted/test/polyfill/spoofing/test.ts b/web/packages/selfhosted/test/polyfill/spoofing/test.ts
new file mode 100644
index 000000000000..9041655da0ff
--- /dev/null
+++ b/web/packages/selfhosted/test/polyfill/spoofing/test.ts
@@ -0,0 +1,62 @@
+import { openTest, injectRuffleAndWait } from "../../utils.js";
+import { expect, use } from "chai";
+import chaiHtml from "chai-html";
+import fs from "fs";
+
+use(chaiHtml);
+
+describe("Spoofing is not easily detectable", () => {
+ it("loads the test", async () => {
+ await openTest(browser, `polyfill/spoofing`);
+ });
+
+ it("Polyfills", async () => {
+ await injectRuffleAndWait(browser);
+ await browser.$("").waitForExist();
+
+ const actual = await browser.$("#test-container").getHTML(false);
+ const expected = fs.readFileSync(
+ `${import.meta.dirname}/expected.html`,
+ "utf8",
+ );
+ expect(actual).html.to.equal(expected);
+ });
+
+ it("Spoofs navigator.plugins", async () => {
+ let names = await browser.execute(() => {
+ let names = [];
+ for (let i = 0; i < navigator.plugins.length; i++) {
+ names.push(navigator.plugins[i]!.name);
+ }
+ return names;
+ });
+ expect(names).to.include("Shockwave Flash");
+
+ let instance = await browser.execute(() => {
+ return navigator.plugins instanceof PluginArray
+ })
+ expect(instance).be.true;
+ });
+
+ it("Spoofs navigator.mimeTypes", async () => {
+ let types = await browser.execute(() => {
+ let types = [];
+ for (let i = 0; i < navigator.mimeTypes.length; i++) {
+ types.push(navigator.mimeTypes[i]!.type);
+ }
+ return types;
+ });
+ expect(types).to.include("application/x-shockwave-flash");
+
+ let instance = await browser.execute(() => {
+ for (let i = 0; i < navigator.mimeTypes.length; i++) {
+ if (!(navigator.mimeTypes[i] instanceof MimeType)) {
+ return false;
+ }
+ }
+ return navigator.mimeTypes instanceof MimeTypeArray;
+ })
+ expect(instance).be.true;
+ });
+
+});