From 57ad17de78f50a2f5a1be6c4bafe4a48fa611fef Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Tue, 15 Oct 2024 16:22:30 -0700 Subject: [PATCH] chore: compute aria text consistently with the role accumulated text --- .../src/server/ariaSnapshot.ts | 6 +- .../src/server/injected/ariaSnapshot.ts | 62 +- .../src/server/injected/roleUtils.ts | 107 ++-- .../src/matchers/toMatchAriaSnapshot.ts | 16 +- tests/assets/codicon.css | 596 ++++++++++++++++++ tests/assets/codicon.ttf | Bin 0 -> 80340 bytes tests/page/page-aria-snapshot.spec.ts | 375 ++++++++++- tests/page/to-match-aria-snapshot.spec.ts | 4 +- .../stable-test-runner/package-lock.json | 50 +- .../stable-test-runner/package.json | 2 +- 10 files changed, 1094 insertions(+), 124 deletions(-) create mode 100644 tests/assets/codicon.css create mode 100644 tests/assets/codicon.ttf diff --git a/packages/playwright-core/src/server/ariaSnapshot.ts b/packages/playwright-core/src/server/ariaSnapshot.ts index 6f89dd21cfc80..e450e5b15df67 100644 --- a/packages/playwright-core/src/server/ariaSnapshot.ts +++ b/packages/playwright-core/src/server/ariaSnapshot.ts @@ -40,8 +40,12 @@ export function parseAriaSnapshot(text: string): AriaTemplateNode { return { role }; }; + const normalizeWhitespace = (text: string) => { + return text.replace(/[\r\n\s\t]+/g, ' ').trim(); + }; + const valueOrRegex = (value: string): string | RegExp => { - return value.startsWith('/') && value.endsWith('/') ? new RegExp(value.slice(1, -1)) : value; + return value.startsWith('/') && value.endsWith('/') ? new RegExp(value.slice(1, -1)) : normalizeWhitespace(value); }; const convert = (object: YamlNode | string): AriaTemplateNode | RegExp | string => { diff --git a/packages/playwright-core/src/server/injected/ariaSnapshot.ts b/packages/playwright-core/src/server/injected/ariaSnapshot.ts index 22ec9b5c42273..907006ce0a1f8 100644 --- a/packages/playwright-core/src/server/injected/ariaSnapshot.ts +++ b/packages/playwright-core/src/server/injected/ariaSnapshot.ts @@ -15,13 +15,13 @@ */ import { escapeWithQuotes } from '@isomorphic/stringUtils'; -import { beginAriaCaches, endAriaCaches, getAriaRole, getElementAccessibleName, isElementIgnoredForAria } from './roleUtils'; -import { isElementVisible, isElementStyleVisibilityVisible } from './domUtils'; +import { accumulatedElementText, beginAriaCaches, endAriaCaches, getAriaRole, getElementAccessibleName, getPseudoContent, isElementIgnoredForAria } from './roleUtils'; +import { isElementVisible, isElementStyleVisibilityVisible, getElementComputedStyle } from './domUtils'; type AriaNode = { role: string; name?: string; - children?: (AriaNode | string)[]; + children: (AriaNode | string)[]; }; export type AriaTemplateNode = { @@ -38,16 +38,20 @@ export function generateAriaTree(rootElement: Element): AriaNode { const name = role ? getElementAccessibleName(element, false) || undefined : undefined; const isLeaf = leafRoles.has(role); - const result: AriaNode = { role, name }; - if (isLeaf && !name && element.textContent) - result.children = [element.textContent]; + const result: AriaNode = { role, name, children: [] }; + if (isLeaf && !name) { + const text = accumulatedElementText(element); + if (text) + result.children = [text]; + } return { isLeaf, ariaNode: result }; }; const visit = (ariaNode: AriaNode, node: Node) => { if (node.nodeType === Node.TEXT_NODE && node.nodeValue) { - ariaNode.children = ariaNode.children || []; - ariaNode.children.push(node.nodeValue); + const text = node.nodeValue; + if (text) + ariaNode.children.push(node.nodeValue || ''); return; } @@ -67,10 +71,8 @@ export function generateAriaTree(rootElement: Element): AriaNode { if (visible) { const childAriaNode = toAriaNode(element); const isHiddenContainer = childAriaNode && hiddenContainerRoles.has(childAriaNode.ariaNode.role); - if (childAriaNode && !isHiddenContainer) { - ariaNode.children = ariaNode.children || []; + if (childAriaNode && !isHiddenContainer) ariaNode.children.push(childAriaNode.ariaNode); - } if (isHiddenContainer || !childAriaNode?.isLeaf) processChildNodes(childAriaNode?.ariaNode || ariaNode, element); } else { @@ -79,18 +81,36 @@ export function generateAriaTree(rootElement: Element): AriaNode { }; function processChildNodes(ariaNode: AriaNode, element: Element) { - // Process light DOM children - for (let child = element.firstChild; child; child = child.nextSibling) - visit(ariaNode, child); - // Process shadow DOM children, if any - if (element.shadowRoot) { - for (let child = element.shadowRoot.firstChild; child; child = child.nextSibling) + // Surround every element with spaces for the sake of concatenated text nodes. + const display = getElementComputedStyle(element)?.display || 'inline'; + const treatAsBlock = (display !== 'inline' || element.nodeName === 'BR') ? ' ' : ''; + if (treatAsBlock) + ariaNode.children.push(treatAsBlock); + + ariaNode.children.push(getPseudoContent(element, '::before')); + const assignedNodes = element.nodeName === 'SLOT' ? (element as HTMLSlotElement).assignedNodes() : []; + if (assignedNodes.length) { + for (const child of assignedNodes) visit(ariaNode, child); + } else { + for (let child = element.firstChild; child; child = child.nextSibling) { + if (!(child as Element | Text).assignedSlot) + visit(ariaNode, child); + } + if (element.shadowRoot) { + for (let child = element.shadowRoot.firstChild; child; child = child.nextSibling) + visit(ariaNode, child); + } } + + ariaNode.children.push(getPseudoContent(element, '::after')); + + if (treatAsBlock) + ariaNode.children.push(treatAsBlock); } beginAriaCaches(); - const ariaRoot: AriaNode = { role: '' }; + const ariaRoot: AriaNode = { role: '', children: [] }; try { visit(ariaRoot, rootElement); } finally { @@ -128,7 +148,7 @@ function normalizeStringChildren(rootA11yNode: AriaNode) { } } flushChildren(buffer, normalizedChildren); - ariaNode.children = normalizedChildren.length ? normalizedChildren : undefined; + ariaNode.children = normalizedChildren.length ? normalizedChildren : []; }; visit(rootA11yNode); } @@ -144,7 +164,7 @@ const leafRoles = new Set([ 'textbox', 'time', 'tooltip' ]); -const normalizeWhitespaceWithin = (text: string) => text.replace(/[\s\n]+/g, ' '); +const normalizeWhitespaceWithin = (text: string) => text.replace(/[\s\t\r\n]+/g, ' '); function matchesText(text: string | undefined, template: RegExp | string | undefined) { if (!template) @@ -233,7 +253,7 @@ export function renderAriaTree(ariaNode: AriaNode): string { lines.push(line); return; } - lines.push(line + (ariaNode.children ? ':' : '')); + lines.push(line + (ariaNode.children.length ? ':' : '')); for (const child of ariaNode.children || []) visit(child, indent + ' '); }; diff --git a/packages/playwright-core/src/server/injected/roleUtils.ts b/packages/playwright-core/src/server/injected/roleUtils.ts index 6e05c399013a0..d085a8e36d4de 100644 --- a/packages/playwright-core/src/server/injected/roleUtils.ts +++ b/packages/playwright-core/src/server/injected/roleUtils.ts @@ -363,7 +363,7 @@ function queryInAriaOwned(element: Element, selector: string): Element[] { return result; } -function getPseudoContent(element: Element, pseudo: '::before' | '::after') { +export function getPseudoContent(element: Element, pseudo: '::before' | '::after') { const cache = pseudo === '::before' ? cachePseudoContentBefore : cachePseudoContentAfter; if (cache?.has(element)) return cache?.get(element) || ''; @@ -430,10 +430,6 @@ export function getElementAccessibleName(element: Element, includeHidden: boolea accessibleName = asFlatString(getTextAlternativeInternal(element, { includeHidden, visitedElements: new Set(), - embeddedInDescribedBy: undefined, - embeddedInLabelledBy: undefined, - embeddedInLabel: undefined, - embeddedInNativeTextAlternative: undefined, embeddedInTargetElement: 'self', })); } @@ -458,10 +454,6 @@ export function getElementAccessibleDescription(element: Element, includeHidden: accessibleDescription = asFlatString(describedBy.map(ref => getTextAlternativeInternal(ref, { includeHidden, visitedElements: new Set(), - embeddedInLabelledBy: undefined, - embeddedInLabel: undefined, - embeddedInNativeTextAlternative: undefined, - embeddedInTargetElement: 'none', embeddedInDescribedBy: { element: ref, hidden: isElementHiddenForAria(ref) }, })).join(' ')); } else if (element.hasAttribute('aria-description')) { @@ -480,13 +472,13 @@ export function getElementAccessibleDescription(element: Element, includeHidden: } type AccessibleNameOptions = { - includeHidden: boolean, visitedElements: Set, - embeddedInDescribedBy: { element: Element, hidden: boolean } | undefined, - embeddedInLabelledBy: { element: Element, hidden: boolean } | undefined, - embeddedInLabel: { element: Element, hidden: boolean } | undefined, - embeddedInNativeTextAlternative: { element: Element, hidden: boolean } | undefined, - embeddedInTargetElement: 'none' | 'self' | 'descendant', + includeHidden?: boolean, + embeddedInDescribedBy?: { element: Element, hidden: boolean }, + embeddedInLabelledBy?: { element: Element, hidden: boolean }, + embeddedInLabel?: { element: Element, hidden: boolean }, + embeddedInNativeTextAlternative?: { element: Element, hidden: boolean }, + embeddedInTargetElement?: 'self' | 'descendant', }; function getTextAlternativeInternal(element: Element, options: AccessibleNameOptions): string { @@ -525,7 +517,7 @@ function getTextAlternativeInternal(element: Element, options: AccessibleNameOpt ...options, embeddedInLabelledBy: { element: ref, hidden: isElementHiddenForAria(ref) }, embeddedInDescribedBy: undefined, - embeddedInTargetElement: 'none', + embeddedInTargetElement: undefined, embeddedInLabel: undefined, embeddedInNativeTextAlternative: undefined, })).join(' '); @@ -778,42 +770,7 @@ function getTextAlternativeInternal(element: Element, options: AccessibleNameOpt !!options.embeddedInLabelledBy || !!options.embeddedInDescribedBy || !!options.embeddedInLabel || !!options.embeddedInNativeTextAlternative) { options.visitedElements.add(element); - const tokens: string[] = []; - const visit = (node: Node, skipSlotted: boolean) => { - if (skipSlotted && (node as Element | Text).assignedSlot) - return; - if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { - const display = getElementComputedStyle(node as Element)?.display || 'inline'; - let token = getTextAlternativeInternal(node as Element, childOptions); - // SPEC DIFFERENCE. - // Spec says "append the result to the accumulated text", assuming "with space". - // However, multiple tests insist that inline elements do not add a space. - // Additionally,
insists on a space anyway, see "name_file-label-inline-block-elements-manual.html" - if (display !== 'inline' || node.nodeName === 'BR') - token = ' ' + token + ' '; - tokens.push(token); - } else if (node.nodeType === 3 /* Node.TEXT_NODE */) { - // step 2g. - tokens.push(node.textContent || ''); - } - }; - tokens.push(getPseudoContent(element, '::before')); - const assignedNodes = element.nodeName === 'SLOT' ? (element as HTMLSlotElement).assignedNodes() : []; - if (assignedNodes.length) { - for (const child of assignedNodes) - visit(child, false); - } else { - for (let child = element.firstChild; child; child = child.nextSibling) - visit(child, true); - if (element.shadowRoot) { - for (let child = element.shadowRoot.firstChild; child; child = child.nextSibling) - visit(child, true); - } - for (const owned of getIdRefs(element, element.getAttribute('aria-owns'))) - visit(owned, true); - } - tokens.push(getPseudoContent(element, '::after')); - const accessibleName = tokens.join(''); + const accessibleName = innerAccumulatedElementText(element, childOptions); // Spec says "Return the accumulated text if it is not the empty string". However, that is not really // compatible with the real browser behavior and wpt tests, where an element with empty contents will fallback to the title. // So we follow the spec everywhere except for the target element itself. This can probably be improved. @@ -834,6 +791,50 @@ function getTextAlternativeInternal(element: Element, options: AccessibleNameOpt return ''; } +function innerAccumulatedElementText(element: Element, options: AccessibleNameOptions): string { + const tokens: string[] = []; + const visit = (node: Node, skipSlotted: boolean) => { + if (skipSlotted && (node as Element | Text).assignedSlot) + return; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + const display = getElementComputedStyle(node as Element)?.display || 'inline'; + let token = getTextAlternativeInternal(node as Element, options); + // SPEC DIFFERENCE. + // Spec says "append the result to the accumulated text", assuming "with space". + // However, multiple tests insist that inline elements do not add a space. + // Additionally,
insists on a space anyway, see "name_file-label-inline-block-elements-manual.html" + if (display !== 'inline' || node.nodeName === 'BR') + token = ' ' + token + ' '; + tokens.push(token); + } else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + // step 2g. + tokens.push(node.textContent || ''); + } + }; + tokens.push(getPseudoContent(element, '::before')); + const assignedNodes = element.nodeName === 'SLOT' ? (element as HTMLSlotElement).assignedNodes() : []; + if (assignedNodes.length) { + for (const child of assignedNodes) + visit(child, false); + } else { + for (let child = element.firstChild; child; child = child.nextSibling) + visit(child, true); + if (element.shadowRoot) { + for (let child = element.shadowRoot.firstChild; child; child = child.nextSibling) + visit(child, true); + } + for (const owned of getIdRefs(element, element.getAttribute('aria-owns'))) + visit(owned, true); + } + tokens.push(getPseudoContent(element, '::after')); + return tokens.join(''); +} + +export function accumulatedElementText(element: Element): string { + const visitedElements = new Set(); + return asFlatString(innerAccumulatedElementText(element, { visitedElements })).trim(); +} + export const kAriaSelectedRoles = ['gridcell', 'option', 'row', 'tab', 'rowheader', 'columnheader', 'treeitem']; export function getAriaSelected(element: Element): boolean { // https://www.w3.org/TR/wai-aria-1.2/#aria-selected @@ -958,7 +959,7 @@ function getAccessibleNameFromAssociatedLabels(labels: Iterable !!accessibleName).join(' '); } diff --git a/packages/playwright/src/matchers/toMatchAriaSnapshot.ts b/packages/playwright/src/matchers/toMatchAriaSnapshot.ts index cd79ccab61718..cf043c2ca880e 100644 --- a/packages/playwright/src/matchers/toMatchAriaSnapshot.ts +++ b/packages/playwright/src/matchers/toMatchAriaSnapshot.ts @@ -49,17 +49,19 @@ export async function toMatchAriaSnapshot( const messagePrefix = matcherHint(this, receiver, matcherName, 'locator', undefined, matcherOptions, timedOut ? timeout : undefined); const notFound = received === kNoElementsFoundError; + const escapedExpected = escapePrivateUsePoints(expected); + const escapedReceived = escapePrivateUsePoints(received); const message = () => { if (pass) { if (notFound) - return messagePrefix + `Expected: not ${this.utils.printExpected(expected)}\nReceived: ${received}` + callLogText(log); - const printedReceived = printReceivedStringContainExpectedSubstring(received, received.indexOf(expected), expected.length); - return messagePrefix + `Expected: not ${this.utils.printExpected(expected)}\nReceived string: ${printedReceived}` + callLogText(log); + return messagePrefix + `Expected: not ${this.utils.printExpected(escapedExpected)}\nReceived: ${escapedReceived}` + callLogText(log); + const printedReceived = printReceivedStringContainExpectedSubstring(escapedReceived, escapedReceived.indexOf(escapedExpected), escapedExpected.length); + return messagePrefix + `Expected: not ${this.utils.printExpected(escapedExpected)}\nReceived string: ${printedReceived}` + callLogText(log); } else { const labelExpected = `Expected`; if (notFound) - return messagePrefix + `${labelExpected}: ${this.utils.printExpected(expected)}\nReceived: ${received}` + callLogText(log); - return messagePrefix + this.utils.printDiffOrStringify(expected, received, labelExpected, 'Received string', false) + callLogText(log); + return messagePrefix + `${labelExpected}: ${this.utils.printExpected(escapedExpected)}\nReceived: ${escapedReceived}` + callLogText(log); + return messagePrefix + this.utils.printDiffOrStringify(escapedExpected, escapedReceived, labelExpected, 'Received string', false) + callLogText(log); } }; @@ -73,3 +75,7 @@ export async function toMatchAriaSnapshot( timeout: timedOut ? timeout : undefined, }; } + +function escapePrivateUsePoints(str: string) { + return str.replace(/[\uE000-\uF8FF]/g, char => `\\u${char.charCodeAt(0).toString(16).padStart(4, '0')}`); +} diff --git a/tests/assets/codicon.css b/tests/assets/codicon.css new file mode 100644 index 0000000000000..41360ce21d643 --- /dev/null +++ b/tests/assets/codicon.css @@ -0,0 +1,596 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +@font-face { + font-family: "codicon"; + src: url("codicon.ttf") format("truetype"); +} + +.codicon { + font: normal normal normal 16px/1 codicon; + flex: none; + display: inline-block; + text-decoration: none; + text-rendering: auto; + text-align: center; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.codicon-add:before { content: '\ea60'; } +.codicon-plus:before { content: '\ea60'; } +.codicon-gist-new:before { content: '\ea60'; } +.codicon-repo-create:before { content: '\ea60'; } +.codicon-lightbulb:before { content: '\ea61'; } +.codicon-light-bulb:before { content: '\ea61'; } +.codicon-repo:before { content: '\ea62'; } +.codicon-repo-delete:before { content: '\ea62'; } +.codicon-gist-fork:before { content: '\ea63'; } +.codicon-repo-forked:before { content: '\ea63'; } +.codicon-git-pull-request:before { content: '\ea64'; } +.codicon-git-pull-request-abandoned:before { content: '\ea64'; } +.codicon-record-keys:before { content: '\ea65'; } +.codicon-keyboard:before { content: '\ea65'; } +.codicon-tag:before { content: '\ea66'; } +.codicon-git-pull-request-label:before { content: '\ea66'; } +.codicon-tag-add:before { content: '\ea66'; } +.codicon-tag-remove:before { content: '\ea66'; } +.codicon-person:before { content: '\ea67'; } +.codicon-person-follow:before { content: '\ea67'; } +.codicon-person-outline:before { content: '\ea67'; } +.codicon-person-filled:before { content: '\ea67'; } +.codicon-git-branch:before { content: '\ea68'; } +.codicon-git-branch-create:before { content: '\ea68'; } +.codicon-git-branch-delete:before { content: '\ea68'; } +.codicon-source-control:before { content: '\ea68'; } +.codicon-mirror:before { content: '\ea69'; } +.codicon-mirror-public:before { content: '\ea69'; } +.codicon-star:before { content: '\ea6a'; } +.codicon-star-add:before { content: '\ea6a'; } +.codicon-star-delete:before { content: '\ea6a'; } +.codicon-star-empty:before { content: '\ea6a'; } +.codicon-comment:before { content: '\ea6b'; } +.codicon-comment-add:before { content: '\ea6b'; } +.codicon-alert:before { content: '\ea6c'; } +.codicon-warning:before { content: '\ea6c'; } +.codicon-search:before { content: '\ea6d'; } +.codicon-search-save:before { content: '\ea6d'; } +.codicon-log-out:before { content: '\ea6e'; } +.codicon-sign-out:before { content: '\ea6e'; } +.codicon-log-in:before { content: '\ea6f'; } +.codicon-sign-in:before { content: '\ea6f'; } +.codicon-eye:before { content: '\ea70'; } +.codicon-eye-unwatch:before { content: '\ea70'; } +.codicon-eye-watch:before { content: '\ea70'; } +.codicon-circle-filled:before { content: '\ea71'; } +.codicon-primitive-dot:before { content: '\ea71'; } +.codicon-close-dirty:before { content: '\ea71'; } +.codicon-debug-breakpoint:before { content: '\ea71'; } +.codicon-debug-breakpoint-disabled:before { content: '\ea71'; } +.codicon-debug-hint:before { content: '\ea71'; } +.codicon-terminal-decoration-success:before { content: '\ea71'; } +.codicon-primitive-square:before { content: '\ea72'; } +.codicon-edit:before { content: '\ea73'; } +.codicon-pencil:before { content: '\ea73'; } +.codicon-info:before { content: '\ea74'; } +.codicon-issue-opened:before { content: '\ea74'; } +.codicon-gist-private:before { content: '\ea75'; } +.codicon-git-fork-private:before { content: '\ea75'; } +.codicon-lock:before { content: '\ea75'; } +.codicon-mirror-private:before { content: '\ea75'; } +.codicon-close:before { content: '\ea76'; } +.codicon-remove-close:before { content: '\ea76'; } +.codicon-x:before { content: '\ea76'; } +.codicon-repo-sync:before { content: '\ea77'; } +.codicon-sync:before { content: '\ea77'; } +.codicon-clone:before { content: '\ea78'; } +.codicon-desktop-download:before { content: '\ea78'; } +.codicon-beaker:before { content: '\ea79'; } +.codicon-microscope:before { content: '\ea79'; } +.codicon-vm:before { content: '\ea7a'; } +.codicon-device-desktop:before { content: '\ea7a'; } +.codicon-file:before { content: '\ea7b'; } +.codicon-file-text:before { content: '\ea7b'; } +.codicon-more:before { content: '\ea7c'; } +.codicon-ellipsis:before { content: '\ea7c'; } +.codicon-kebab-horizontal:before { content: '\ea7c'; } +.codicon-mail-reply:before { content: '\ea7d'; } +.codicon-reply:before { content: '\ea7d'; } +.codicon-organization:before { content: '\ea7e'; } +.codicon-organization-filled:before { content: '\ea7e'; } +.codicon-organization-outline:before { content: '\ea7e'; } +.codicon-new-file:before { content: '\ea7f'; } +.codicon-file-add:before { content: '\ea7f'; } +.codicon-new-folder:before { content: '\ea80'; } +.codicon-file-directory-create:before { content: '\ea80'; } +.codicon-trash:before { content: '\ea81'; } +.codicon-trashcan:before { content: '\ea81'; } +.codicon-history:before { content: '\ea82'; } +.codicon-clock:before { content: '\ea82'; } +.codicon-folder:before { content: '\ea83'; } +.codicon-file-directory:before { content: '\ea83'; } +.codicon-symbol-folder:before { content: '\ea83'; } +.codicon-logo-github:before { content: '\ea84'; } +.codicon-mark-github:before { content: '\ea84'; } +.codicon-github:before { content: '\ea84'; } +.codicon-terminal:before { content: '\ea85'; } +.codicon-console:before { content: '\ea85'; } +.codicon-repl:before { content: '\ea85'; } +.codicon-zap:before { content: '\ea86'; } +.codicon-symbol-event:before { content: '\ea86'; } +.codicon-error:before { content: '\ea87'; } +.codicon-stop:before { content: '\ea87'; } +.codicon-variable:before { content: '\ea88'; } +.codicon-symbol-variable:before { content: '\ea88'; } +.codicon-array:before { content: '\ea8a'; } +.codicon-symbol-array:before { content: '\ea8a'; } +.codicon-symbol-module:before { content: '\ea8b'; } +.codicon-symbol-package:before { content: '\ea8b'; } +.codicon-symbol-namespace:before { content: '\ea8b'; } +.codicon-symbol-object:before { content: '\ea8b'; } +.codicon-symbol-method:before { content: '\ea8c'; } +.codicon-symbol-function:before { content: '\ea8c'; } +.codicon-symbol-constructor:before { content: '\ea8c'; } +.codicon-symbol-boolean:before { content: '\ea8f'; } +.codicon-symbol-null:before { content: '\ea8f'; } +.codicon-symbol-numeric:before { content: '\ea90'; } +.codicon-symbol-number:before { content: '\ea90'; } +.codicon-symbol-structure:before { content: '\ea91'; } +.codicon-symbol-struct:before { content: '\ea91'; } +.codicon-symbol-parameter:before { content: '\ea92'; } +.codicon-symbol-type-parameter:before { content: '\ea92'; } +.codicon-symbol-key:before { content: '\ea93'; } +.codicon-symbol-text:before { content: '\ea93'; } +.codicon-symbol-reference:before { content: '\ea94'; } +.codicon-go-to-file:before { content: '\ea94'; } +.codicon-symbol-enum:before { content: '\ea95'; } +.codicon-symbol-value:before { content: '\ea95'; } +.codicon-symbol-ruler:before { content: '\ea96'; } +.codicon-symbol-unit:before { content: '\ea96'; } +.codicon-activate-breakpoints:before { content: '\ea97'; } +.codicon-archive:before { content: '\ea98'; } +.codicon-arrow-both:before { content: '\ea99'; } +.codicon-arrow-down:before { content: '\ea9a'; } +.codicon-arrow-left:before { content: '\ea9b'; } +.codicon-arrow-right:before { content: '\ea9c'; } +.codicon-arrow-small-down:before { content: '\ea9d'; } +.codicon-arrow-small-left:before { content: '\ea9e'; } +.codicon-arrow-small-right:before { content: '\ea9f'; } +.codicon-arrow-small-up:before { content: '\eaa0'; } +.codicon-arrow-up:before { content: '\eaa1'; } +.codicon-bell:before { content: '\eaa2'; } +.codicon-bold:before { content: '\eaa3'; } +.codicon-book:before { content: '\eaa4'; } +.codicon-bookmark:before { content: '\eaa5'; } +.codicon-debug-breakpoint-conditional-unverified:before { content: '\eaa6'; } +.codicon-debug-breakpoint-conditional:before { content: '\eaa7'; } +.codicon-debug-breakpoint-conditional-disabled:before { content: '\eaa7'; } +.codicon-debug-breakpoint-data-unverified:before { content: '\eaa8'; } +.codicon-debug-breakpoint-data:before { content: '\eaa9'; } +.codicon-debug-breakpoint-data-disabled:before { content: '\eaa9'; } +.codicon-debug-breakpoint-log-unverified:before { content: '\eaaa'; } +.codicon-debug-breakpoint-log:before { content: '\eaab'; } +.codicon-debug-breakpoint-log-disabled:before { content: '\eaab'; } +.codicon-briefcase:before { content: '\eaac'; } +.codicon-broadcast:before { content: '\eaad'; } +.codicon-browser:before { content: '\eaae'; } +.codicon-bug:before { content: '\eaaf'; } +.codicon-calendar:before { content: '\eab0'; } +.codicon-case-sensitive:before { content: '\eab1'; } +.codicon-check:before { content: '\eab2'; } +.codicon-checklist:before { content: '\eab3'; } +.codicon-chevron-down:before { content: '\eab4'; } +.codicon-chevron-left:before { content: '\eab5'; } +.codicon-chevron-right:before { content: '\eab6'; } +.codicon-chevron-up:before { content: '\eab7'; } +.codicon-chrome-close:before { content: '\eab8'; } +.codicon-chrome-maximize:before { content: '\eab9'; } +.codicon-chrome-minimize:before { content: '\eaba'; } +.codicon-chrome-restore:before { content: '\eabb'; } +.codicon-circle-outline:before { content: '\eabc'; } +.codicon-circle:before { content: '\eabc'; } +.codicon-debug-breakpoint-unverified:before { content: '\eabc'; } +.codicon-terminal-decoration-incomplete:before { content: '\eabc'; } +.codicon-circle-slash:before { content: '\eabd'; } +.codicon-circuit-board:before { content: '\eabe'; } +.codicon-clear-all:before { content: '\eabf'; } +.codicon-clippy:before { content: '\eac0'; } +.codicon-close-all:before { content: '\eac1'; } +.codicon-cloud-download:before { content: '\eac2'; } +.codicon-cloud-upload:before { content: '\eac3'; } +.codicon-code:before { content: '\eac4'; } +.codicon-collapse-all:before { content: '\eac5'; } +.codicon-color-mode:before { content: '\eac6'; } +.codicon-comment-discussion:before { content: '\eac7'; } +.codicon-credit-card:before { content: '\eac9'; } +.codicon-dash:before { content: '\eacc'; } +.codicon-dashboard:before { content: '\eacd'; } +.codicon-database:before { content: '\eace'; } +.codicon-debug-continue:before { content: '\eacf'; } +.codicon-debug-disconnect:before { content: '\ead0'; } +.codicon-debug-pause:before { content: '\ead1'; } +.codicon-debug-restart:before { content: '\ead2'; } +.codicon-debug-start:before { content: '\ead3'; } +.codicon-debug-step-into:before { content: '\ead4'; } +.codicon-debug-step-out:before { content: '\ead5'; } +.codicon-debug-step-over:before { content: '\ead6'; } +.codicon-debug-stop:before { content: '\ead7'; } +.codicon-debug:before { content: '\ead8'; } +.codicon-device-camera-video:before { content: '\ead9'; } +.codicon-device-camera:before { content: '\eada'; } +.codicon-device-mobile:before { content: '\eadb'; } +.codicon-diff-added:before { content: '\eadc'; } +.codicon-diff-ignored:before { content: '\eadd'; } +.codicon-diff-modified:before { content: '\eade'; } +.codicon-diff-removed:before { content: '\eadf'; } +.codicon-diff-renamed:before { content: '\eae0'; } +.codicon-diff:before { content: '\eae1'; } +.codicon-diff-sidebyside:before { content: '\eae1'; } +.codicon-discard:before { content: '\eae2'; } +.codicon-editor-layout:before { content: '\eae3'; } +.codicon-empty-window:before { content: '\eae4'; } +.codicon-exclude:before { content: '\eae5'; } +.codicon-extensions:before { content: '\eae6'; } +.codicon-eye-closed:before { content: '\eae7'; } +.codicon-file-binary:before { content: '\eae8'; } +.codicon-file-code:before { content: '\eae9'; } +.codicon-file-media:before { content: '\eaea'; } +.codicon-file-pdf:before { content: '\eaeb'; } +.codicon-file-submodule:before { content: '\eaec'; } +.codicon-file-symlink-directory:before { content: '\eaed'; } +.codicon-file-symlink-file:before { content: '\eaee'; } +.codicon-file-zip:before { content: '\eaef'; } +.codicon-files:before { content: '\eaf0'; } +.codicon-filter:before { content: '\eaf1'; } +.codicon-flame:before { content: '\eaf2'; } +.codicon-fold-down:before { content: '\eaf3'; } +.codicon-fold-up:before { content: '\eaf4'; } +.codicon-fold:before { content: '\eaf5'; } +.codicon-folder-active:before { content: '\eaf6'; } +.codicon-folder-opened:before { content: '\eaf7'; } +.codicon-gear:before { content: '\eaf8'; } +.codicon-gift:before { content: '\eaf9'; } +.codicon-gist-secret:before { content: '\eafa'; } +.codicon-gist:before { content: '\eafb'; } +.codicon-git-commit:before { content: '\eafc'; } +.codicon-git-compare:before { content: '\eafd'; } +.codicon-compare-changes:before { content: '\eafd'; } +.codicon-git-merge:before { content: '\eafe'; } +.codicon-github-action:before { content: '\eaff'; } +.codicon-github-alt:before { content: '\eb00'; } +.codicon-globe:before { content: '\eb01'; } +.codicon-grabber:before { content: '\eb02'; } +.codicon-graph:before { content: '\eb03'; } +.codicon-gripper:before { content: '\eb04'; } +.codicon-heart:before { content: '\eb05'; } +.codicon-home:before { content: '\eb06'; } +.codicon-horizontal-rule:before { content: '\eb07'; } +.codicon-hubot:before { content: '\eb08'; } +.codicon-inbox:before { content: '\eb09'; } +.codicon-issue-reopened:before { content: '\eb0b'; } +.codicon-issues:before { content: '\eb0c'; } +.codicon-italic:before { content: '\eb0d'; } +.codicon-jersey:before { content: '\eb0e'; } +.codicon-json:before { content: '\eb0f'; } +.codicon-kebab-vertical:before { content: '\eb10'; } +.codicon-key:before { content: '\eb11'; } +.codicon-law:before { content: '\eb12'; } +.codicon-lightbulb-autofix:before { content: '\eb13'; } +.codicon-link-external:before { content: '\eb14'; } +.codicon-link:before { content: '\eb15'; } +.codicon-list-ordered:before { content: '\eb16'; } +.codicon-list-unordered:before { content: '\eb17'; } +.codicon-live-share:before { content: '\eb18'; } +.codicon-loading:before { content: '\eb19'; } +.codicon-location:before { content: '\eb1a'; } +.codicon-mail-read:before { content: '\eb1b'; } +.codicon-mail:before { content: '\eb1c'; } +.codicon-markdown:before { content: '\eb1d'; } +.codicon-megaphone:before { content: '\eb1e'; } +.codicon-mention:before { content: '\eb1f'; } +.codicon-milestone:before { content: '\eb20'; } +.codicon-git-pull-request-milestone:before { content: '\eb20'; } +.codicon-mortar-board:before { content: '\eb21'; } +.codicon-move:before { content: '\eb22'; } +.codicon-multiple-windows:before { content: '\eb23'; } +.codicon-mute:before { content: '\eb24'; } +.codicon-no-newline:before { content: '\eb25'; } +.codicon-note:before { content: '\eb26'; } +.codicon-octoface:before { content: '\eb27'; } +.codicon-open-preview:before { content: '\eb28'; } +.codicon-package:before { content: '\eb29'; } +.codicon-paintcan:before { content: '\eb2a'; } +.codicon-pin:before { content: '\eb2b'; } +.codicon-play:before { content: '\eb2c'; } +.codicon-run:before { content: '\eb2c'; } +.codicon-plug:before { content: '\eb2d'; } +.codicon-preserve-case:before { content: '\eb2e'; } +.codicon-preview:before { content: '\eb2f'; } +.codicon-project:before { content: '\eb30'; } +.codicon-pulse:before { content: '\eb31'; } +.codicon-question:before { content: '\eb32'; } +.codicon-quote:before { content: '\eb33'; } +.codicon-radio-tower:before { content: '\eb34'; } +.codicon-reactions:before { content: '\eb35'; } +.codicon-references:before { content: '\eb36'; } +.codicon-refresh:before { content: '\eb37'; } +.codicon-regex:before { content: '\eb38'; } +.codicon-remote-explorer:before { content: '\eb39'; } +.codicon-remote:before { content: '\eb3a'; } +.codicon-remove:before { content: '\eb3b'; } +.codicon-replace-all:before { content: '\eb3c'; } +.codicon-replace:before { content: '\eb3d'; } +.codicon-repo-clone:before { content: '\eb3e'; } +.codicon-repo-force-push:before { content: '\eb3f'; } +.codicon-repo-pull:before { content: '\eb40'; } +.codicon-repo-push:before { content: '\eb41'; } +.codicon-report:before { content: '\eb42'; } +.codicon-request-changes:before { content: '\eb43'; } +.codicon-rocket:before { content: '\eb44'; } +.codicon-root-folder-opened:before { content: '\eb45'; } +.codicon-root-folder:before { content: '\eb46'; } +.codicon-rss:before { content: '\eb47'; } +.codicon-ruby:before { content: '\eb48'; } +.codicon-save-all:before { content: '\eb49'; } +.codicon-save-as:before { content: '\eb4a'; } +.codicon-save:before { content: '\eb4b'; } +.codicon-screen-full:before { content: '\eb4c'; } +.codicon-screen-normal:before { content: '\eb4d'; } +.codicon-search-stop:before { content: '\eb4e'; } +.codicon-server:before { content: '\eb50'; } +.codicon-settings-gear:before { content: '\eb51'; } +.codicon-settings:before { content: '\eb52'; } +.codicon-shield:before { content: '\eb53'; } +.codicon-smiley:before { content: '\eb54'; } +.codicon-sort-precedence:before { content: '\eb55'; } +.codicon-split-horizontal:before { content: '\eb56'; } +.codicon-split-vertical:before { content: '\eb57'; } +.codicon-squirrel:before { content: '\eb58'; } +.codicon-star-full:before { content: '\eb59'; } +.codicon-star-half:before { content: '\eb5a'; } +.codicon-symbol-class:before { content: '\eb5b'; } +.codicon-symbol-color:before { content: '\eb5c'; } +.codicon-symbol-constant:before { content: '\eb5d'; } +.codicon-symbol-enum-member:before { content: '\eb5e'; } +.codicon-symbol-field:before { content: '\eb5f'; } +.codicon-symbol-file:before { content: '\eb60'; } +.codicon-symbol-interface:before { content: '\eb61'; } +.codicon-symbol-keyword:before { content: '\eb62'; } +.codicon-symbol-misc:before { content: '\eb63'; } +.codicon-symbol-operator:before { content: '\eb64'; } +.codicon-symbol-property:before { content: '\eb65'; } +.codicon-wrench:before { content: '\eb65'; } +.codicon-wrench-subaction:before { content: '\eb65'; } +.codicon-symbol-snippet:before { content: '\eb66'; } +.codicon-tasklist:before { content: '\eb67'; } +.codicon-telescope:before { content: '\eb68'; } +.codicon-text-size:before { content: '\eb69'; } +.codicon-three-bars:before { content: '\eb6a'; } +.codicon-thumbsdown:before { content: '\eb6b'; } +.codicon-thumbsup:before { content: '\eb6c'; } +.codicon-tools:before { content: '\eb6d'; } +.codicon-triangle-down:before { content: '\eb6e'; } +.codicon-triangle-left:before { content: '\eb6f'; } +.codicon-triangle-right:before { content: '\eb70'; } +.codicon-triangle-up:before { content: '\eb71'; } +.codicon-twitter:before { content: '\eb72'; } +.codicon-unfold:before { content: '\eb73'; } +.codicon-unlock:before { content: '\eb74'; } +.codicon-unmute:before { content: '\eb75'; } +.codicon-unverified:before { content: '\eb76'; } +.codicon-verified:before { content: '\eb77'; } +.codicon-versions:before { content: '\eb78'; } +.codicon-vm-active:before { content: '\eb79'; } +.codicon-vm-outline:before { content: '\eb7a'; } +.codicon-vm-running:before { content: '\eb7b'; } +.codicon-watch:before { content: '\eb7c'; } +.codicon-whitespace:before { content: '\eb7d'; } +.codicon-whole-word:before { content: '\eb7e'; } +.codicon-window:before { content: '\eb7f'; } +.codicon-word-wrap:before { content: '\eb80'; } +.codicon-zoom-in:before { content: '\eb81'; } +.codicon-zoom-out:before { content: '\eb82'; } +.codicon-list-filter:before { content: '\eb83'; } +.codicon-list-flat:before { content: '\eb84'; } +.codicon-list-selection:before { content: '\eb85'; } +.codicon-selection:before { content: '\eb85'; } +.codicon-list-tree:before { content: '\eb86'; } +.codicon-debug-breakpoint-function-unverified:before { content: '\eb87'; } +.codicon-debug-breakpoint-function:before { content: '\eb88'; } +.codicon-debug-breakpoint-function-disabled:before { content: '\eb88'; } +.codicon-debug-stackframe-active:before { content: '\eb89'; } +.codicon-circle-small-filled:before { content: '\eb8a'; } +.codicon-debug-stackframe-dot:before { content: '\eb8a'; } +.codicon-terminal-decoration-mark:before { content: '\eb8a'; } +.codicon-debug-stackframe:before { content: '\eb8b'; } +.codicon-debug-stackframe-focused:before { content: '\eb8b'; } +.codicon-debug-breakpoint-unsupported:before { content: '\eb8c'; } +.codicon-symbol-string:before { content: '\eb8d'; } +.codicon-debug-reverse-continue:before { content: '\eb8e'; } +.codicon-debug-step-back:before { content: '\eb8f'; } +.codicon-debug-restart-frame:before { content: '\eb90'; } +.codicon-debug-alt:before { content: '\eb91'; } +.codicon-call-incoming:before { content: '\eb92'; } +.codicon-call-outgoing:before { content: '\eb93'; } +.codicon-menu:before { content: '\eb94'; } +.codicon-expand-all:before { content: '\eb95'; } +.codicon-feedback:before { content: '\eb96'; } +.codicon-git-pull-request-reviewer:before { content: '\eb96'; } +.codicon-group-by-ref-type:before { content: '\eb97'; } +.codicon-ungroup-by-ref-type:before { content: '\eb98'; } +.codicon-account:before { content: '\eb99'; } +.codicon-git-pull-request-assignee:before { content: '\eb99'; } +.codicon-bell-dot:before { content: '\eb9a'; } +.codicon-debug-console:before { content: '\eb9b'; } +.codicon-library:before { content: '\eb9c'; } +.codicon-output:before { content: '\eb9d'; } +.codicon-run-all:before { content: '\eb9e'; } +.codicon-sync-ignored:before { content: '\eb9f'; } +.codicon-pinned:before { content: '\eba0'; } +.codicon-github-inverted:before { content: '\eba1'; } +.codicon-server-process:before { content: '\eba2'; } +.codicon-server-environment:before { content: '\eba3'; } +.codicon-pass:before { content: '\eba4'; } +.codicon-issue-closed:before { content: '\eba4'; } +.codicon-stop-circle:before { content: '\eba5'; } +.codicon-play-circle:before { content: '\eba6'; } +.codicon-record:before { content: '\eba7'; } +.codicon-debug-alt-small:before { content: '\eba8'; } +.codicon-vm-connect:before { content: '\eba9'; } +.codicon-cloud:before { content: '\ebaa'; } +.codicon-merge:before { content: '\ebab'; } +.codicon-export:before { content: '\ebac'; } +.codicon-graph-left:before { content: '\ebad'; } +.codicon-magnet:before { content: '\ebae'; } +.codicon-notebook:before { content: '\ebaf'; } +.codicon-redo:before { content: '\ebb0'; } +.codicon-check-all:before { content: '\ebb1'; } +.codicon-pinned-dirty:before { content: '\ebb2'; } +.codicon-pass-filled:before { content: '\ebb3'; } +.codicon-circle-large-filled:before { content: '\ebb4'; } +.codicon-circle-large:before { content: '\ebb5'; } +.codicon-circle-large-outline:before { content: '\ebb5'; } +.codicon-combine:before { content: '\ebb6'; } +.codicon-gather:before { content: '\ebb6'; } +.codicon-table:before { content: '\ebb7'; } +.codicon-variable-group:before { content: '\ebb8'; } +.codicon-type-hierarchy:before { content: '\ebb9'; } +.codicon-type-hierarchy-sub:before { content: '\ebba'; } +.codicon-type-hierarchy-super:before { content: '\ebbb'; } +.codicon-git-pull-request-create:before { content: '\ebbc'; } +.codicon-run-above:before { content: '\ebbd'; } +.codicon-run-below:before { content: '\ebbe'; } +.codicon-notebook-template:before { content: '\ebbf'; } +.codicon-debug-rerun:before { content: '\ebc0'; } +.codicon-workspace-trusted:before { content: '\ebc1'; } +.codicon-workspace-untrusted:before { content: '\ebc2'; } +.codicon-workspace-unknown:before { content: '\ebc3'; } +.codicon-terminal-cmd:before { content: '\ebc4'; } +.codicon-terminal-debian:before { content: '\ebc5'; } +.codicon-terminal-linux:before { content: '\ebc6'; } +.codicon-terminal-powershell:before { content: '\ebc7'; } +.codicon-terminal-tmux:before { content: '\ebc8'; } +.codicon-terminal-ubuntu:before { content: '\ebc9'; } +.codicon-terminal-bash:before { content: '\ebca'; } +.codicon-arrow-swap:before { content: '\ebcb'; } +.codicon-copy:before { content: '\ebcc'; } +.codicon-person-add:before { content: '\ebcd'; } +.codicon-filter-filled:before { content: '\ebce'; } +.codicon-wand:before { content: '\ebcf'; } +.codicon-debug-line-by-line:before { content: '\ebd0'; } +.codicon-inspect:before { content: '\ebd1'; } +.codicon-layers:before { content: '\ebd2'; } +.codicon-layers-dot:before { content: '\ebd3'; } +.codicon-layers-active:before { content: '\ebd4'; } +.codicon-compass:before { content: '\ebd5'; } +.codicon-compass-dot:before { content: '\ebd6'; } +.codicon-compass-active:before { content: '\ebd7'; } +.codicon-azure:before { content: '\ebd8'; } +.codicon-issue-draft:before { content: '\ebd9'; } +.codicon-git-pull-request-closed:before { content: '\ebda'; } +.codicon-git-pull-request-draft:before { content: '\ebdb'; } +.codicon-debug-all:before { content: '\ebdc'; } +.codicon-debug-coverage:before { content: '\ebdd'; } +.codicon-run-errors:before { content: '\ebde'; } +.codicon-folder-library:before { content: '\ebdf'; } +.codicon-debug-continue-small:before { content: '\ebe0'; } +.codicon-beaker-stop:before { content: '\ebe1'; } +.codicon-graph-line:before { content: '\ebe2'; } +.codicon-graph-scatter:before { content: '\ebe3'; } +.codicon-pie-chart:before { content: '\ebe4'; } +.codicon-bracket:before { content: '\eb0f'; } +.codicon-bracket-dot:before { content: '\ebe5'; } +.codicon-bracket-error:before { content: '\ebe6'; } +.codicon-lock-small:before { content: '\ebe7'; } +.codicon-azure-devops:before { content: '\ebe8'; } +.codicon-verified-filled:before { content: '\ebe9'; } +.codicon-newline:before { content: '\ebea'; } +.codicon-layout:before { content: '\ebeb'; } +.codicon-layout-activitybar-left:before { content: '\ebec'; } +.codicon-layout-activitybar-right:before { content: '\ebed'; } +.codicon-layout-panel-left:before { content: '\ebee'; } +.codicon-layout-panel-center:before { content: '\ebef'; } +.codicon-layout-panel-justify:before { content: '\ebf0'; } +.codicon-layout-panel-right:before { content: '\ebf1'; } +.codicon-layout-panel:before { content: '\ebf2'; } +.codicon-layout-sidebar-left:before { content: '\ebf3'; } +.codicon-layout-sidebar-right:before { content: '\ebf4'; } +.codicon-layout-statusbar:before { content: '\ebf5'; } +.codicon-layout-menubar:before { content: '\ebf6'; } +.codicon-layout-centered:before { content: '\ebf7'; } +.codicon-target:before { content: '\ebf8'; } +.codicon-indent:before { content: '\ebf9'; } +.codicon-record-small:before { content: '\ebfa'; } +.codicon-error-small:before { content: '\ebfb'; } +.codicon-terminal-decoration-error:before { content: '\ebfb'; } +.codicon-arrow-circle-down:before { content: '\ebfc'; } +.codicon-arrow-circle-left:before { content: '\ebfd'; } +.codicon-arrow-circle-right:before { content: '\ebfe'; } +.codicon-arrow-circle-up:before { content: '\ebff'; } +.codicon-layout-sidebar-right-off:before { content: '\ec00'; } +.codicon-layout-panel-off:before { content: '\ec01'; } +.codicon-layout-sidebar-left-off:before { content: '\ec02'; } +.codicon-blank:before { content: '\ec03'; } +.codicon-heart-filled:before { content: '\ec04'; } +.codicon-map:before { content: '\ec05'; } +.codicon-map-horizontal:before { content: '\ec05'; } +.codicon-fold-horizontal:before { content: '\ec05'; } +.codicon-map-filled:before { content: '\ec06'; } +.codicon-map-horizontal-filled:before { content: '\ec06'; } +.codicon-fold-horizontal-filled:before { content: '\ec06'; } +.codicon-circle-small:before { content: '\ec07'; } +.codicon-bell-slash:before { content: '\ec08'; } +.codicon-bell-slash-dot:before { content: '\ec09'; } +.codicon-comment-unresolved:before { content: '\ec0a'; } +.codicon-git-pull-request-go-to-changes:before { content: '\ec0b'; } +.codicon-git-pull-request-new-changes:before { content: '\ec0c'; } +.codicon-search-fuzzy:before { content: '\ec0d'; } +.codicon-comment-draft:before { content: '\ec0e'; } +.codicon-send:before { content: '\ec0f'; } +.codicon-sparkle:before { content: '\ec10'; } +.codicon-insert:before { content: '\ec11'; } +.codicon-mic:before { content: '\ec12'; } +.codicon-thumbsdown-filled:before { content: '\ec13'; } +.codicon-thumbsup-filled:before { content: '\ec14'; } +.codicon-coffee:before { content: '\ec15'; } +.codicon-snake:before { content: '\ec16'; } +.codicon-game:before { content: '\ec17'; } +.codicon-vr:before { content: '\ec18'; } +.codicon-chip:before { content: '\ec19'; } +.codicon-piano:before { content: '\ec1a'; } +.codicon-music:before { content: '\ec1b'; } +.codicon-mic-filled:before { content: '\ec1c'; } +.codicon-repo-fetch:before { content: '\ec1d'; } +.codicon-copilot:before { content: '\ec1e'; } +.codicon-lightbulb-sparkle:before { content: '\ec1f'; } +.codicon-robot:before { content: '\ec20'; } +.codicon-sparkle-filled:before { content: '\ec21'; } +.codicon-diff-single:before { content: '\ec22'; } +.codicon-diff-multiple:before { content: '\ec23'; } +.codicon-surround-with:before { content: '\ec24'; } +.codicon-share:before { content: '\ec25'; } +.codicon-git-stash:before { content: '\ec26'; } +.codicon-git-stash-apply:before { content: '\ec27'; } +.codicon-git-stash-pop:before { content: '\ec28'; } +.codicon-vscode:before { content: '\ec29'; } +.codicon-vscode-insiders:before { content: '\ec2a'; } +.codicon-code-oss:before { content: '\ec2b'; } +.codicon-run-coverage:before { content: '\ec2c'; } +.codicon-run-all-coverage:before { content: '\ec2d'; } +.codicon-coverage:before { content: '\ec2e'; } +.codicon-github-project:before { content: '\ec2f'; } +.codicon-map-vertical:before { content: '\ec30'; } +.codicon-fold-vertical:before { content: '\ec30'; } +.codicon-map-vertical-filled:before { content: '\ec31'; } +.codicon-fold-vertical-filled:before { content: '\ec31'; } +.codicon-go-to-search:before { content: '\ec32'; } +.codicon-percentage:before { content: '\ec33'; } +.codicon-sort-percentage:before { content: '\ec33'; } +.codicon-attach:before { content: '\ec34'; } +.codicon-git-fetch:before { content: '\f101'; } diff --git a/tests/assets/codicon.ttf b/tests/assets/codicon.ttf new file mode 100644 index 0000000000000000000000000000000000000000..27ee4c68caef1cd22342f481420d6dbda1648012 GIT binary patch literal 80340 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%0DOF`LEiy*`&i@0 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 { - await page.setContent(``); - expect(await page.locator('body').ariaSnapshot()).toBe('- checkbox'); +function unshift(snapshot: string): string { + const lines = snapshot.split('\n'); + let whitespacePrefixLength = 100; + for (const line of lines) { + if (!line.trim()) + continue; + const match = line.match(/^(\s*)/); + if (match && match[1].length < whitespacePrefixLength) + whitespacePrefixLength = match[1].length; + break; + } + return lines.filter(t => t.trim()).map(line => line.substring(whitespacePrefixLength)).join('\n'); +} + +async function checkAndMatchSnapshot(locator: Locator, snapshot: string) { + expect.soft(await locator.ariaSnapshot()).toBe(unshift(snapshot)); + await expect.soft(locator).toMatchAriaSnapshot(snapshot); +} + +it('should snapshot', async ({ page }) => { + await page.setContent(`

title

`); + await checkAndMatchSnapshot(page.locator('body'), ` + - heading "title" + `); +}); + +it('should snapshot list', async ({ page }) => { + await page.setContent(` +

title

+

title 2

+ `); + await checkAndMatchSnapshot(page.locator('body'), ` + - heading "title" + - heading "title 2" + `); +}); + +it('should snapshot list with accessible name', async ({ page }) => { + await page.setContent(` +
    +
  • one
  • +
  • two
  • +
+ `); + await checkAndMatchSnapshot(page.locator('body'), ` + - list "my list": + - listitem: one + - listitem: two + `); +}); + +it('should snapshot complex', async ({ page }) => { + await page.setContent(` + + `); + await checkAndMatchSnapshot(page.locator('body'), ` + - list: + - listitem: + - link "link" + `); +}); + +it('should allow text nodes', async ({ page }) => { + await page.setContent(` +

Microsoft

+
Open source projects and samples from Microsoft
+ `); + + await checkAndMatchSnapshot(page.locator('body'), ` + - heading "Microsoft" + - text: Open source projects and samples from Microsoft + `); +}); + +it('should snapshot details visibility', async ({ page }) => { + await page.setContent(` +
+ Summary +
Details
+
+ `); + + await checkAndMatchSnapshot(page.locator('body'), ` + - group: Summary + `); +}); + +it('should snapshot integration', async ({ page }) => { + await page.setContent(` +

Microsoft

+
Open source projects and samples from Microsoft
+ `); + + await checkAndMatchSnapshot(page.locator('body'), ` + - heading "Microsoft" + - text: Open source projects and samples from Microsoft + - list: + - listitem: + - group: Verified + - listitem: + - link "Sponsor" + `); +}); + +it('should support multiline text', async ({ page }) => { + await page.setContent(` +

+ Line 1 + Line 2 + Line 3 +

+ `); + + await checkAndMatchSnapshot(page.locator('body'), ` + - paragraph: Line 1 Line 2 Line 3 + `); + await expect(page.locator('body')).toMatchAriaSnapshot(` + - paragraph: | + Line 1 + Line 2 + Line 3 + `); +}); + +it('should concatenate span text', async ({ page }) => { + await page.setContent(` + One Two Three + `); + + await checkAndMatchSnapshot(page.locator('body'), ` + - text: One Two Three + `); +}); + +it('should concatenate span text 2', async ({ page }) => { + await page.setContent(` + One Two Three + `); + + await checkAndMatchSnapshot(page.locator('body'), ` + - text: One Two Three + `); +}); + +it('should concatenate div text with spaces', async ({ page }) => { + await page.setContent(` +
One
Two
Three
+ `); + + await checkAndMatchSnapshot(page.locator('body'), ` + - text: One Two Three + `); +}); + +it('should include pseudo in text', async ({ page }) => { + await page.setContent(` + + + hello +
hello
+
+ `); + + await checkAndMatchSnapshot(page.locator('body'), ` + - link "worldhello hellobye" + `); +}); + +it('should not include hidden pseudo in text', async ({ page }) => { + await page.setContent(` + + + hello +
hello
+
+ `); + + await checkAndMatchSnapshot(page.locator('body'), ` + - link "hello hello" + `); }); -it('should snapshot nested element', async ({ page }) => { +it('should include new line for block pseudo', async ({ page }) => { await page.setContent(` -
- -
`); - expect(await page.locator('body').ariaSnapshot()).toBe('- checkbox'); + + + hello +
hello
+
+ `); + + await checkAndMatchSnapshot(page.locator('body'), ` + - link "world hello hello bye" + `); }); -it('should snapshot fragment', async ({ page }) => { +it('should work with slots', async ({ page }) => { + // Text "foo" is assigned to the slot, should not be used twice. + await page.setContent(` + + + `); + await checkAndMatchSnapshot(page.locator('body'), ` + - button "foo" + `); + + // Text "foo" is assigned to the slot, should be used instead of slot content. + await page.setContent(` +
foo
+ + `); + await checkAndMatchSnapshot(page.locator('body'), ` + - button "foo" + `); + + // Nothing is assigned to the slot, should use slot content. await page.setContent(` -
- Link - Link -
`); - expect(await page.locator('body').ariaSnapshot()).toBe(`- link "Link"\n- link "Link"`); +
+ + `); + await checkAndMatchSnapshot(page.locator('body'), ` + - button "pre" + `); +}); + +it('should snapshot inner text', async ({ page }) => { + await page.setContent(` +
+
+
+ a.test.ts +
+
+ + + +
+
+
+
+
+
+ snapshot +
+
30ms
+
+ + + +
+
+
+ `); + + await checkAndMatchSnapshot(page.locator('body'), ` + - listitem: + - text: a.test.ts + - button "Run" + - button "Show source" + - button "Watch" + - listitem: + - text: snapshot 30ms + - button "Run" + - button "Show source" + - button "Watch" + `); +}); + +it('should include pseudo codepoints', async ({ page, server }) => { + await page.goto(server.EMPTY_PAGE); + await page.setContent(` + +

hello

+ `); + + await checkAndMatchSnapshot(page.locator('body'), ` + - paragraph: \ueab2hello + `); }); diff --git a/tests/page/to-match-aria-snapshot.spec.ts b/tests/page/to-match-aria-snapshot.spec.ts index 5e58ba94e0ebe..fa573f2704a88 100644 --- a/tests/page/to-match-aria-snapshot.spec.ts +++ b/tests/page/to-match-aria-snapshot.spec.ts @@ -94,7 +94,7 @@ test('should allow text nodes', async ({ page }) => { `); }); -test('details visibility', async ({ page, browserName }) => { +test('details visibility', async ({ page }) => { await page.setContent(`
Summary @@ -107,7 +107,7 @@ test('details visibility', async ({ page, browserName }) => { `); }); -test('integration test', async ({ page, browserName }) => { +test('integration test', async ({ page }) => { await page.setContent(`

Microsoft

Open source projects and samples from Microsoft
diff --git a/tests/playwright-test/stable-test-runner/package-lock.json b/tests/playwright-test/stable-test-runner/package-lock.json index 180f4d9b33395..df6792d59df93 100644 --- a/tests/playwright-test/stable-test-runner/package-lock.json +++ b/tests/playwright-test/stable-test-runner/package-lock.json @@ -5,16 +5,15 @@ "packages": { "": { "dependencies": { - "@playwright/test": "1.48.0-beta-1728384960000" + "@playwright/test": "1.49.0-alpha-2024-10-17" } }, "node_modules/@playwright/test": { - "version": "1.48.0-beta-1728384960000", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.0-beta-1728384960000.tgz", - "integrity": "sha512-bqQorY7LKVldgwAsUbjULdwKEoUlZ8OOHRZmM/1XyGiGqJwzTGdr0x8Ss312BvKddAh+5pz8cbaPopw10Rp3Ng==", - "license": "Apache-2.0", + "version": "1.49.0-alpha-2024-10-17", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.0-alpha-2024-10-17.tgz", + "integrity": "sha512-HLZY3sM6xt9Wi8K09zPwjJQtcUBZNBcNSIVoMZhtJM3+TikCKx4SiJ3P8vbSlk7Tm3s2oqlS+wA181IxhbTGBA==", "dependencies": { - "playwright": "1.48.0-beta-1728384960000" + "playwright": "1.49.0-alpha-2024-10-17" }, "bin": { "playwright": "cli.js" @@ -28,7 +27,6 @@ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "hasInstallScript": true, - "license": "MIT", "optional": true, "os": [ "darwin" @@ -38,12 +36,11 @@ } }, "node_modules/playwright": { - "version": "1.48.0-beta-1728384960000", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.0-beta-1728384960000.tgz", - "integrity": "sha512-5pIZTwoktOGYJL+YpF2RNhGzVUY6rA/ceQAT0lEQSZaL55MKUzraD2FAoZoBnz84cIIks2ZSlXt8j5mJ5xXt8g==", - "license": "Apache-2.0", + "version": "1.49.0-alpha-2024-10-17", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0-alpha-2024-10-17.tgz", + "integrity": "sha512-IgcLunnpocVS/AEq2lcftVOu0DGQzFm1Qt25SCJsrVvKVe83ElKXZYskPz7yA0HeuOVxQyN69EDWI09ph7lfoQ==", "dependencies": { - "playwright-core": "1.48.0-beta-1728384960000" + "playwright-core": "1.49.0-alpha-2024-10-17" }, "bin": { "playwright": "cli.js" @@ -56,10 +53,9 @@ } }, "node_modules/playwright-core": { - "version": "1.48.0-beta-1728384960000", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.0-beta-1728384960000.tgz", - "integrity": "sha512-atIhpuvqvVEW5luPhwzhdcXsGdPvzOBLXAg3+MvOLY+6Q4JcTfXMTtTmltP+llUV+LAgj38foQz+6tKTzNMlWg==", - "license": "Apache-2.0", + "version": "1.49.0-alpha-2024-10-17", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0-alpha-2024-10-17.tgz", + "integrity": "sha512-XLTKmPBm2ZIOXBckXtiimSOIjQsYy8MqEP9CsHSgytsP0E+j/44v1BuwHOOMaG8sfjcuZLZ1QdFidnl07A9wSg==", "bin": { "playwright-core": "cli.js" }, @@ -70,11 +66,11 @@ }, "dependencies": { "@playwright/test": { - "version": "1.48.0-beta-1728384960000", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.0-beta-1728384960000.tgz", - "integrity": "sha512-bqQorY7LKVldgwAsUbjULdwKEoUlZ8OOHRZmM/1XyGiGqJwzTGdr0x8Ss312BvKddAh+5pz8cbaPopw10Rp3Ng==", + "version": "1.49.0-alpha-2024-10-17", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.0-alpha-2024-10-17.tgz", + "integrity": "sha512-HLZY3sM6xt9Wi8K09zPwjJQtcUBZNBcNSIVoMZhtJM3+TikCKx4SiJ3P8vbSlk7Tm3s2oqlS+wA181IxhbTGBA==", "requires": { - "playwright": "1.48.0-beta-1728384960000" + "playwright": "1.49.0-alpha-2024-10-17" } }, "fsevents": { @@ -84,18 +80,18 @@ "optional": true }, "playwright": { - "version": "1.48.0-beta-1728384960000", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.0-beta-1728384960000.tgz", - "integrity": "sha512-5pIZTwoktOGYJL+YpF2RNhGzVUY6rA/ceQAT0lEQSZaL55MKUzraD2FAoZoBnz84cIIks2ZSlXt8j5mJ5xXt8g==", + "version": "1.49.0-alpha-2024-10-17", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0-alpha-2024-10-17.tgz", + "integrity": "sha512-IgcLunnpocVS/AEq2lcftVOu0DGQzFm1Qt25SCJsrVvKVe83ElKXZYskPz7yA0HeuOVxQyN69EDWI09ph7lfoQ==", "requires": { "fsevents": "2.3.2", - "playwright-core": "1.48.0-beta-1728384960000" + "playwright-core": "1.49.0-alpha-2024-10-17" } }, "playwright-core": { - "version": "1.48.0-beta-1728384960000", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.0-beta-1728384960000.tgz", - "integrity": "sha512-atIhpuvqvVEW5luPhwzhdcXsGdPvzOBLXAg3+MvOLY+6Q4JcTfXMTtTmltP+llUV+LAgj38foQz+6tKTzNMlWg==" + "version": "1.49.0-alpha-2024-10-17", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0-alpha-2024-10-17.tgz", + "integrity": "sha512-XLTKmPBm2ZIOXBckXtiimSOIjQsYy8MqEP9CsHSgytsP0E+j/44v1BuwHOOMaG8sfjcuZLZ1QdFidnl07A9wSg==" } } } diff --git a/tests/playwright-test/stable-test-runner/package.json b/tests/playwright-test/stable-test-runner/package.json index 3e32d0bbb7c07..14625ebe6d328 100644 --- a/tests/playwright-test/stable-test-runner/package.json +++ b/tests/playwright-test/stable-test-runner/package.json @@ -1,6 +1,6 @@ { "private": true, "dependencies": { - "@playwright/test": "1.48.0-beta-1728384960000" + "@playwright/test": "1.49.0-alpha-2024-10-17" } }