summaryrefslogtreecommitdiffstats
path: root/devtools/client/inspector/fonts/test/head.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/client/inspector/fonts/test/head.js')
-rw-r--r--devtools/client/inspector/fonts/test/head.js277
1 files changed, 277 insertions, 0 deletions
diff --git a/devtools/client/inspector/fonts/test/head.js b/devtools/client/inspector/fonts/test/head.js
new file mode 100644
index 0000000000..058029f13a
--- /dev/null
+++ b/devtools/client/inspector/fonts/test/head.js
@@ -0,0 +1,277 @@
+/* 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/. */
+/* eslint no-unused-vars: [2, {"vars": "local"}] */
+
+"use strict";
+
+// Import the inspector's head.js first (which itself imports shared-head.js).
+Services.scriptloader.loadSubScript(
+ "chrome://mochitests/content/browser/devtools/client/inspector/test/head.js",
+ this
+);
+
+Services.prefs.setCharPref("devtools.inspector.activeSidebar", "fontinspector");
+registerCleanupFunction(() => {
+ Services.prefs.clearUserPref("devtools.inspector.activeSidebar");
+ Services.prefs.clearUserPref("devtools.inspector.selectedSidebar");
+});
+
+var nodeConstants = require("resource://devtools/shared/dom-node-constants.js");
+
+/**
+ * The font-inspector doesn't participate in the inspector's update mechanism
+ * (i.e. it doesn't call inspector.updating() when updating), so simply calling
+ * the default selectNode isn't enough to guaranty that the panel has finished
+ * updating. We also need to wait for the fontinspector-updated event.
+ *
+ * @param {String|NodeFront} selector
+ * @param {InspectorPanel} inspector
+ * The instance of InspectorPanel currently loaded in the toolbox.
+ * @param {String} reason
+ * Defaults to "test" which instructs the inspector not to highlight the
+ * node upon selection.
+ */
+var _selectNode = selectNode;
+selectNode = async function (node, inspector, reason) {
+ // Ensure node is a NodeFront and not a selector (which is also accepted as
+ // an argument to selectNode).
+ node = await getNodeFront(node, inspector);
+
+ // The FontInspector will fallback to the parent node when a text node is
+ // selected.
+ const isTextNode = node.nodeType == nodeConstants.TEXT_NODE;
+ const expectedNode = isTextNode ? node.parentNode() : node;
+
+ const onEditorUpdated = inspector.once("fonteditor-updated");
+ const onFontInspectorUpdated = new Promise(resolve => {
+ inspector.on("fontinspector-updated", function onUpdated(eventNode) {
+ if (eventNode === expectedNode) {
+ inspector.off("fontinspector-updated", onUpdated);
+ resolve();
+ }
+ });
+ });
+ await _selectNode(node, inspector, reason);
+
+ // Wait for both the font inspector and font editor before proceeding.
+ await Promise.all([onFontInspectorUpdated, onEditorUpdated]);
+};
+
+/**
+ * Adds a new tab with the given URL, opens the inspector and selects the
+ * font-inspector tab.
+ * @return {Promise} resolves to a {tab, toolbox, inspector, view} object
+ */
+var openFontInspectorForURL = async function (url) {
+ const tab = await addTab(url);
+ const { toolbox, inspector } = await openInspector();
+
+ // Call selectNode again here to force a fontinspector update since we don't
+ // know if the fontinspector-updated event has been sent while the inspector
+ // was being opened or not.
+ await selectNode("body", inspector);
+
+ return {
+ tab,
+ toolbox,
+ inspector,
+ view: inspector.getPanel("fontinspector"),
+ };
+};
+
+/**
+ * Focus the preview input, clear it, type new text into it and wait for the
+ * preview images to be updated.
+ *
+ * @param {FontInspector} view - The FontInspector instance.
+ * @param {String} text - The text to preview.
+ */
+async function updatePreviewText(view, text) {
+ info(`Changing the preview text to '${text}'`);
+
+ const doc = view.document;
+ const input = doc.querySelector("#font-preview-input-container input");
+ input.focus();
+
+ info("Blanking the input field.");
+ while (input.value.length) {
+ const update = view.inspector.once("fontinspector-updated");
+ EventUtils.sendKey("BACK_SPACE", doc.defaultView);
+ await update;
+ }
+
+ if (text) {
+ info(`Typing "${text}" into the input field.`);
+ const update = view.inspector.once("fontinspector-updated");
+ EventUtils.sendString(text, doc.defaultView);
+ await update;
+ }
+
+ is(input.value, text, `The input now contains "${text}".`);
+}
+
+/**
+ * Get all of the <li> elements for the fonts used on the currently selected element.
+ *
+ * NOTE: This method is used by tests which check the old Font Inspector. It, along with
+ * the tests should be removed once the Font Editor reaches Firefox Stable.
+ * @see https://bugzilla.mozilla.org/show_bug.cgi?id=1485324
+ *
+ * @param {Document} viewDoc
+ * @return {NodeList}
+ */
+function getUsedFontsEls_obsolete(viewDoc) {
+ return viewDoc.querySelectorAll("#font-editor .fonts-list li");
+}
+
+/**
+ * Get all of the elements with names of fonts used on the currently selected element.
+ *
+ * @param {Document} viewDoc
+ * @return {NodeList}
+ */
+function getUsedFontsEls(viewDoc) {
+ return viewDoc.querySelectorAll(
+ "#font-editor .font-control-used-fonts .font-name"
+ );
+}
+
+/**
+ * Get all of the elements with groups of fonts used on the currently selected element.
+ *
+ * @param {Document} viewDoc
+ * @return {NodeList}
+ */
+function getUsedFontGroupsEls(viewDoc) {
+ return viewDoc.querySelectorAll(
+ "#font-editor .font-control-used-fonts .font-group"
+ );
+}
+
+/**
+ * Get the DOM element for the accordion widget that contains the fonts used elsewhere in
+ * the document.
+ *
+ * @param {Document} viewDoc
+ * @return {DOMNode}
+ */
+function getFontsAccordion(viewDoc) {
+ return viewDoc.querySelector("#font-container .accordion");
+}
+
+/**
+ * Expand a given accordion widget.
+ *
+ * @param {DOMNode} accordion
+ */
+async function expandAccordion(accordion) {
+ const isExpanded = () => accordion.querySelector(".fonts-list");
+ if (isExpanded()) {
+ return;
+ }
+
+ const onExpanded = BrowserTestUtils.waitForCondition(
+ isExpanded,
+ "Waiting for other fonts section"
+ );
+ accordion.querySelector(".theme-twisty").click();
+ await onExpanded;
+}
+
+/**
+ * Expand the fonts accordion.
+ *
+ * @param {Document} viewDoc
+ */
+async function expandFontsAccordion(viewDoc) {
+ info("Expanding the other fonts section");
+ await expandAccordion(getFontsAccordion(viewDoc));
+}
+
+/**
+ * Get all of the <li> elements for the fonts used elsewhere in the document.
+ *
+ * @param {Document} viewDoc
+ * @return {NodeList}
+ */
+function getAllFontsEls(viewDoc) {
+ return getFontsAccordion(viewDoc).querySelectorAll(".fonts-list > li");
+}
+
+/**
+ * Given a font element, return its name.
+ *
+ * @param {DOMNode} fontEl
+ * The font element.
+ * @return {String}
+ * The name of the font as shown in the UI.
+ */
+function getName(fontEl) {
+ return fontEl.querySelector(".font-name").textContent;
+}
+
+/**
+ * Given a font element, return the font's URL.
+ *
+ * @param {DOMNode} fontEl
+ * The font element.
+ * @return {String}
+ * The URL where the font was loaded from as shown in the UI.
+ */
+function getURL(fontEl) {
+ return fontEl.querySelector(".font-origin").textContent;
+}
+
+/**
+ * Given a font element, return its family name.
+ *
+ * @param {DOMNode} fontEl
+ * The font element.
+ * @return {String}
+ * The name of the font family as shown in the UI.
+ */
+function getFamilyName(fontEl) {
+ return fontEl.querySelector(".font-family-name").textContent;
+}
+
+/**
+ * Get the value and unit of a CSS font property or font axis from the font editor.
+ *
+ * @param {Document} viewDoc
+ * Host document of the font inspector panel.
+ * @param {String} name
+ * Font property name or axis tag
+ * @return {Object}
+ * Object with the value and unit of the given font property or axis tag
+ * from the corresponding input fron the font editor.
+ * @Example:
+ * {
+ * value: {String|null}
+ * unit: {String|null}
+ * }
+ */
+function getPropertyValue(viewDoc, name) {
+ const selector = `#font-editor .font-value-input[name=${name}]`;
+ return {
+ // Ensure value input exists before querying its value
+ value:
+ viewDoc.querySelector(selector) &&
+ parseFloat(viewDoc.querySelector(selector).value),
+ // Ensure unit dropdown exists before querying its value
+ unit:
+ viewDoc.querySelector(selector + ` ~ .font-value-select`) &&
+ viewDoc.querySelector(selector + ` ~ .font-value-select`).value,
+ };
+}
+
+/**
+ * Given a font element, check whether its font source is remote.
+ *
+ * @param {DOMNode} fontEl
+ * The font element.
+ * @return {Boolean}
+ */
+function isRemote(fontEl) {
+ return fontEl.querySelector(".font-origin").classList.contains("remote");
+}