diff --git a/packages/lint/src/rules/media.test.ts b/packages/lint/src/rules/media.test.ts
index 1d621e8a51..ec14b9d421 100644
--- a/packages/lint/src/rules/media.test.ts
+++ b/packages/lint/src/rules/media.test.ts
@@ -379,6 +379,62 @@ describe("media rules", () => {
expect(finding).toBeUndefined();
});
+ it("warns on raw src mutations targeting existing video and audio", async () => {
+ const html = `
+
+
+
+`;
+
+ const result = await lintHyperframeHtml(html);
+ const findings = result.findings.filter(
+ (finding) => finding.code === "media_runtime_src_mutation",
+ );
+ expect(findings).toHaveLength(2);
+ expect(findings.map((finding) => finding.elementId).sort()).toEqual(["clip", "voice"]);
+ expect(findings.every((finding) => finding.fixHint?.includes("data-var-src"))).toBe(true);
+ });
+
+ it("does not flag img or script src mutations", async () => {
+ const html = `
+
+
+

+
+
+`;
+
+ const result = await lintHyperframeHtml(html);
+ expect(
+ result.findings.find((finding) => finding.code === "media_runtime_src_mutation"),
+ ).toBeUndefined();
+ });
+
+ it("warns when a source child of existing media is mutated", async () => {
+ const html = `
+
+
+
+
+
+`;
+
+ const result = await lintHyperframeHtml(html);
+ expect(
+ result.findings.find((finding) => finding.code === "media_runtime_src_mutation"),
+ ).toMatchObject({ severity: "warning", elementId: "clip" });
+ });
+
it("does not flag