UNPKG

chrome-devtools-frontend

Version:
140 lines (128 loc) 4.64 kB
// Copyright 2025 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import * as SDK from '../core/sdk/sdk.js'; import * as Protocol from '../generated/protocol.js'; export function getMatchedStylesWithStylesheet( cssModel: SDK.CSSModel.CSSModel, origin: Protocol.CSS.StyleSheetOrigin, styleSheetId: Protocol.CSS.StyleSheetId, header: Partial<Protocol.CSS.CSSStyleSheetHeader>, payload: Partial<SDK.CSSMatchedStyles.CSSMatchedStylesPayload> = {}): Promise<SDK.CSSMatchedStyles.CSSMatchedStyles> { cssModel.styleSheetAdded({ styleSheetId, frameId: '' as Protocol.Page.FrameId, sourceURL: '', origin, title: '', disabled: false, isInline: false, isMutable: false, isConstructed: false, startLine: 0, startColumn: 0, length: 0, endLine: 0, endColumn: 0, ...header, }); return getMatchedStyles({cssModel, ...payload}); } export function getMatchedStylesWithBlankRule( cssModel: SDK.CSSModel.CSSModel, selector = 'div', range: Protocol.CSS.SourceRange|undefined = undefined, origin = Protocol.CSS.StyleSheetOrigin.Regular, styleSheetId = '0' as Protocol.CSS.StyleSheetId, payload: Partial<SDK.CSSMatchedStyles.CSSMatchedStylesPayload> = {}) { return getMatchedStylesWithProperties(cssModel, {}, selector, range, origin, styleSheetId, payload); } export function createCSSStyle( cssProperties: Protocol.CSS.CSSProperty[], range?: Protocol.CSS.SourceRange, styleSheetId = '0' as Protocol.CSS.StyleSheetId, ): Protocol.CSS.CSSStyle { return { cssProperties, styleSheetId, range, shorthandEntries: [], }; } function getSimpleList(selector: string): Protocol.CSS.SelectorList { return { selectors: [{text: selector}], text: selector, }; } export function ruleMatch( selectorOrList: string|Protocol.CSS.SelectorList, properties: Protocol.CSS.CSSProperty[]|Record<string, string>, options: { range?: Protocol.CSS.SourceRange, origin?: Protocol.CSS.StyleSheetOrigin, styleSheetId?: Protocol.CSS.StyleSheetId, /** Matches all selectors if undefined */ matchingSelectorsIndexes?: number[], nestingSelectors?: string[], } = {}, ): Protocol.CSS.RuleMatch { const { range, origin = Protocol.CSS.StyleSheetOrigin.Regular, styleSheetId, matchingSelectorsIndexes, nestingSelectors, } = options; const cssProperties = Array.isArray(properties) ? properties : Object.keys(properties).map(name => ({name, value: properties[name]})); const selectorList = typeof selectorOrList === 'string' ? getSimpleList(selectorOrList) : selectorOrList; const matchingSelectors = matchingSelectorsIndexes ?? selectorList.selectors.map((_, index) => index); return { rule: { nestingSelectors, selectorList, origin, style: createCSSStyle(cssProperties, range, styleSheetId), styleSheetId, }, matchingSelectors, }; } export function getMatchedStylesWithProperties( cssModel: SDK.CSSModel.CSSModel, properties: Protocol.CSS.CSSProperty[]|Record<string, string>, selector = 'div', range: Protocol.CSS.SourceRange|undefined = undefined, origin = Protocol.CSS.StyleSheetOrigin.Regular, styleSheetId = '0' as Protocol.CSS.StyleSheetId, payload: Partial<SDK.CSSMatchedStyles.CSSMatchedStylesPayload> = {}) { const matchedPayload = [ruleMatch(selector, properties, {range, origin, styleSheetId})]; return getMatchedStylesWithStylesheet(cssModel, origin, styleSheetId, {}, {matchedPayload, ...payload}); } export function getMatchedStyles(payload: Partial<SDK.CSSMatchedStyles.CSSMatchedStylesPayload> = {}) { let node = payload.node; if (!node) { node = sinon.createStubInstance(SDK.DOMModel.DOMNode); node.id = 1 as Protocol.DOM.NodeId; } let cssModel = payload.cssModel; if (!cssModel) { cssModel = sinon.createStubInstance(SDK.CSSModel.CSSModel); } return SDK.CSSMatchedStyles.CSSMatchedStyles.create({ cssModel, node, inlinePayload: null, attributesPayload: null, matchedPayload: [], pseudoPayload: [], inheritedPayload: [], inheritedPseudoPayload: [], animationsPayload: [], parentLayoutNodeId: undefined, positionTryRules: [], propertyRules: [], cssPropertyRegistrations: [], fontPaletteValuesRule: undefined, activePositionFallbackIndex: -1, animationStylesPayload: [], transitionsStylePayload: null, inheritedAnimatedPayload: [], functionRules: [], ...payload, }); }