gecko-dev/devtools/shared/specs/styles.js

256 строки
6.4 KiB
JavaScript

/* 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 {
Arg,
Option,
RetVal,
generateActorSpec,
types,
} = require("devtools/shared/protocol");
// Predeclare the domstylerule actor type
types.addActorType("domstylerule");
/**
* DOM Nodes returned by the style actor will be owned by the DOM walker
* for the connection.
*/
types.addLifetime("walker", "walker");
/**
* When asking for the styles applied to a node, we return a list of
* appliedstyle json objects that lists the rules that apply to the node
* and which element they were inherited from (if any).
*
* Note appliedstyle only sends the list of actorIDs and is not a valid return
* value on its own. appliedstyle should be returned with the actual list of
* StyleRuleActor and StyleSheetActor. See appliedStylesReturn.
*/
types.addDictType("appliedstyle", {
rule: "domstylerule#actorid",
inherited: "nullable:domnode#actorid",
keyframes: "nullable:domstylerule#actorid",
});
types.addDictType("matchedselector", {
rule: "domstylerule#actorid",
selector: "string",
value: "string",
status: "number",
});
types.addDictType("appliedStylesReturn", {
entries: "array:appliedstyle",
rules: "array:domstylerule",
sheets: "array:stylesheet",
});
types.addDictType("modifiedStylesReturn", {
isMatching: RetVal("boolean"),
ruleProps: RetVal("nullable:appliedStylesReturn"),
});
types.addDictType("fontpreview", {
data: "nullable:longstring",
size: "json",
});
types.addDictType("fontvariationaxis", {
tag: "string",
name: "string",
minValue: "number",
maxValue: "number",
defaultValue: "number",
});
types.addDictType("fontvariationinstancevalue", {
axis: "string",
value: "number",
});
types.addDictType("fontvariationinstance", {
name: "string",
values: "array:fontvariationinstancevalue",
});
types.addDictType("fontface", {
name: "string",
CSSFamilyName: "string",
rule: "nullable:domstylerule",
srcIndex: "number",
URI: "string",
format: "string",
preview: "nullable:fontpreview",
localName: "string",
metadata: "string",
variationAxes: "array:fontvariationaxis",
variationInstances: "array:fontvariationinstance",
});
const pageStyleSpec = generateActorSpec({
typeName: "pagestyle",
events: {
"stylesheet-updated": {
type: "styleSheetUpdated",
styleSheet: Arg(0, "stylesheet"),
},
},
methods: {
getComputed: {
request: {
node: Arg(0, "domnode"),
markMatched: Option(1, "boolean"),
onlyMatched: Option(1, "boolean"),
filter: Option(1, "string"),
filterProperties: Option(1, "nullable:array:string"),
},
response: {
computed: RetVal("json"),
},
},
getAllUsedFontFaces: {
request: {
includePreviews: Option(0, "boolean"),
includeVariations: Option(1, "boolean"),
previewText: Option(0, "string"),
previewFontSize: Option(0, "string"),
previewFillStyle: Option(0, "string"),
},
response: {
fontFaces: RetVal("array:fontface"),
},
},
getUsedFontFaces: {
request: {
node: Arg(0, "domnode"),
includePreviews: Option(1, "boolean"),
includeVariations: Option(1, "boolean"),
previewText: Option(1, "string"),
previewFontSize: Option(1, "string"),
previewFillStyle: Option(1, "string"),
},
response: {
fontFaces: RetVal("array:fontface"),
},
},
getMatchedSelectors: {
request: {
node: Arg(0, "domnode"),
property: Arg(1, "string"),
filter: Option(2, "string"),
},
response: RetVal(
types.addDictType("matchedselectorresponse", {
rules: "array:domstylerule",
sheets: "array:stylesheet",
matched: "array:matchedselector",
})
),
},
getRule: {
request: {
ruleId: Arg(0, "string"),
},
response: {
rule: RetVal("nullable:domstylerule"),
},
},
getApplied: {
request: {
node: Arg(0, "domnode"),
inherited: Option(1, "boolean"),
matchedSelectors: Option(1, "boolean"),
skipPseudo: Option(1, "boolean"),
filter: Option(1, "string"),
},
response: RetVal("appliedStylesReturn"),
},
isPositionEditable: {
request: { node: Arg(0, "domnode") },
response: { value: RetVal("boolean") },
},
getLayout: {
request: {
node: Arg(0, "domnode"),
autoMargins: Option(1, "boolean"),
},
response: RetVal("json"),
},
addNewRule: {
request: {
node: Arg(0, "domnode"),
pseudoClasses: Arg(1, "nullable:array:string"),
},
response: RetVal("appliedStylesReturn"),
},
getAttributesInOwnerDocument: {
request: {
search: Arg(0, "string"),
attributeType: Arg(1, "string"),
node: Arg(2, "nullable:domnode"),
},
response: {
attributes: RetVal("array:string"),
},
},
},
});
exports.pageStyleSpec = pageStyleSpec;
const styleRuleSpec = generateActorSpec({
typeName: "domstylerule",
events: {
"location-changed": {
type: "locationChanged",
line: Arg(0, "number"),
column: Arg(1, "number"),
},
"rule-updated": {
type: "ruleUpdated",
rule: Arg(0, "domstylerule"),
},
},
methods: {
getRuleText: {
response: {
text: RetVal("string"),
},
},
setRuleText: {
request: {
newText: Arg(0, "string"),
modifications: Arg(1, "array:json"),
},
response: { rule: RetVal("domstylerule") },
},
modifyProperties: {
request: { modifications: Arg(0, "array:json") },
response: { rule: RetVal("domstylerule") },
},
modifySelector: {
request: {
node: Arg(0, "domnode"),
value: Arg(1, "string"),
editAuthored: Arg(2, "boolean"),
},
response: RetVal("modifiedStylesReturn"),
},
},
});
exports.styleRuleSpec = styleRuleSpec;
// The PageStyle actor flattens the DOM CSS objects a little bit, merging
// Rules and their Styles into one actor. For elements (which have a style
// but no associated rule) we fake a rule with the following style id.
const ELEMENT_STYLE = 100;
exports.ELEMENT_STYLE = ELEMENT_STYLE;