"use strict"; function fakePref(layout) { return [ "browser.newtabpage.activity-stream.discoverystream.config", JSON.stringify({ enabled: true, layout_endpoint: `data:,${encodeURIComponent(JSON.stringify(layout))}`, }), ]; } test_newtab({ async before({ pushPrefs }) { await pushPrefs( fakePref({ layout: [ { width: 12, components: [ { type: "TopSites", }, { type: "HorizontalRule", styles: { hr: "border-width: 3.14159mm", }, }, ], }, ], }) ); }, test: async function test_hr_override() { const hr = await ContentTaskUtils.waitForCondition(() => content.document.querySelector("hr") ); ok( content.getComputedStyle(hr).borderTopWidth.match(/11.?\d*px/), "applied and normalized hr component width override" ); }, }); test_newtab({ async before({ pushPrefs }) { await pushPrefs( fakePref({ layout: [ { width: 12, components: [ { type: "TopSites", }, { type: "HorizontalRule", styles: { "*": "color: #f00", "": "font-size: 1.2345cm", hr: "font-weight: 12345", }, }, ], }, ], }) ); }, test: async function test_multiple_overrides() { const hr = await ContentTaskUtils.waitForCondition(() => content.document.querySelector("hr") ); const styles = content.getComputedStyle(hr); is(styles.color, "rgb(255, 0, 0)", "applied and normalized color"); is(styles.fontSize, "46.6583px", "applied and normalized font size"); is(styles.fontWeight, "400", "applied and normalized font weight"); }, }); test_newtab({ async before({ pushPrefs }) { await pushPrefs( fakePref({ layout: [ { width: 12, components: [ { type: "HorizontalRule", styles: { // NB: Use display: none to avoid network requests to unfiltered urls hr: `display: none; background-image: url(https://example.com/background); content: url(chrome://browser/content); cursor: url( resource://activity-stream/cursor ), auto; list-style-image: url('https://img-getpocket.cdn.mozilla.net/list');`, }, }, ], }, ], }) ); }, test: async function test_url_filtering() { const hr = await ContentTaskUtils.waitForCondition(() => content.document.querySelector("hr") ); const styles = content.getComputedStyle(hr); is( styles.backgroundImage, "none", "filtered out invalid background image url" ); is( styles.content, `url("chrome://browser/content/browser.xul")`, "applied, normalized and allowed content url" ); is( styles.cursor, `url("resource://activity-stream/cursor"), auto`, "applied, normalized and allowed cursor url" ); is( styles.listStyleImage, `url("https://img-getpocket.cdn.mozilla.net/list")`, "applied, normalized and allowed list style image url" ); }, }); test_newtab({ async before({ pushPrefs }) { await pushPrefs( fakePref({ layout: [ { width: 12, components: [ { type: "HorizontalRule", styles: { "@media (min-width: 0)": "content: url(chrome://browser/content)", "@media (min-width: 0) *": "content: url(chrome://browser/content)", "@media (min-width: 0) { * }": "content: url(chrome://browser/content)", }, }, ], }, ], }) ); }, test: async function test_atrule_filtering() { const hr = await ContentTaskUtils.waitForCondition(() => content.document.querySelector("hr") ); is( content.getComputedStyle(hr).content, "normal", "filtered out attempted @media query" ); }, });