Index: tools/dom/scripts/css_code_generator.py |
diff --git a/tools/dom/scripts/css_code_generator.py b/tools/dom/scripts/css_code_generator.py |
index a290c5fc83d1a253765fe5df0c465876cc127fd1..d3fdffa308af6a669ec3ab08bebad5bb7a0fa8d6 100644 |
--- a/tools/dom/scripts/css_code_generator.py |
+++ b/tools/dom/scripts/css_code_generator.py |
@@ -7,7 +7,7 @@ |
"""Generates CSSStyleDeclaration template file from css property definitions |
defined in WebKit.""" |
-import tempfile, os |
+import tempfile, os, re |
COMMENT_LINE_PREFIX = ' * ' |
# TODO(efortuna): Pull from DEPS so that we have latest css *in sync* with our |
@@ -16,6 +16,20 @@ SOURCE_PATH = 'CSSPropertyNames.in' |
#SOURCE_PATH = 'Source/WebCore/css/CSSPropertyNames.in' |
TEMPLATE_FILE = '../templates/html/impl/impl_CSSStyleDeclaration.darttemplate' |
+# These are the properties that are supported on all Dart project supported |
+# browsers as camelCased names on the CssStyleDeclaration. |
+BROWSER_PATHS = [ |
+ 'cssProperties.CSS21.txt', # Remove when we have samples from all browsers. |
+ 'cssProperties.ie9.txt', |
+ 'cssProperties.ie10.txt', |
+ 'cssProperties.ie11.txt', |
+ 'cssProperties.ff36.txt', |
+ 'cssProperties.chrome40.txt', |
+ 'cssProperties.safari-7.1.3.txt', |
+ 'cssProperties.mobileSafari-8.2.txt', |
+ 'cssProperties.iPad4Air.onGoogleSites.txt', |
+ ] |
+ |
# Supported annotations for any specific CSS properties. |
annotated = { |
'transition': '''@SupportedBrowser(SupportedBrowser.CHROME) |
@@ -24,6 +38,12 @@ annotated = { |
@SupportedBrowser(SupportedBrowser.SAFARI)''' |
} |
+class Error: |
+ def __init__(self, message): |
+ self.message = message |
+ def __repr__(self): |
+ return self.message |
+ |
def camelCaseName(name): |
"""Convert a CSS property name to a lowerCamelCase name.""" |
name = name.replace('-webkit-', '') |
@@ -35,17 +55,35 @@ def camelCaseName(name): |
words.append(word) |
return ''.join(words) |
+def dashifyName(camelName): |
+ def fix(match): |
+ return '-' + match.group(0).lower() |
+ return re.sub(r'[A-Z]', fix, camelName) |
+ |
+def isCommentLine(line): |
+ return line.strip() == '' or line.startswith('#') or line.startswith('//') |
+ |
+def readCssProperties(filename): |
+ data = open(filename).readlines() |
+ data = sorted([d.strip() for d in set(data) if not isCommentLine(d)]) |
+ return data |
+ |
def GenerateCssTemplateFile(): |
data = open(SOURCE_PATH).readlines() |
# filter CSSPropertyNames.in to only the properties |
# TODO(efortuna): do we also want CSSPropertyNames.in? |
- data = [d[:-1] for d in data |
- if len(d) > 1 |
- and not d.startswith('#') |
- and not d.startswith('//') |
+ data = [d.strip() for d in data |
+ if not isCommentLine(d) |
and not '=' in d] |
+ browser_props = [readCssProperties(file) for file in BROWSER_PATHS] |
+ universal_properties = reduce( |
+ lambda a, b: set(a).intersection(b), browser_props) |
+ universal_properties = universal_properties.difference(['cssText']) |
+ universal_properties = universal_properties.intersection( |
+ map(camelCaseName, data)) |
+ |
class_file = open(TEMPLATE_FILE, 'w') |
class_file.write(""" |
@@ -60,8 +98,11 @@ def GenerateCssTemplateFile(): |
// %s |
part of $LIBRARYNAME; |
+""" % SOURCE_PATH) |
+ |
-$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS) class $CLASSNAME $EXTENDS with |
+ class_file.write(""" |
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME $EXTENDS with |
$(CLASSNAME)Base $IMPLEMENTS { |
factory $CLASSNAME() => new CssStyleDeclaration.css(''); |
@@ -176,6 +217,28 @@ $else |
static bool get supportsTransitions => true; |
$endif |
$!MEMBERS |
+$if DART2JS |
+""") |
+ |
+ for camelName in sorted(universal_properties): |
+ property = dashifyName(camelName) |
+ class_file.write(""" |
+ /** Gets the value of "%s" */ |
+ String get %s => this._%s; |
+ |
+ /** Sets the value of "%s" */ |
+ void set %s(String value) { |
+ _%s = value == null ? '' : value; |
+ } |
+ @Returns('String') |
+ @JSName('%s') |
+ String _%s; |
+ """ % (property, camelName, camelName, |
+ property, camelName, camelName, |
+ camelName, camelName)) |
+ |
+ class_file.write(""" |
+$endif |
} |
class _CssStyleDeclarationSet extends Object with CssStyleDeclarationBase { |
@@ -195,6 +258,32 @@ class _CssStyleDeclarationSet extends Object with CssStyleDeclarationBase { |
_elementCssStyleDeclarationSetIterable.forEach((e) => |
e.setProperty(propertyName, value, priority)); |
} |
+ |
+""") |
+ |
+ class_file.write(""" |
+$if DART2JS |
+ void _setAll(String propertyName, String value) { |
+ value = value == null ? '' : value; |
+ for (Element element in _elementIterable) { |
+ JS('void', '#.style[#] = #', element, propertyName, value); |
+ } |
+ } |
+""") |
+ |
+ |
+ for camelName in sorted(universal_properties): |
+ property = dashifyName(camelName) |
+ class_file.write(""" |
+ /** Sets the value of "%s" */ |
+ void set %s(String value) { |
+ _setAll('%s', value); |
+ } |
+ """ % (property, camelName, camelName)) |
+ |
+ class_file.write(""" |
+$endif |
+ |
// Important note: CssStyleDeclarationSet does NOT implement every method |
// available in CssStyleDeclaration. Some of the methods don't make so much |
// sense in terms of having a resonable value to return when you're |
@@ -205,12 +294,12 @@ class _CssStyleDeclarationSet extends Object with CssStyleDeclarationBase { |
abstract class CssStyleDeclarationBase { |
String getPropertyValue(String propertyName); |
void setProperty(String propertyName, String value, [String priority]); |
-""" % SOURCE_PATH) |
+""") |
class_lines = []; |
seen = set() |
- for prop in sorted(data, key=lambda p: camelCaseName(p)): |
+ for prop in sorted(data, key=camelCaseName): |
camel_case_name = camelCaseName(prop) |
upper_camel_case_name = camel_case_name[0].upper() + camel_case_name[1:]; |
css_name = prop.replace('-webkit-', '') |