summaryrefslogtreecommitdiffstats
path: root/browser/components/enterprisepolicies/content
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/enterprisepolicies/content')
-rw-r--r--browser/components/enterprisepolicies/content/aboutPolicies.css170
-rw-r--r--browser/components/enterprisepolicies/content/aboutPolicies.html95
-rw-r--r--browser/components/enterprisepolicies/content/aboutPolicies.js430
-rw-r--r--browser/components/enterprisepolicies/content/policies-active.svg6
-rw-r--r--browser/components/enterprisepolicies/content/policies-documentation.svg6
-rw-r--r--browser/components/enterprisepolicies/content/policies-error.svg6
6 files changed, 713 insertions, 0 deletions
diff --git a/browser/components/enterprisepolicies/content/aboutPolicies.css b/browser/components/enterprisepolicies/content/aboutPolicies.css
new file mode 100644
index 0000000000..e84ae785ee
--- /dev/null
+++ b/browser/components/enterprisepolicies/content/aboutPolicies.css
@@ -0,0 +1,170 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+@import url("chrome://global/skin/in-content/common.css");
+
+@media not print {
+ html, body {
+ height: 100%;
+ }
+}
+
+body {
+ display: flex;
+ align-items: stretch;
+}
+
+#sectionTitle {
+ float: inline-start;
+ padding-inline-start: 1rem;
+}
+
+/** Categories **/
+
+.category {
+ cursor: pointer;
+ /* Center category names */
+ display: flex;
+ align-items: center;
+}
+
+.category .category-name {
+ pointer-events: none;
+}
+
+#category-active {
+ background-image: url("chrome://browser/content/policies/policies-active.svg");
+}
+
+#category-documentation {
+ background-image: url("chrome://browser/content/policies/policies-documentation.svg");
+}
+
+#category-errors {
+ background-image: url("chrome://browser/content/policies/policies-error.svg");
+}
+
+/** Content area **/
+
+.main-content {
+ flex: 1;
+ scroll-padding: 25px;
+}
+
+.tab {
+ padding: 0.5em 0;
+}
+
+.tab table {
+ width: 100%;
+}
+
+tbody tr {
+ transition: background cubic-bezier(.07, .95, 0, 1) 250ms;
+}
+
+tbody tr:hover {
+ background-color: var(--in-content-item-hover);
+ color: var(--in-content-item-hover-text);
+}
+
+th, td, table {
+ border-collapse: collapse;
+ border: none;
+ text-align: start;
+}
+
+th {
+ padding: 1rem;
+ font-size: larger;
+}
+
+td {
+ padding: 1rem;
+}
+
+/*
+ * In Documentation Tab, this property sets the policies row in an
+ * alternate color scheme of white and grey as each policy comprises
+ * of two tbody tags, one for the description and the other for the
+ * collapsible information block.
+ */
+
+.active-policies tr.odd:not(:hover),
+.errors tr:nth-child(odd):not(:hover),
+tbody:nth-child(4n + 1) {
+ background-color: var(--in-content-box-background-odd);
+}
+
+.arr_sep.odd:not(:last-child) td:not(:first-child) {
+ border-bottom: 2px solid #f9f9fa;
+}
+
+.arr_sep.even:not(:last-child) td:not(:first-child) {
+ border-bottom: 2px solid #ededf0;
+}
+
+.last_row:not(:last-child) td {
+ border-bottom: 2px solid #d7d7db !important;
+}
+
+.icon {
+ background-position: center center;
+ background-repeat: no-repeat;
+ background-size: 16px;
+ -moz-context-properties: fill;
+ display: inline-block;
+ fill: var(--newtab-icon-primary-color);
+ height: 14px;
+ vertical-align: middle;
+ width: 14px;
+ margin-top: -.125rem;
+ margin-left: .5rem;
+}
+
+.collapsible {
+ cursor: pointer;
+ border: none;
+ outline: none;
+}
+
+.content {
+ display: none;
+}
+
+.content-style {
+ background-color: var(--in-content-box-background);
+ color: var(--blue-50);
+}
+
+tbody.collapsible td {
+ padding-bottom: 1rem;
+}
+
+.schema {
+ font-family: monospace;
+ white-space: pre;
+ direction: ltr;
+}
+
+/*
+ * The Active tab has two messages: one for when the policy service
+ * is inactive and another for when the there are no specified
+ * policies. The three classes below control which message to display
+ * or to show the policy table.
+ */
+.no-specified-policies > table,
+.inactive-service > table {
+ display: none;
+}
+
+:not(.no-specified-policies) > .no-specified-policies-message,
+:not(.inactive-service) > .inactive-service-message {
+ display: none;
+}
+
+.no-specified-policies-message,
+.inactive-service-message {
+ padding: 1rem;
+}
diff --git a/browser/components/enterprisepolicies/content/aboutPolicies.html b/browser/components/enterprisepolicies/content/aboutPolicies.html
new file mode 100644
index 0000000000..624d4f24be
--- /dev/null
+++ b/browser/components/enterprisepolicies/content/aboutPolicies.html
@@ -0,0 +1,95 @@
+<!--
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+-->
+<!DOCTYPE html>
+
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <meta
+ http-equiv="Content-Security-Policy"
+ content="default-src chrome:; object-src 'none'"
+ />
+ <meta name="color-scheme" content="light dark" />
+ <title data-l10n-id="about-policies-title"></title>
+ <link
+ rel="stylesheet"
+ href="chrome://browser/content/policies/aboutPolicies.css"
+ />
+ <link rel="localization" href="branding/brand.ftl" />
+ <link rel="localization" href="browser/aboutPolicies.ftl" />
+ <link
+ rel="localization"
+ href="browser/policies/policies-descriptions.ftl"
+ />
+ <link rel="localization" href="toolkit/branding/accounts.ftl" />
+ <link rel="localization" href="toolkit/branding/brandings.ftl" />
+ <script src="chrome://browser/content/policies/aboutPolicies.js"></script>
+ </head>
+ <body id="body">
+ <div id="categories">
+ <div class="category" selected="true" id="category-active" tabindex="0">
+ <label class="category-name" data-l10n-id="active-policies-tab"></label>
+ </div>
+ <div class="category" id="category-documentation" tabindex="0">
+ <label class="category-name" data-l10n-id="documentation-tab"></label>
+ </div>
+ <div class="category" id="category-errors" tabindex="0">
+ <label class="category-name" data-l10n-id="errors-tab"></label>
+ </div>
+ </div>
+ <div class="main-content">
+ <div class="header">
+ <div
+ id="sectionTitle"
+ class="header-name"
+ data-l10n-id="active-policies-tab"
+ ></div>
+ </div>
+
+ <div id="active" class="tab active">
+ <h3
+ class="inactive-service-message"
+ data-l10n-id="inactive-message"
+ ></h3>
+ <h3
+ class="no-specified-policies-message"
+ data-l10n-id="no-specified-policies-message"
+ ></h3>
+ <table>
+ <thead>
+ <tr>
+ <th data-l10n-id="policy-name"></th>
+ <th data-l10n-id="policy-value"></th>
+ </tr>
+ </thead>
+ <tbody id="activeContent"></tbody>
+ </table>
+ </div>
+
+ <div id="documentation" class="tab" hidden="true">
+ <table>
+ <thead>
+ <tr>
+ <th data-l10n-id="policy-name"></th>
+ </tr>
+ </thead>
+ <tbody id="documentationContent"></tbody>
+ </table>
+ </div>
+
+ <div id="errors" class="tab" hidden="true">
+ <table>
+ <thead>
+ <tr>
+ <th data-l10n-id="policy-errors"></th>
+ </tr>
+ </thead>
+ <tbody id="errorsContent"></tbody>
+ </table>
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/browser/components/enterprisepolicies/content/aboutPolicies.js b/browser/components/enterprisepolicies/content/aboutPolicies.js
new file mode 100644
index 0000000000..e2c90167c4
--- /dev/null
+++ b/browser/components/enterprisepolicies/content/aboutPolicies.js
@@ -0,0 +1,430 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+const { XPCOMUtils } = ChromeUtils.importESModule(
+ "resource://gre/modules/XPCOMUtils.sys.mjs"
+);
+
+ChromeUtils.defineESModuleGetters(this, {
+ schema: "resource:///modules/policies/schema.sys.mjs",
+});
+
+function col(text, className) {
+ let column = document.createElement("td");
+ if (className) {
+ column.classList.add(className);
+ }
+ let content = document.createTextNode(text);
+ column.appendChild(content);
+ return column;
+}
+
+function link(text) {
+ let column = document.createElement("td");
+ let a = document.createElement("a");
+ a.href = "https://mozilla.github.io/policy-templates/#" + text.toLowerCase();
+ a.target = "_blank";
+ let content = document.createTextNode(text);
+ a.appendChild(content);
+ column.appendChild(a);
+ return column;
+}
+
+function addMissingColumns() {
+ const table = document.getElementById("activeContent");
+ let maxColumns = 0;
+
+ // count the number of columns per row and set the max number of columns
+ for (let i = 0, length = table.rows.length; i < length; i++) {
+ if (maxColumns < table.rows[i].cells.length) {
+ maxColumns = table.rows[i].cells.length;
+ }
+ }
+
+ // add the missing columns
+ for (let i = 0, length = table.rows.length; i < length; i++) {
+ const rowLength = table.rows[i].cells.length;
+
+ if (rowLength < maxColumns) {
+ let missingColumns = maxColumns - rowLength;
+
+ while (missingColumns > 0) {
+ table.rows[i].insertCell();
+ missingColumns--;
+ }
+ }
+ }
+}
+
+/*
+ * This function generates the Active Policies content to be displayed by calling
+ * a recursive function called generatePolicy() according to the policy schema.
+ */
+
+function generateActivePolicies(data) {
+ let new_cont = document.getElementById("activeContent");
+ new_cont.classList.add("active-policies");
+
+ let policy_count = 0;
+
+ for (let policyName in data) {
+ const color_class = ++policy_count % 2 === 0 ? "even" : "odd";
+
+ if (schema.properties[policyName].type == "array") {
+ for (let count in data[policyName]) {
+ let isFirstRow = count == 0;
+ let isLastRow = count == data[policyName].length - 1;
+ let row = document.createElement("tr");
+ row.classList.add(color_class);
+ row.appendChild(col(isFirstRow ? policyName : ""));
+ generatePolicy(
+ data[policyName][count],
+ row,
+ 1,
+ new_cont,
+ isLastRow,
+ data[policyName].length > 1
+ );
+ }
+ } else if (schema.properties[policyName].type == "object") {
+ let count = 0;
+ for (let obj in data[policyName]) {
+ let isFirstRow = count == 0;
+ let isLastRow = count == Object.keys(data[policyName]).length - 1;
+ let row = document.createElement("tr");
+ row.classList.add(color_class);
+ row.appendChild(col(isFirstRow ? policyName : ""));
+ row.appendChild(col(obj));
+ generatePolicy(
+ data[policyName][obj],
+ row,
+ 2,
+ new_cont,
+ isLastRow,
+ true
+ );
+ count++;
+ }
+ } else {
+ let row = document.createElement("tr");
+ row.appendChild(col(policyName));
+ row.appendChild(col(JSON.stringify(data[policyName])));
+ row.classList.add(color_class, "last_row");
+ new_cont.appendChild(row);
+ }
+ }
+
+ if (policy_count < 1) {
+ let current_tab = document.querySelector(".active");
+ if (Services.policies.status == Services.policies.ACTIVE) {
+ current_tab.classList.add("no-specified-policies");
+ } else {
+ current_tab.classList.add("inactive-service");
+ }
+ }
+
+ addMissingColumns();
+}
+
+/*
+ * This is a helper recursive function that iterates levels of each
+ * policy and formats the content to be displayed accordingly.
+ */
+
+function generatePolicy(data, row, depth, new_cont, islast, arr_sep = false) {
+ const color_class = row.classList.contains("odd") ? "odd" : "even";
+
+ if (Array.isArray(data)) {
+ for (let count in data) {
+ if (count == 0) {
+ if (count == data.length - 1) {
+ generatePolicy(
+ data[count],
+ row,
+ depth + 1,
+ new_cont,
+ islast ? islast : false,
+ true
+ );
+ } else {
+ generatePolicy(data[count], row, depth + 1, new_cont, false, false);
+ }
+ } else if (count == data.length - 1) {
+ let last_row = document.createElement("tr");
+ last_row.classList.add(color_class, "arr_sep");
+
+ for (let i = 0; i < depth; i++) {
+ last_row.appendChild(col(""));
+ }
+
+ generatePolicy(
+ data[count],
+ last_row,
+ depth + 1,
+ new_cont,
+ islast ? islast : false,
+ arr_sep
+ );
+ } else {
+ let new_row = document.createElement("tr");
+ new_row.classList.add(color_class);
+
+ for (let i = 0; i < depth; i++) {
+ new_row.appendChild(col(""));
+ }
+
+ generatePolicy(data[count], new_row, depth + 1, new_cont, false, false);
+ }
+ }
+ } else if (typeof data == "object" && Object.keys(data).length) {
+ let count = 0;
+ for (let obj in data) {
+ if (count == 0) {
+ row.appendChild(col(obj));
+ if (count == Object.keys(data).length - 1) {
+ generatePolicy(
+ data[obj],
+ row,
+ depth + 1,
+ new_cont,
+ islast ? islast : false,
+ arr_sep
+ );
+ } else {
+ generatePolicy(data[obj], row, depth + 1, new_cont, false, false);
+ }
+ } else if (count == Object.keys(data).length - 1) {
+ let last_row = document.createElement("tr");
+ for (let i = 0; i < depth; i++) {
+ last_row.appendChild(col(""));
+ }
+
+ last_row.appendChild(col(obj));
+ last_row.classList.add(color_class);
+
+ if (arr_sep) {
+ last_row.classList.add("arr_sep");
+ }
+
+ generatePolicy(
+ data[obj],
+ last_row,
+ depth + 1,
+ new_cont,
+ islast ? islast : false,
+ false
+ );
+ } else {
+ let new_row = document.createElement("tr");
+ new_row.classList.add(color_class);
+
+ for (let i = 0; i < depth; i++) {
+ new_row.appendChild(col(""));
+ }
+
+ new_row.appendChild(col(obj));
+ generatePolicy(data[obj], new_row, depth + 1, new_cont, false, false);
+ }
+ count++;
+ }
+ } else {
+ row.appendChild(col(JSON.stringify(data)));
+
+ if (arr_sep) {
+ row.classList.add("arr_sep");
+ }
+ if (islast) {
+ row.classList.add("last_row");
+ }
+ new_cont.appendChild(row);
+ }
+}
+
+function generateErrors() {
+ const consoleStorage = Cc["@mozilla.org/consoleAPI-storage;1"];
+ const storage = consoleStorage.getService(Ci.nsIConsoleAPIStorage);
+ const consoleEvents = storage.getEvents();
+ const prefixes = [
+ "Enterprise Policies",
+ "JsonSchemaValidator.jsm",
+ "Policies.jsm",
+ "GPOParser.jsm",
+ "Enterprise Policies Child",
+ "BookmarksPolicies.jsm",
+ "ProxyPolicies.jsm",
+ "WebsiteFilter Policy",
+ "macOSPoliciesParser.jsm",
+ ];
+
+ let new_cont = document.getElementById("errorsContent");
+ new_cont.classList.add("errors");
+
+ let flag = false;
+ for (let err of consoleEvents) {
+ if (prefixes.includes(err.prefix)) {
+ flag = true;
+ let row = document.createElement("tr");
+ row.appendChild(col(err.arguments[0]));
+ new_cont.appendChild(row);
+ }
+ }
+ if (!flag) {
+ let errors_tab = document.getElementById("category-errors");
+ errors_tab.style.display = "none";
+ }
+}
+
+function generateDocumentation() {
+ let new_cont = document.getElementById("documentationContent");
+ new_cont.setAttribute("id", "documentationContent");
+
+ // map specific policies to a different string ID, to allow updates to
+ // existing descriptions
+ let string_mapping = {
+ BackgroundAppUpdate: "BackgroundAppUpdate2",
+ Certificates: "CertificatesDescription",
+ DisableMasterPasswordCreation: "DisablePrimaryPasswordCreation",
+ DisablePocket: "DisablePocket2",
+ DisableSetDesktopBackground: "DisableSetAsDesktopBackground",
+ FirefoxHome: "FirefoxHome2",
+ Permissions: "Permissions2",
+ SanitizeOnShutdown: "SanitizeOnShutdown2",
+ WindowsSSO: "Windows10SSO",
+ SecurityDevices: "SecurityDevices2",
+ };
+
+ for (let policyName in schema.properties) {
+ let main_tbody = document.createElement("tbody");
+ main_tbody.classList.add("collapsible");
+ main_tbody.addEventListener("click", function () {
+ let content = this.nextElementSibling;
+ content.classList.toggle("content");
+ });
+ let row = document.createElement("tr");
+ row.appendChild(link(policyName));
+ let descriptionColumn = col("");
+ let stringID = string_mapping[policyName] || policyName;
+ descriptionColumn.setAttribute("data-l10n-id", `policy-${stringID}`);
+ row.appendChild(descriptionColumn);
+ main_tbody.appendChild(row);
+ let sec_tbody = document.createElement("tbody");
+ sec_tbody.classList.add("content");
+ sec_tbody.classList.add("content-style");
+ let schema_row = document.createElement("tr");
+ if (schema.properties[policyName].properties) {
+ let column = col(
+ JSON.stringify(schema.properties[policyName].properties, null, 1),
+ "schema"
+ );
+ column.colSpan = "2";
+ schema_row.appendChild(column);
+ sec_tbody.appendChild(schema_row);
+ } else if (schema.properties[policyName].items) {
+ let column = col(
+ JSON.stringify(schema.properties[policyName], null, 1),
+ "schema"
+ );
+ column.colSpan = "2";
+ schema_row.appendChild(column);
+ sec_tbody.appendChild(schema_row);
+ } else {
+ let column = col("type: " + schema.properties[policyName].type, "schema");
+ column.colSpan = "2";
+ schema_row.appendChild(column);
+ sec_tbody.appendChild(schema_row);
+ if (schema.properties[policyName].enum) {
+ let enum_row = document.createElement("tr");
+ column = col(
+ "enum: " +
+ JSON.stringify(schema.properties[policyName].enum, null, 1),
+ "schema"
+ );
+ column.colSpan = "2";
+ enum_row.appendChild(column);
+ sec_tbody.appendChild(enum_row);
+ }
+ }
+ new_cont.appendChild(main_tbody);
+ new_cont.appendChild(sec_tbody);
+ }
+}
+
+let gInited = false;
+window.onload = function () {
+ if (gInited) {
+ return;
+ }
+ gInited = true;
+
+ let data = Services.policies.getActivePolicies();
+ generateActivePolicies(data);
+ generateErrors();
+ generateDocumentation();
+
+ // Event delegation on #categories element
+ let menu = document.getElementById("categories");
+ for (let category of menu.children) {
+ category.addEventListener("click", () => show(category));
+ category.addEventListener("keypress", function (event) {
+ if (event.keyCode == KeyEvent.DOM_VK_RETURN) {
+ show(category);
+ }
+ });
+ }
+
+ if (location.hash) {
+ let sectionButton = document.getElementById(
+ "category-" + location.hash.substring(1)
+ );
+ if (sectionButton) {
+ sectionButton.click();
+ }
+ }
+
+ window.addEventListener("hashchange", function () {
+ if (location.hash) {
+ let sectionButton = document.getElementById(
+ "category-" + location.hash.substring(1)
+ );
+ sectionButton.click();
+ }
+ });
+};
+
+function show(button) {
+ let current_tab = document.querySelector(".active");
+ let category = button.getAttribute("id").substring("category-".length);
+ let content = document.getElementById(category);
+ if (current_tab == content) {
+ return;
+ }
+ saveScrollPosition(current_tab.id);
+ current_tab.classList.remove("active");
+ current_tab.hidden = true;
+ content.classList.add("active");
+ content.hidden = false;
+
+ let current_button = document.querySelector("[selected=true]");
+ current_button.removeAttribute("selected");
+ button.setAttribute("selected", "true");
+
+ let title = document.getElementById("sectionTitle");
+ title.textContent = button.textContent;
+ location.hash = category;
+ restoreScrollPosition(category);
+}
+
+const scrollPositions = {};
+function saveScrollPosition(category) {
+ const mainContent = document.querySelector(".main-content");
+ scrollPositions[category] = mainContent.scrollTop;
+}
+
+function restoreScrollPosition(category) {
+ const scrollY = scrollPositions[category] || 0;
+ const mainContent = document.querySelector(".main-content");
+ mainContent.scrollTo(0, scrollY);
+}
diff --git a/browser/components/enterprisepolicies/content/policies-active.svg b/browser/components/enterprisepolicies/content/policies-active.svg
new file mode 100644
index 0000000000..9f60117649
--- /dev/null
+++ b/browser/components/enterprisepolicies/content/policies-active.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg">
+ <path fill="context-fill" fill-opacity="context-fill-opacity" d="m11 10c-.5522847 0-1-.44771525-1-1v-4h-7v8c0 .5522847.44771525 1 1 1h2c.55228475 0 1 .4477153 1 1s-.44771525 1-1 1h-3c-1.1045695 0-2-.8954305-2-2v-10c0-1.1045695.8954305-2 2-2h1.05c.23659623-1.16516199 1.26105919-2.00250628 2.45-2.00250628s2.21340377.83734429 2.45 2.00250628h1.05c1.1045695 0 2 .8954305 2 2v5c0 .55228475-.4477153 1-1 1zm-1-6v-1h-1.051c-.47526862.000097-.88494628-.33433375-.98-.8-.14293517-.69793844-.7570756-1.19905191-1.4695-1.19905191s-1.32656483.50111347-1.4695 1.19905191c-.09505372.46566625-.50473138.800097-.98.8h-1.05v1zm-3.5-2c.27614237 0 .5.22385763.5.5s-.22385763.5-.5.5-.5-.22385763-.5-.5.22385763-.5.5-.5zm-2 5c-.27614237 0-.5-.22385763-.5-.5s.22385763-.5.5-.5h4c.27614237 0 .5.22385763.5.5s-.22385763.5-.5.5zm0 2c-.27614237 0-.5-.22385763-.5-.5s.22385763-.5.5-.5h2c.27614237 0 .5.22385763.5.5s-.22385763.5-.5.5zm0 2c-.27614237 0-.5-.2238576-.5-.5s.22385763-.5.5-.5h3c.27614237 0 .5.2238576.5.5s-.22385763.5-.5.5zm5.16250363 4.9969649c-.17706448-.0000378-.34686306-.070407-.47204764-.1956294l-2.00303103-2.003031c-.25303103-.2619823-.24941233-.6784164.00813326-.935962s.67397967-.2611643.93596203-.0081333l1.44017931 1.4401793 4.21704794-6.02444961c.2127301-.29815587.6259441-.36927468.9261129-.15939456.3001689.20988012.3752209.62239779.1682098.92455241l-4.6737391 6.67677006c-.1126024.1627768-.29162177.2672048-.48873957.2850981-.01935032.0009766-.03873758.0009766-.0580879 0z"/>
+</svg>
diff --git a/browser/components/enterprisepolicies/content/policies-documentation.svg b/browser/components/enterprisepolicies/content/policies-documentation.svg
new file mode 100644
index 0000000000..455a59b999
--- /dev/null
+++ b/browser/components/enterprisepolicies/content/policies-documentation.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg">
+ <path fill="context-fill" fill-opacity="context-fill-opacity" d="m11 7.00250628c-.5522847 0-1-.44771525-1-1v-1h-7v8.00000002c0 .5522847.44771525 1 1 1h2c.55228475 0 1 .4477152 1 1 0 .5522847-.44771525 1-1 1h-3c-1.1045695 0-2-.8954305-2-2v-10.00000002c0-1.1045695.8954305-2 2-2h1.05c.23659623-1.16516199 1.26105919-2.00250628 2.45-2.00250628s2.21340377.83734429 2.45 2.00250628h1.05c1.1045695 0 2 .8954305 2 2v2c0 .55228475-.4477153 1-1 1zm-1-3v-1h-1.051c-.47526862.000097-.88494628-.33433374-.98-.8-.14293517-.69793844-.7570756-1.19905191-1.4695-1.19905191s-1.32656483.50111347-1.4695 1.19905191c-.09505372.46566626-.50473138.800097-.98.8h-1.05v1zm-3.5-2c.27614237 0 .5.22385763.5.5 0 .27614238-.22385763.5-.5.5s-.5-.22385762-.5-.5c0-.27614237.22385763-.5.5-.5zm-2 5c-.27614237 0-.5-.22385762-.5-.5 0-.27614237.22385763-.5.5-.5h4c.27614237 0 .5.22385763.5.5 0 .27614238-.22385763.5-.5.5zm0 2c-.27614237 0-.5-.22385762-.5-.5 0-.27614237.22385763-.5.5-.5h2c.27614237 0 .5.22385763.5.5 0 .27614238-.22385763.5-.5.5zm0 2.00000002c-.27614237 0-.5-.2238576-.5-.5s.22385763-.5.5-.5h1c.27614237 0 .5.2238576.5.5s-.22385763.5-.5.5zm6.5 4.9974937c-2.2092 0-4-1.7908-4-4s1.7908-4 4-4 4 1.7908 4 4-1.7908 4-4 4zm.46-2c0-.254051-.205949-.46-.46-.46s-.46.205949-.46.46.205949.46.46.46.46-.205949.46-.46zm-1.06-3c0-.3056.2464-.6.6-.6s.6.2944.6.6c0 .1244-.0576.254-.1632.3896-.0796.1016-.1544.172-.228.24-.0308.0288-.0612.0572-.092.0876-.0062816.0061251-.0126828.0121262-.0192.018-.052.0468-.1864.168-.2792.3028-.1304.1896-.2184.434-.2184.762 0 .2209139.1790861.4.4.4s.4-.1790861.4-.4c0-.1724.0424-.258.0776-.3088.0204-.0296.0456-.0576.0788-.09.016-.0156.032-.03.0516-.048l.0012-.0008.0036-.0032c.02-.018.0456-.0416.07-.0664l.0344-.032c.1262825-.1138504.2434416-.2374293.3504-.3696.16-.2048.3324-.5056.3324-.8812 0-.6944-.5536-1.4-1.4-1.4s-1.4.7056-1.4 1.4c0 .2209139.1790861.4.4.4s.4-.1790861.4-.4z"/>
+</svg>
diff --git a/browser/components/enterprisepolicies/content/policies-error.svg b/browser/components/enterprisepolicies/content/policies-error.svg
new file mode 100644
index 0000000000..2024f793f3
--- /dev/null
+++ b/browser/components/enterprisepolicies/content/policies-error.svg
@@ -0,0 +1,6 @@
+<!-- This Source Code Form is subject to the terms of the Mozilla Public
+ - License, v. 2.0. If a copy of the MPL was not distributed with this
+ - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
+<svg height="16" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg">
+ <path fill="context-fill" fill-opacity="context-fill-opacity" d="m11 7.00250628c-.5522847 0-1-.44771525-1-1v-1h-7v8.00000002c0 .5522847.44771525 1 1 1h1c.55228475 0 1 .4477152 1 1 0 .5522847-.44771525 1-1 1h-2c-1.1045695 0-2-.8954305-2-2v-10.00000002c0-1.1045695.8954305-2 2-2h1.05c.23659623-1.16516199 1.26105919-2.00250628 2.45-2.00250628s2.21340377.83734429 2.45 2.00250628h1.05c1.1045695 0 2 .8954305 2 2v2c0 .55228475-.4477153 1-1 1zm-1-3v-1h-1.051c-.47526862.000097-.88494628-.33433374-.98-.8-.14293517-.69793844-.7570756-1.19905191-1.4695-1.19905191s-1.32656483.50111347-1.4695 1.19905191c-.09505372.46566626-.50473138.800097-.98.8h-1.05v1zm-3.5-2c.27614237 0 .5.22385763.5.5 0 .27614238-.22385763.5-.5.5s-.5-.22385762-.5-.5c0-.27614237.22385763-.5.5-.5zm-2 5c-.27614237 0-.5-.22385762-.5-.5 0-.27614237.22385763-.5.5-.5h4c.27614237 0 .5.22385763.5.5 0 .27614238-.22385763.5-.5.5zm0 2c-.27614237 0-.5-.22385762-.5-.5 0-.27614237.22385763-.5.5-.5h3c.27614237 0 .5.22385763.5.5 0 .27614238-.22385763.5-.5.5zm0 2.00000002c-.27614237 0-.5-.2238576-.5-.5s.22385763-.5.5-.5h2c.27614237 0 .5.2238576.5.5s-.22385763.5-.5.5zm10.4094737 3.3385315c.1818196.3660605.1556801.8011195-.0686611 1.1427768-.2243412.3416572-.6131685.5385659-1.0213389.5172232h-5.70000002c-.39222659-.0104155-.75207561-.2200879-.95454083-.5561802-.20246523-.3360923-.21960272-.7522174-.04545917-1.1038198l2.85-5.69999999c.19423612-.39115456.59327402-.63853153 1.03000002-.63853153.4367259 0 .8357638.24737697 1.03.63853153zm-4.45-3.78v1.73c.0381214.2884432.2840486.5040066.575.5040066s.5368786-.2155634.575-.5040066v-1.73c.0295426-.2235324-.0731401-.4439283-.2632845-.56510838-.1901445-.12118005-.4332866-.12118005-.623431 0-.1901445.12118008-.2928271.34157598-.2632845.56510838zm.57 4.13c.3755536 0 .68-.3044464.68-.68 0-.2750343-.1656767-.522987-.4197753-.6282381s-.5465787-.0470731-.7410573.1474055c-.1944787.1944786-.2526566.4869588-.1474055.7410573.1052511.2540986.3532038.4197753.6282381.4197753z"/>
+</svg>