mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-11 04:15:43 +00:00
Bug 1290988 - Add the mach generate-css-db command; r=chmanchester,tromey
Provide a single mach command to automatically generate the static database of CSS properties that devtools uses for the inspector and various editors. MozReview-Commit-ID: 8E2jwxF0KbM --HG-- extra : rebase_source : 2cd21cd08f431ff933c3fd89ebca3e6684fb80f8
This commit is contained in:
parent
da1990f19b
commit
77ecdadfe2
@ -102,6 +102,7 @@ SEARCH_PATHS = [
|
||||
MACH_MODULES = [
|
||||
'addon-sdk/mach_commands.py',
|
||||
'build/valgrind/mach_commands.py',
|
||||
'devtools/shared/css/generated/mach_commands.py',
|
||||
'dom/bindings/mach_commands.py',
|
||||
'dom/media/test/external/mach_commands.py',
|
||||
'layout/tools/reftest/mach_commands.py',
|
||||
|
49
devtools/shared/css/generated/generate-properties-db.js
Normal file
49
devtools/shared/css/generated/generate-properties-db.js
Normal file
@ -0,0 +1,49 @@
|
||||
/* 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";
|
||||
|
||||
/*
|
||||
* This is an xpcshell script that runs to generate a static list of CSS properties
|
||||
* as known by the platform. It is run from ./mach_commands.py by running
|
||||
* `mach devtools-css-db`.
|
||||
*/
|
||||
var {require} = Components.utils.import("resource://devtools/shared/Loader.jsm", {});
|
||||
var {generateCssProperties} = require("devtools/server/actors/css-properties");
|
||||
|
||||
// Output JSON
|
||||
dump(JSON.stringify({
|
||||
cssProperties: cssProperties(),
|
||||
pseudoElements: pseudoElements()
|
||||
}));
|
||||
|
||||
/*
|
||||
* A list of CSS Properties and their various characteristics. This is used on the
|
||||
* client-side when the CssPropertiesActor is not found, or when the client and server
|
||||
* are the same version. A single property takes the form:
|
||||
*
|
||||
* "animation": {
|
||||
* "isInherited": false,
|
||||
* "supports": [ 7, 9, 10 ]
|
||||
* }
|
||||
*/
|
||||
function cssProperties() {
|
||||
const properties = generateCssProperties();
|
||||
for (let key in properties) {
|
||||
// Ignore OS-specific properties
|
||||
if (key.indexOf("-moz-osx-") !== -1) {
|
||||
properties[key] = undefined;
|
||||
}
|
||||
}
|
||||
return properties;
|
||||
}
|
||||
|
||||
/**
|
||||
* The list of all CSS Pseudo Elements.
|
||||
*/
|
||||
function pseudoElements() {
|
||||
const {classes: Cc, interfaces: Ci} = Components;
|
||||
const domUtils = Cc["@mozilla.org/inspector/dom-utils;1"]
|
||||
.getService(Ci.inIDOMUtils);
|
||||
return domUtils.getCSSPseudoElementNames();
|
||||
}
|
111
devtools/shared/css/generated/mach_commands.py
Normal file
111
devtools/shared/css/generated/mach_commands.py
Normal file
@ -0,0 +1,111 @@
|
||||
# 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/.
|
||||
|
||||
"""
|
||||
This script implements the `mach devtools-css-db` command. It runs the C preprocessor
|
||||
on the CSS properties header file to get the list of preferences associated with
|
||||
a specific property, and it runs an xpcshell script that uses inIDOMUtils to query
|
||||
the CSS properties used by the browser. This information is used to generate the
|
||||
properties-db.js file.
|
||||
"""
|
||||
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import string
|
||||
import subprocess
|
||||
from mozbuild import shellutil
|
||||
from mozbuild.base import (
|
||||
MozbuildObject,
|
||||
MachCommandBase,
|
||||
)
|
||||
from mach.decorators import (
|
||||
CommandProvider,
|
||||
Command,
|
||||
)
|
||||
|
||||
def resolve_path(start, relativePath):
|
||||
"""Helper to resolve a path from a start, and a relative path"""
|
||||
return os.path.normpath(os.path.join(start, relativePath))
|
||||
|
||||
@CommandProvider
|
||||
class MachCommands(MachCommandBase):
|
||||
@Command(
|
||||
'devtools-css-db', category='post-build',
|
||||
description='Rebuild the devtool\'s static css properties database.')
|
||||
def generate_css_db(self):
|
||||
"""Generate the static css properties database for devtools and write it to file."""
|
||||
|
||||
print("Re-generating the css properties database...")
|
||||
preferences = self.get_preferences()
|
||||
db = self.get_properties_db_from_xpcshell()
|
||||
|
||||
self.output_template({
|
||||
'preferences': json.dumps(preferences),
|
||||
'cssProperties': json.dumps(db['cssProperties']),
|
||||
'pseudoElements': json.dumps(db['pseudoElements'])})
|
||||
|
||||
def get_preferences(self):
|
||||
"""Get all of the preferences associated with enabling and disabling a property."""
|
||||
# Build the command to run the preprocessor on PythonCSSProps.h
|
||||
headerPath = resolve_path(self.topsrcdir, 'layout/style/PythonCSSProps.h')
|
||||
|
||||
cpp = self.substs['CPP']
|
||||
|
||||
if not cpp:
|
||||
print("Unable to find the cpp program. Please do a full, non-artifact")
|
||||
print("build and try this again.")
|
||||
sys.exit(1)
|
||||
|
||||
cmd = shellutil.split(cpp)
|
||||
cmd += shellutil.split(self.substs['ACDEFINES'])
|
||||
cmd.append(headerPath)
|
||||
|
||||
# The preprocessed list takes the following form:
|
||||
# [ (name, prop, id, flags, pref, proptype), ... ]
|
||||
preprocessed = eval(subprocess.check_output(cmd))
|
||||
|
||||
# Map this list
|
||||
# (name, prop, id, flags, pref, proptype) => (name, pref)
|
||||
preferences = [
|
||||
(name, pref)
|
||||
for name, prop, id, flags, pref, proptype in preprocessed
|
||||
if 'CSS_PROPERTY_INTERNAL' not in flags]
|
||||
|
||||
return preferences
|
||||
|
||||
def get_properties_db_from_xpcshell(self):
|
||||
"""Generate the static css properties db for devtools from an xpcshell script."""
|
||||
build = MozbuildObject.from_environment()
|
||||
|
||||
# Get the paths
|
||||
script_path = resolve_path(self.topsrcdir,
|
||||
'devtools/shared/css/generated/generate-properties-db.js')
|
||||
browser_path = resolve_path(self.topobjdir, 'dist/bin/browser')
|
||||
xpcshell_path = build.get_binary_path(what='xpcshell')
|
||||
print(browser_path)
|
||||
|
||||
# Run the xcpshell script, and set the appdir flag to the browser path so that
|
||||
# we have the proper dependencies for requiring the loader.
|
||||
contents = subprocess.check_output([xpcshell_path, '-a', browser_path,
|
||||
script_path])
|
||||
return json.loads(contents)
|
||||
|
||||
def output_template(self, substitutions):
|
||||
"""Output a the properties-db.js from a template."""
|
||||
js_template_path = resolve_path(self.topsrcdir,
|
||||
'devtools/shared/css/generated/properties-db.js.in')
|
||||
destination_path = resolve_path(self.topsrcdir,
|
||||
'devtools/shared/css/generated/properties-db.js')
|
||||
|
||||
with open(js_template_path, 'r') as handle:
|
||||
js_template = handle.read()
|
||||
|
||||
preamble = '/* THIS IS AN AUTOGENERATED FILE. DO NOT EDIT */\n\n'
|
||||
contents = string.Template(js_template).substitute(substitutions)
|
||||
|
||||
with open(destination_path, 'w') as destination:
|
||||
destination.write(preamble + contents)
|
||||
|
||||
print('The database was successfully generated at ' + destination_path)
|
9
devtools/shared/css/generated/moz.build
Normal file
9
devtools/shared/css/generated/moz.build
Normal file
@ -0,0 +1,9 @@
|
||||
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||
# vim: set filetype=python:
|
||||
# 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/.
|
||||
|
||||
DevToolsModules(
|
||||
'properties-db.js',
|
||||
)
|
32
devtools/shared/css/generated/properties-db.js
Normal file
32
devtools/shared/css/generated/properties-db.js
Normal file
File diff suppressed because one or more lines are too long
30
devtools/shared/css/generated/properties-db.js.in
Normal file
30
devtools/shared/css/generated/properties-db.js.in
Normal file
@ -0,0 +1,30 @@
|
||||
/* 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";
|
||||
|
||||
/**
|
||||
* This file is automatically generated by `mach devtools-css-db`. It contains
|
||||
* a static list of CSS properties that can be computed by Gecko. The actual script
|
||||
* to generate these files can be found at devtools/shared/css/generate-properties-db.js.
|
||||
*/
|
||||
|
||||
/* eslint-disable max-len */
|
||||
|
||||
/**
|
||||
* A list of CSS Properties and their various characteristics.
|
||||
*/
|
||||
exports.CSS_PROPERTIES = ${cssProperties};
|
||||
|
||||
/**
|
||||
* A list of the pseudo elements.
|
||||
*/
|
||||
exports.PSEUDO_ELEMENTS = ${pseudoElements};
|
||||
|
||||
/**
|
||||
* A list of the preferences keys for whether a CSS property is enabled or not. This is
|
||||
* exposed for testing purposes.
|
||||
*/
|
||||
exports.PREFERENCES = ${preferences};
|
||||
|
||||
/* eslint-enable max-len */
|
@ -4,6 +4,10 @@
|
||||
# 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/.
|
||||
|
||||
DIRS += [
|
||||
'generated',
|
||||
]
|
||||
|
||||
DevToolsModules(
|
||||
'color-db.js',
|
||||
'color.js',
|
||||
|
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue
Block a user