| 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 18351ae6aad32ddbaa0fd5c0bd9ca7417b085b3d..11bf7bcbf63ab04d2a66e2c3307fbbbe35bcd465 100644
|
| --- a/tools/dom/scripts/css_code_generator.py
|
| +++ b/tools/dom/scripts/css_code_generator.py
|
| @@ -1,28 +1,28 @@
|
| -#!/usr/bin/python
|
| +#!/usr/bin/python2.6
|
| #
|
| -# Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
| +# Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
| # for details. All rights reserved. Use of this source code is governed by a
|
| # BSD-style license that can be found in the LICENSE file.
|
|
|
| -"""Generates CSSStyleDeclaration template file from css property definitions
|
| -defined in WebKit."""
|
| +"""Generates CSSStyleDeclaration from css property definitions defined in WebKit."""
|
|
|
| import tempfile, os
|
|
|
| COMMENT_LINE_PREFIX = ' * '
|
| -# TODO(efortuna): Pull from DEPS so that we have latest css *in sync* with our
|
| -# Dartium. Then remove the checked in CSSPropertyNames.in.
|
| -SOURCE_PATH = 'CSSPropertyNames.in'
|
| -#SOURCE_PATH = 'Source/WebCore/css/CSSPropertyNames.in'
|
| -TEMPLATE_FILE = '../templates/html/impl/impl_CSSStyleDeclaration.darttemplate'
|
| -
|
| -# Supported annotations for any specific CSS properties.
|
| -annotated = {
|
| - 'transition': '''@SupportedBrowser(SupportedBrowser.CHROME)
|
| - @SupportedBrowser(SupportedBrowser.FIREFOX)
|
| - @SupportedBrowser(SupportedBrowser.IE, '10')
|
| - @SupportedBrowser(SupportedBrowser.SAFARI)'''
|
| -}
|
| +SOURCE_PATH = 'Source/WebCore/css/CSSPropertyNames.in'
|
| +INPUT_URL = 'http://trac.webkit.org/export/latest/trunk/%s' % SOURCE_PATH
|
| +INTERFACE_FILE = '../../html/src/CSSStyleDeclaration.dart'
|
| +CLASS_FILE = '../../html/src/CSSStyleDeclarationWrappingImplementation.dart'
|
| +
|
| +def main():
|
| + _, css_names_file = tempfile.mkstemp('.CSSPropertyNames.in')
|
| + try:
|
| + if os.system('wget %s -O %s' % (INPUT_URL, css_names_file)):
|
| + return 1
|
| + generate_code(css_names_file)
|
| + print 'Successfully generated %s and %s' % (INTERFACE_FILE, CLASS_FILE)
|
| + finally:
|
| + os.remove(css_names_file)
|
|
|
| def camelCaseName(name):
|
| """Convert a CSS property name to a lowerCamelCase name."""
|
| @@ -35,196 +35,165 @@ def camelCaseName(name):
|
| words.append(word)
|
| return ''.join(words)
|
|
|
| -def GenerateCssTemplateFile():
|
| - data = open(SOURCE_PATH).readlines()
|
| +def generate_code(input_path):
|
| + data = open(input_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('//')
|
| and not '=' in d]
|
|
|
| - class_file = open(TEMPLATE_FILE, 'w')
|
| + interface_file = open(INTERFACE_FILE, 'w')
|
| + class_file = open(CLASS_FILE, 'w')
|
|
|
| - class_file.write("""
|
| -// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
|
| + interface_file.write("""
|
| +// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| -// WARNING: DO NOT EDIT THIS TEMPLATE FILE.
|
| -// The template file was generated by scripts/css_code_generator.py
|
| +// WARNING: Do not edit.
|
| +// This file was generated by html/scripts/css_code_generator.py
|
|
|
| // Source of CSS properties:
|
| // %s
|
|
|
| -part of $LIBRARYNAME;
|
| +// TODO(jacobr): add versions that take numeric values in px, miliseconds, etc.
|
|
|
| -$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS) class $CLASSNAME $EXTENDS with
|
| - $(CLASSNAME)Base $IMPLEMENTS {
|
| - factory $CLASSNAME() => new CssStyleDeclaration.css('');
|
| +interface CSSStyleDeclaration {
|
|
|
| - factory $CLASSNAME.css(String css) {
|
| - final style = new Element.tag('div').style;
|
| - style.cssText = css;
|
| - return style;
|
| - }
|
| + String get cssText;
|
|
|
| - String getPropertyValue(String propertyName) {
|
| - var propValue = _getPropertyValueHelper(propertyName);
|
| - return propValue != null ? propValue : '';
|
| - }
|
| + void set cssText(String value);
|
| +
|
| + int get length;
|
| +
|
| + CSSRule get parentRule;
|
| +
|
| + CSSValue getPropertyCSSValue(String propertyName);
|
| +
|
| + String getPropertyPriority(String propertyName);
|
| +
|
| + String getPropertyShorthand(String propertyName);
|
| +
|
| + String getPropertyValue(String propertyName);
|
| +
|
| + bool isPropertyImplicit(String propertyName);
|
| +
|
| + String item(int index);
|
| +
|
| + String removeProperty(String propertyName);
|
| +
|
| + void setProperty(String propertyName, String value, [String priority]);
|
| +
|
| +""".lstrip() % SOURCE_PATH)
|
| +
|
| +
|
| + class_file.write("""
|
| +// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
| +// for details. All rights reserved. Use of this source code is governed by a
|
| +// BSD-style license that can be found in the LICENSE file.
|
| +
|
| +// WARNING: Do not edit.
|
| +// This file was generated by html/scripts/css_code_generator.py
|
| +
|
| +// Source of CSS properties:
|
| +// %s
|
|
|
| - String _getPropertyValueHelper(String propertyName) {
|
| - if (_supportsProperty(_camelCase(propertyName))) {
|
| - return _getPropertyValue(propertyName);
|
| - } else {
|
| - return _getPropertyValue(Device.cssPrefix + propertyName);
|
| +// TODO(jacobr): add versions that take numeric values in px, miliseconds, etc.
|
| +
|
| +class CSSStyleDeclarationWrappingImplementation extends DOMWrapperBase implements CSSStyleDeclaration {
|
| + static String _cachedBrowserPrefix;
|
| +
|
| + CSSStyleDeclarationWrappingImplementation._wrap(ptr) : super._wrap(ptr) {}
|
| +
|
| + static String get _browserPrefix {
|
| + if (_cachedBrowserPrefix == null) {
|
| + if (_Device.isFirefox) {
|
| + _cachedBrowserPrefix = '-moz-';
|
| + } else {
|
| + _cachedBrowserPrefix = '-webkit-';
|
| + }
|
| + // TODO(jacobr): support IE 9.0 and Opera as well.
|
| }
|
| + return _cachedBrowserPrefix;
|
| }
|
|
|
| - /**
|
| - * Returns true if the provided *CSS* property name is supported on this
|
| - * element.
|
| - *
|
| - * Please note the property name camelCase, not-hyphens. This
|
| - * method returns true if the property is accessible via an unprefixed _or_
|
| - * prefixed property.
|
| - */
|
| - bool supportsProperty(String propertyName) {
|
| - return _supportsProperty(propertyName) ||
|
| - _supportsProperty(_camelCase(Device.cssPrefix + propertyName));
|
| + String get cssText { return _ptr.cssText; }
|
| +
|
| + void set cssText(String value) { _ptr.cssText = value; }
|
| +
|
| + int get length { return _ptr.length; }
|
| +
|
| + CSSRule get parentRule { return LevelDom.wrapCSSRule(_ptr.parentRule); }
|
| +
|
| + CSSValue getPropertyCSSValue(String propertyName) {
|
| + return LevelDom.wrapCSSValue(_ptr.getPropertyCSSValue(propertyName));
|
| }
|
|
|
| - bool _supportsProperty(String propertyName) {
|
| -$if DART2JS
|
| - return JS('bool', '# in #', propertyName, this);
|
| -$else
|
| - // You can't just check the value of a property, because there is no way
|
| - // to distinguish between property not being present in the browser and
|
| - // not having a value at all. (Ultimately we'll want the native method to
|
| - // return null if the property doesn't exist and empty string if it's
|
| - // defined but just doesn't have a value.
|
| - return _hasProperty(propertyName);
|
| -$endif
|
| + String getPropertyPriority(String propertyName) {
|
| + return _ptr.getPropertyPriority(propertyName);
|
| }
|
| -$if DARTIUM
|
| -
|
| - bool _hasProperty(String propertyName) =>
|
| - _blink.BlinkCSSStyleDeclaration.$__propertyQuery___Callback(this, propertyName);
|
| -$endif
|
| -
|
| - @DomName('CSSStyleDeclaration.setProperty')
|
| - void setProperty(String propertyName, String value, [String priority]) {
|
| - if (_supportsProperty(_camelCase(propertyName))) {
|
| - return _setPropertyHelper(propertyName, value, priority);
|
| - } else {
|
| - return _setPropertyHelper(Device.cssPrefix + propertyName, value,
|
| - priority);
|
| - }
|
| +
|
| + String getPropertyShorthand(String propertyName) {
|
| + return _ptr.getPropertyShorthand(propertyName);
|
| }
|
|
|
| - String _camelCase(String hyphenated) {
|
| - bool firstWord = true;
|
| - return hyphenated.splitMapJoin('-', onMatch : (_) => '',
|
| - onNonMatch : (String word) {
|
| - if (word.length > 0) {
|
| - if (firstWord) {
|
| - firstWord = false;
|
| - return word;
|
| - }
|
| - return word[0].toUpperCase() + word.substring(1);
|
| - }
|
| - return '';
|
| - });
|
| + String getPropertyValue(String propertyName) {
|
| + return _ptr.getPropertyValue(propertyName);
|
| }
|
|
|
| -$if DART2JS
|
| - void _setPropertyHelper(String propertyName, String value, [String priority]) {
|
| - // try/catch for IE9 which throws on unsupported values.
|
| - try {
|
| - if (value == null) value = '';
|
| - if (priority == null) {
|
| - priority = '';
|
| - }
|
| - JS('void', '#.setProperty(#, #, #)', this, propertyName, value, priority);
|
| - // Bug #2772, IE9 requires a poke to actually apply the value.
|
| - if (JS('bool', '!!#.setAttribute', this)) {
|
| - JS('void', '#.setAttribute(#, #)', this, propertyName, value);
|
| - }
|
| - } catch (e) {}
|
| + bool isPropertyImplicit(String propertyName) {
|
| + return _ptr.isPropertyImplicit(propertyName);
|
| }
|
|
|
| - /**
|
| - * Checks to see if CSS Transitions are supported.
|
| - */
|
| - static bool get supportsTransitions {
|
| - return supportsProperty('transition');
|
| + String item(int index) {
|
| + return _ptr.item(index);
|
| }
|
| -$else
|
| - void _setPropertyHelper(String propertyName, String value, [String priority]) {
|
| - if (priority == null) {
|
| - priority = '';
|
| - }
|
| - _setProperty(propertyName, value, priority);
|
| +
|
| + String removeProperty(String propertyName) {
|
| + return _ptr.removeProperty(propertyName);
|
| }
|
|
|
| - /**
|
| - * Checks to see if CSS Transitions are supported.
|
| - */
|
| - static bool get supportsTransitions => true;
|
| -$endif
|
| -$!MEMBERS
|
| -}
|
| -
|
| -class _CssStyleDeclarationSet extends Object with CssStyleDeclarationBase {
|
| - final Iterable<Element> _elementIterable;
|
| - Iterable<CssStyleDeclaration> _elementCssStyleDeclarationSetIterable;
|
| -
|
| - _CssStyleDeclarationSet(this._elementIterable) {
|
| - _elementCssStyleDeclarationSetIterable = new List.from(
|
| - _elementIterable).map((e) => e.style);
|
| + void setProperty(String propertyName, String value, [String priority = '']) {
|
| + _ptr.setProperty(propertyName, value, priority);
|
| }
|
|
|
| - String getPropertyValue(String propertyName) =>
|
| - _elementCssStyleDeclarationSetIterable.first.getPropertyValue(
|
| - propertyName);
|
| + String get typeName { return "CSSStyleDeclaration"; }
|
|
|
| - void setProperty(String propertyName, String value, [String priority]) {
|
| - _elementCssStyleDeclarationSetIterable.forEach((e) =>
|
| - e.setProperty(propertyName, value, priority));
|
| - }
|
| - // 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
|
| - // considering a list of Elements. You will need to manually add any of the
|
| - // items in the MEMBERS set if you want that functionality.
|
| -}
|
| -
|
| -abstract class CssStyleDeclarationBase {
|
| - String getPropertyValue(String propertyName);
|
| - void setProperty(String propertyName, String value, [String priority]);
|
| -""" % SOURCE_PATH)
|
| +""".lstrip() % SOURCE_PATH)
|
|
|
| + interface_lines = [];
|
| class_lines = [];
|
|
|
| seen = set()
|
| for prop in sorted(data, key=lambda p: camelCaseName(p)):
|
| camel_case_name = camelCaseName(prop)
|
| upper_camel_case_name = camel_case_name[0].upper() + camel_case_name[1:];
|
| - css_name = prop.replace('-webkit-', '')
|
| + css_name = prop.replace('-webkit-', '${_browserPrefix}')
|
| base_css_name = prop.replace('-webkit-', '')
|
|
|
| - if base_css_name in seen or base_css_name.startswith('-internal'):
|
| + if base_css_name in seen:
|
| continue
|
| seen.add(base_css_name)
|
|
|
| comment = ' /** %s the value of "' + base_css_name + '" */'
|
| +
|
| + interface_lines.append(comment % 'Gets')
|
| + interface_lines.append("""
|
| + String get %s;
|
| +
|
| +""" % camel_case_name)
|
| +
|
| + interface_lines.append(comment % 'Sets')
|
| + interface_lines.append("""
|
| + void set %s(String value);
|
| +
|
| +""" % camel_case_name)
|
| +
|
| class_lines.append('\n');
|
| class_lines.append(comment % 'Gets')
|
| - if base_css_name in annotated:
|
| - class_lines.append(annotated[base_css_name])
|
| class_lines.append("""
|
| String get %s =>
|
| getPropertyValue('%s');
|
| @@ -232,14 +201,19 @@ abstract class CssStyleDeclarationBase {
|
| """ % (camel_case_name, css_name))
|
|
|
| class_lines.append(comment % 'Sets')
|
| - if base_css_name in annotated:
|
| - class_lines.append(annotated[base_css_name])
|
| class_lines.append("""
|
| void set %s(String value) {
|
| setProperty('%s', value, '');
|
| }
|
| """ % (camel_case_name, css_name))
|
|
|
| + interface_file.write(''.join(interface_lines));
|
| + interface_file.write('}\n')
|
| + interface_file.close()
|
| +
|
| class_file.write(''.join(class_lines));
|
| class_file.write('}\n')
|
| class_file.close()
|
| +
|
| +if __name__ == '__main__':
|
| + main()
|
|
|