blob: 84320d3e31dcaf278c8018665ea9f74f1b556c13 [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import type * as Protocol from '../../generated/protocol.js';
import {describeWithEnvironment} from '../../testing/EnvironmentHelpers.js';
import * as SDK from './sdk.js';
describeWithEnvironment('CSSProperty', () => {
describe('formatStyle', () => {
const formatStyle = (styleText: string, indentation = ' ', endIndentation = '') =>
SDK.CSSProperty.CSSProperty.formatStyle(styleText, indentation, endIndentation);
it('formats a style declaration with a single trailing semicolon correctly', async () => {
assert.strictEqual(await formatStyle('color: red;'), '\n color: red;\n');
});
it('formats a style declaration with multiple trailing semicolons correctly', async () => {
assert.strictEqual(await formatStyle('color: red;;;'), '\n color: red;\n');
});
it('formats two style declarations correctly', async () => {
assert.strictEqual(await formatStyle('color: red;;;color: blue'), '\n color: red;\n color: blue\n');
});
it('formats multiple style declarations correctly', async () => {
assert.strictEqual(
await formatStyle('color: var(-);margin: 0;padding:0'), '\n color: var(-);margin: 0;padding:0\n');
});
it('formats style declarations with comments correctly', async () => {
assert.strictEqual(
await formatStyle('color: red;/* a comment */;color: blue'), '\n color: red;/* a comment */\n color: blue\n');
});
it('formats an empty decalaration correctly', async () => {
assert.strictEqual(await formatStyle(':; color: red; color: blue'), ':;\n color: red;\n color: blue\n');
});
it('formats an empty decalaration correctly and doesn\'t format comments', async () => {
assert.strictEqual(
await formatStyle('color: red;/* a comment;;; */ :; color: blue;'),
'\n color: red;/* a comment;;; */ :;\n color: blue;\n');
});
it('formats a decalaration with line names correctly', async () => {
assert.strictEqual(
await formatStyle('grid: [first-row-start] "a a" 10px [first-row-end] [second-row-start] "b b" 20px / 100px'),
'\n grid: [first-row-start] "a a" 10px [first-row-end] [second-row-start] "b b" 20px / 100px\n');
});
it('formats shorthand declaration with a variable correctly', async () => {
assert.strictEqual(
await formatStyle('border: 1px solid var(--border-color);;', '', ''),
'border: 1px solid var(--border-color);');
});
it('formats shorthand declaration with a function correctly', async () => {
assert.strictEqual(await formatStyle('border: 1px solid rgb(0,0,0);;', '', ''), 'border: 1px solid rgb(0,0,0);');
});
it('formats declaration with unknown property that contains a function correctly', async () => {
assert.strictEqual(
await formatStyle('unknownProperty: rgba(0,0,0,0);;', '', ''), 'unknownProperty: rgba(0,0,0,0);');
});
// Regression test for crbug/1392813
it('formats complex CSS variable declaration', async () => {
assert.strictEqual(
await formatStyle('--_name: background var(--another-name)', '', ''),
'--_name: background var(--another-name)',
);
});
// Regression test for crbug/1518839
it('formats CSS variable declarations without newline at the start of the var params', async () => {
assert.strictEqual(await formatStyle('--b: var(--non-existent, 2);'), '\n --b: var(--non-existent, 2);\n');
});
});
it('should correctly construct new CSSProperty', () => {
const stubStyle = {} as SDK.CSSStyleDeclaration.CSSStyleDeclaration;
const property1 =
new SDK.CSSProperty.CSSProperty(stubStyle, 0, 'display', 'block', false, false, true, false, 'display: block');
assert.deepEqual(property1.getLonghandProperties(), []);
const stubLonghands = [
{name: 'margin-top', value: '1px'} as Protocol.CSS.CSSProperty,
{name: 'margin-right', value: '1px'} as Protocol.CSS.CSSProperty,
{name: 'margin-bottom', value: '1px'} as Protocol.CSS.CSSProperty,
{name: 'margin-left', value: '1px'} as Protocol.CSS.CSSProperty,
];
const property2 = new SDK.CSSProperty.CSSProperty(
stubStyle, 1, 'margin', '1px', false, false, true, false, 'margin: 1px', undefined, stubLonghands);
assert.deepEqual(
property2.getLonghandProperties().map(property => property.propertyText),
[
'margin-top: 1px;',
'margin-right: 1px;',
'margin-bottom: 1px;',
'margin-left: 1px;',
],
'supplied longhand components should be added correctly');
const property3 = new SDK.CSSProperty.CSSProperty(
stubStyle, 1, 'margin', 'var(--margin)', false, false, true, false, 'margin: var(--margin)', undefined, []);
assert.deepEqual(
property3.getLonghandProperties().map(property => property.propertyText),
[
'margin-top: ;',
'margin-right: ;',
'margin-bottom: ;',
'margin-left: ;',
],
'locally added longhand components should be parsed with empty values');
});
it('should correctly disable CSS property', async () => {
const stubStyle = {} as SDK.CSSStyleDeclaration.CSSStyleDeclaration;
const setText = sinon.spy();
const property =
new SDK.CSSProperty.CSSProperty(stubStyle, 0, 'margin', '10px', false, false, true, false, 'margin: 10px');
property.setText = setText;
await property.setDisabled(true);
assert.strictEqual(setText.firstCall.firstArg, '/* margin: 10px; */');
const propertyWithComment = new SDK.CSSProperty.CSSProperty(
stubStyle, 0, 'margin', '/* comment */ 10px', false, false, true, false, 'margin: /* comment */ 10px');
propertyWithComment.setText = setText;
await propertyWithComment.setDisabled(true);
assert.strictEqual(setText.secondCall.firstArg, '/* margin: 10px; */');
const propertyWithMultilineComment = new SDK.CSSProperty.CSSProperty(
stubStyle, 0, 'margin', '/* com\nment */ 10px', false, false, true, false, 'margin: /* com\nment */ 10px');
propertyWithMultilineComment.setText = setText;
await propertyWithMultilineComment.setDisabled(true);
assert.strictEqual(setText.thirdCall.firstArg, '/* margin: 10px; */');
});
});