diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart index 5e1296e487b..2c9feae06dc 100644 --- a/sdk/lib/html/dart2js/html_dart2js.dart +++ b/sdk/lib/html/dart2js/html_dart2js.dart @@ -426,15 +426,6 @@ class AreaElement extends Element native "HTMLAreaElement" { // BSD-style license that can be found in the LICENSE file. -@DocsEditable -@DomName('Attr') -class Attr extends Node native "Attr" { -} -// Copyright (c) 2012, 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. - - @DocsEditable @DomName('HTMLAudioElement') class AudioElement extends MediaElement native "HTMLAudioElement" { @@ -7660,6 +7651,16 @@ abstract class Element extends Node implements ElementTraversal native "Element" _xtag = value; } + @DomName('Element.localName') + @DocsEditable + String get localName => $dom_localName; + + @DomName('Element.namespaceUri') + @DocsEditable + String get namespaceUri => $dom_namespaceUri; + + String toString() => localName; + /** * Scrolls this element into view. * @@ -7714,7 +7715,7 @@ abstract class Element extends Node implements ElementTraversal native "Element" } } - @DomName('Element.webkitTransitionEndEvent') + @DomName('Element.transitionEndEvent') static const EventStreamProvider transitionEndEvent = const _CustomEventStreamProvider( Element._determineTransitionEventType); @@ -8872,13 +8873,12 @@ abstract class Element extends Node implements ElementTraversal native "Element" @Experimental Stream get onTouchStart => touchStartEvent.forTarget(this); - @DomName('Element.onwebkitTransitionEnd') + @DomName('Element.ontransitionend') @DocsEditable @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.FIREFOX) @SupportedBrowser(SupportedBrowser.IE, '10') @SupportedBrowser(SupportedBrowser.SAFARI) - @deprecated Stream get onTransitionEnd => transitionEndEvent.forTarget(this); @DomName('Element.onwebkitfullscreenchange') @@ -15847,8 +15847,7 @@ class Node extends EventTarget native "Node" { /** * Print out a String representation of this Node. */ - String toString() => localName == null ? - (nodeValue == null ? super.toString() : nodeValue) : localName; + String toString() => nodeValue == null ? super.toString() : nodeValue; /** * Binds the attribute [name] to the [path] of the [model]. @@ -15943,11 +15942,12 @@ class Node extends EventTarget native "Node" { @DocsEditable final Node $dom_lastChild; + @JSName('localName') @DomName('Node.localName') @DocsEditable // http://dom.spec.whatwg.org/#dom-node-localname @deprecated // deprecated - final String localName; + final String $dom_localName; @JSName('namespaceURI') @DomName('Node.namespaceURI') @@ -23238,6 +23238,10 @@ class Window extends EventTarget implements WindowBase native "Window,DOMWindow" @Experimental Stream get onTouchStart => Element.touchStartEvent.forTarget(this); + @DomName('Window.ontransitionend') + @DocsEditable + Stream get onTransitionEnd => Element.transitionEndEvent.forTarget(this); + @DomName('Window.onunload') @DocsEditable Stream get onUnload => unloadEvent.forTarget(this); @@ -23257,11 +23261,6 @@ class Window extends EventTarget implements WindowBase native "Window,DOMWindow" @Experimental // untriaged Stream get onAnimationStart => animationStartEvent.forTarget(this); - @DomName('Window.onwebkitTransitionEnd') - @DocsEditable - @deprecated - Stream get onTransitionEnd => Element.transitionEndEvent.forTarget(this); - @DomName('DOMWindow.beforeunloadEvent') @DocsEditable @@ -23635,6 +23634,37 @@ class XsltProcessor native "XSLTProcessor" { // BSD-style license that can be found in the LICENSE file. +@DocsEditable +@DomName('Attr') +class _Attr extends Node native "Attr" { + + @DomName('Attr.isId') + @DocsEditable + final bool isId; + + @DomName('Attr.name') + @DocsEditable + final String name; + + @DomName('Attr.ownerElement') + @DocsEditable + @deprecated // deprecated + final Element ownerElement; + + @DomName('Attr.specified') + @DocsEditable + @deprecated // deprecated + final bool specified; + + @DomName('Attr.value') + @DocsEditable + String value; +} +// Copyright (c) 2012, 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. + + @DocsEditable @DomName('CSSPrimitiveValue') // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface @@ -24875,7 +24905,7 @@ abstract class _AttributeMap implements Map { var keys = new List(); for (int i = 0, len = attributes.length; i < len; i++) { if (_matches(attributes[i])) { - keys.add(attributes[i].localName); + keys.add(attributes[i].name); } } return keys; diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart index 527f3754d61..c2222e27603 100644 --- a/sdk/lib/html/dartium/html_dartium.dart +++ b/sdk/lib/html/dartium/html_dartium.dart @@ -540,19 +540,6 @@ class AreaElement extends _Element_Merged { // WARNING: Do not edit - generated code. -@DocsEditable -@DomName('Attr') -class Attr extends Node { - Attr.internal() : super.internal(); - -} -// Copyright (c) 2012, 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 - generated code. - - @DocsEditable @DomName('HTMLAudioElement') class AudioElement extends MediaElement { @@ -8133,6 +8120,16 @@ abstract class Element extends Node implements ElementTraversal { _xtag = value; } + @DomName('Element.localName') + @DocsEditable + String get localName => $dom_localName; + + @DomName('Element.namespaceUri') + @DocsEditable + String get namespaceUri => $dom_namespaceUri; + + String toString() => localName; + /** * Scrolls this element into view. * @@ -8612,13 +8609,9 @@ abstract class Element extends Node implements ElementTraversal { @Experimental static const EventStreamProvider touchStartEvent = const EventStreamProvider('touchstart'); - @DomName('Element.webkitTransitionEndEvent') + @DomName('Element.transitionendEvent') @DocsEditable - @SupportedBrowser(SupportedBrowser.CHROME) - @SupportedBrowser(SupportedBrowser.SAFARI) - @Experimental - @deprecated - static const EventStreamProvider transitionEndEvent = const EventStreamProvider('webkitTransitionEnd'); + static const EventStreamProvider transitionEndEvent = const EventStreamProvider('transitionend'); @DomName('Element.webkitfullscreenchangeEvent') @DocsEditable @@ -9183,13 +9176,12 @@ abstract class Element extends Node implements ElementTraversal { @Experimental Stream get onTouchStart => touchStartEvent.forTarget(this); - @DomName('Element.onwebkitTransitionEnd') + @DomName('Element.ontransitionend') @DocsEditable @SupportedBrowser(SupportedBrowser.CHROME) @SupportedBrowser(SupportedBrowser.FIREFOX) @SupportedBrowser(SupportedBrowser.IE, '10') @SupportedBrowser(SupportedBrowser.SAFARI) - @deprecated Stream get onTransitionEnd => transitionEndEvent.forTarget(this); @DomName('Element.onwebkitfullscreenchange') @@ -16900,8 +16892,7 @@ class Node extends EventTarget { /** * Print out a String representation of this Node. */ - String toString() => localName == null ? - (nodeValue == null ? super.toString() : nodeValue) : localName; + String toString() => nodeValue == null ? super.toString() : nodeValue; /** * Binds the attribute [name] to the [path] of the [model]. @@ -16996,7 +16987,7 @@ class Node extends EventTarget { @DocsEditable // http://dom.spec.whatwg.org/#dom-node-localname @deprecated // deprecated - String get localName native "Node_localName_Getter"; + String get $dom_localName native "Node_localName_Getter"; @DomName('Node.namespaceURI') @DocsEditable @@ -24737,6 +24728,10 @@ class Window extends EventTarget implements WindowBase { @Experimental Stream get onTouchStart => Element.touchStartEvent.forTarget(this); + @DomName('Window.ontransitionend') + @DocsEditable + Stream get onTransitionEnd => Element.transitionEndEvent.forTarget(this); + @DomName('Window.onunload') @DocsEditable Stream get onUnload => unloadEvent.forTarget(this); @@ -24756,11 +24751,6 @@ class Window extends EventTarget implements WindowBase { @Experimental // untriaged Stream get onAnimationStart => animationStartEvent.forTarget(this); - @DomName('Window.onwebkitTransitionEnd') - @DocsEditable - @deprecated - Stream get onTransitionEnd => Element.transitionEndEvent.forTarget(this); - @DomName('DOMWindow.beforeunloadEvent') @DocsEditable @@ -25170,6 +25160,45 @@ class XsltProcessor extends NativeFieldWrapperClass1 { // WARNING: Do not edit - generated code. +@DocsEditable +@DomName('Attr') +class _Attr extends Node { + _Attr.internal() : super.internal(); + + @DomName('Attr.isId') + @DocsEditable + bool get isId native "Attr_isId_Getter"; + + @DomName('Attr.name') + @DocsEditable + String get name native "Attr_name_Getter"; + + @DomName('Attr.ownerElement') + @DocsEditable + @deprecated // deprecated + Element get ownerElement native "Attr_ownerElement_Getter"; + + @DomName('Attr.specified') + @DocsEditable + @deprecated // deprecated + bool get specified native "Attr_specified_Getter"; + + @DomName('Attr.value') + @DocsEditable + String get value native "Attr_value_Getter"; + + @DomName('Attr.value') + @DocsEditable + void set value(String value) native "Attr_value_Setter"; + +} +// Copyright (c) 2012, 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 - generated code. + + @DocsEditable @DomName('CSSPrimitiveValue') // http://dev.w3.org/csswg/cssom/#the-cssstyledeclaration-interface @@ -26749,7 +26778,7 @@ abstract class _AttributeMap implements Map { var keys = new List(); for (int i = 0, len = attributes.length; i < len; i++) { if (_matches(attributes[i])) { - keys.add(attributes[i].localName); + keys.add(attributes[i].name); } } return keys; diff --git a/tests/html/svg_attrs_test.dart b/tests/html/svg_attrs_test.dart new file mode 100644 index 00000000000..ae3e6257247 --- /dev/null +++ b/tests/html/svg_attrs_test.dart @@ -0,0 +1,47 @@ +// Copyright (c) 2013, 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. + +library SVGTest; +import '../../pkg/unittest/lib/unittest.dart'; +import '../../pkg/unittest/lib/html_config.dart'; +import 'dart:svg'; + +main() { + useHtmlConfiguration(); + + test('svg parsed attributes', () { + var content = """ + + +"""; + + var svg = new SvgElement.svg(content); + var img = svg.children[0]; + expect(img is ImageElement, isTrue); + var attrs = img.attributes; + expect(attrs.length, 0); + + var xlinkAttrs = + img.getNamespacedAttributes('http://www.w3.org/1999/xlink'); + expect(xlinkAttrs.length, 1); + expect(xlinkAttrs['href'], 'foo.jpg'); + + // validate that the namespaced attr was set by waiting for the image + // to fail to load. + return img.onError.first; + }); + + test('svg explicit attributes', () { + + var img = new ImageElement(); + var xlinkAttrs = + img.getNamespacedAttributes('http://www.w3.org/1999/xlink'); + xlinkAttrs['href'] = 'foo.jpg'; + + // validate that the namespaced attr was set by waiting for the image + // to fail to load. + return img.onError.first; + }); +} diff --git a/tools/dom/dom.json b/tools/dom/dom.json index c01a78fcfce..64d963ac558 100644 --- a/tools/dom/dom.json +++ b/tools/dom/dom.json @@ -2354,6 +2354,7 @@ "comment": "http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features", "support_level": "experimental" }, + "ontransitionend": {}, "onwebkitTransitionEnd": { "support_level": "deprecated" }, diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py index 9daed68ec8c..3cbd9959f10 100644 --- a/tools/dom/scripts/dartmetadata.py +++ b/tools/dom/scripts/dartmetadata.py @@ -279,7 +279,7 @@ _annotations = monitored.Dict('dartmetadata._annotations', { 'DOMWindow.webkitNotifications': _webkit_experimental_annotations, 'DOMWindow.webkitRequestFileSystem': _file_system_annotations, 'DOMWindow.webkitResolveLocalFileSystemURL': _file_system_annotations, - 'Element.onwebkitTransitionEnd': _all_but_ie9_annotations, + 'Element.ontransitionend': _all_but_ie9_annotations, # Placeholder to add experimental flag, implementation for this is # pending in a separate CL. 'Element.webkitMatchesSelector': ['@Experimental()'], diff --git a/tools/dom/scripts/htmleventgenerator.py b/tools/dom/scripts/htmleventgenerator.py index 5a006f5a430..c2ead7ced55 100644 --- a/tools/dom/scripts/htmleventgenerator.py +++ b/tools/dom/scripts/htmleventgenerator.py @@ -15,7 +15,7 @@ _logger = logging.getLogger('dartgenerator') # onEventName methods in the IDL but some events aren't listed so we need # to manually add them here so that they are easy for users to find. _html_manual_events = monitored.Dict('htmleventgenerator._html_manual_events', { - 'Element': ['touchleave', 'touchenter', 'webkitTransitionEnd'], + 'Element': ['touchleave', 'touchenter', 'transitionend'], 'Window': ['DOMContentLoaded'] }) @@ -28,7 +28,6 @@ _on_attribute_to_event_name_mapping = monitored.Dict( 'webkitanimationiteration': 'webkitAnimationIteration', 'webkitanimationstart': 'webkitAnimationStart', 'webkitspeechchange': 'webkitSpeechChange', - 'webkittransitionend': 'webkitTransitionEnd', }) _html_event_types = monitored.Dict('htmleventgenerator._html_event_types', { @@ -108,7 +107,7 @@ _html_event_types = monitored.Dict('htmleventgenerator._html_event_types', { '*.webkitAnimationEnd': ('animationEnd', 'AnimationEvent'), '*.webkitAnimationIteration': ('animationIteration', 'AnimationEvent'), '*.webkitAnimationStart': ('animationStart', 'AnimationEvent'), - '*.webkitTransitionEnd': ('transitionEnd', 'TransitionEvent'), + '*.transitionend': ('transitionEnd', 'TransitionEvent'), '*.webkitfullscreenchange': ('fullscreenChange', 'Event'), '*.webkitfullscreenerror': ('fullscreenError', 'Event'), 'AbstractWorker.error': ('error', 'ErrorEvent'), diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py index 7262ee1987e..b3d7354f225 100644 --- a/tools/dom/scripts/htmlrenamer.py +++ b/tools/dom/scripts/htmlrenamer.py @@ -23,6 +23,7 @@ typed_array_renames = { html_interface_renames = monitored.Dict('htmlrenamer.html_interface_renames', dict({ + 'Attr': '_Attr', 'CDATASection': 'CDataSection', 'Clipboard': 'DataTransfer', 'Database': 'SqlDatabase', # Avoid conflict with Index DB's Database. @@ -270,6 +271,7 @@ _private_html_members = monitored.Set('htmlrenamer._private_html_members', [ 'Node.childNodes', 'Node.firstChild', 'Node.lastChild', + 'Node.localName', 'Node.namespaceURI', 'Node.removeChild', 'Node.replaceChild', @@ -363,7 +365,6 @@ for member in convert_to_future_members: # to be suppressed but not the setter, etc. # TODO(jacobr): cleanup and augment this list. _removed_html_members = monitored.Set('htmlrenamer._removed_html_members', [ - 'Attr.*', 'AudioBufferSourceNode.looping', # TODO(vsm): Use deprecated IDL annotation 'CSSStyleDeclaration.getPropertyCSSValue', 'CanvasRenderingContext2D.clearShadow', diff --git a/tools/dom/src/AttributeMap.dart b/tools/dom/src/AttributeMap.dart index b0cb0cc7fe6..76a90648c18 100644 --- a/tools/dom/src/AttributeMap.dart +++ b/tools/dom/src/AttributeMap.dart @@ -44,7 +44,7 @@ abstract class _AttributeMap implements Map { var keys = new List(); for (int i = 0, len = attributes.length; i < len; i++) { if (_matches(attributes[i])) { - keys.add(attributes[i].localName); + keys.add(attributes[i].name); } } return keys; diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate index f3bb261b668..7b8a594ce6f 100644 --- a/tools/dom/templates/html/impl/impl_Element.darttemplate +++ b/tools/dom/templates/html/impl/impl_Element.darttemplate @@ -468,6 +468,16 @@ $endif _xtag = value; } + @DomName('Element.localName') + @DocsEditable + String get localName => $dom_localName; + + @DomName('Element.namespaceUri') + @DocsEditable + String get namespaceUri => $dom_namespaceUri; + + String toString() => localName; + /** * Scrolls this element into view. * @@ -525,7 +535,7 @@ $if DART2JS } } - @DomName('Element.webkitTransitionEndEvent') + @DomName('Element.transitionEndEvent') static const EventStreamProvider transitionEndEvent = const _CustomEventStreamProvider( Element._determineTransitionEventType); diff --git a/tools/dom/templates/html/impl/impl_Node.darttemplate b/tools/dom/templates/html/impl/impl_Node.darttemplate index 287151fb059..b40cdb329b5 100644 --- a/tools/dom/templates/html/impl/impl_Node.darttemplate +++ b/tools/dom/templates/html/impl/impl_Node.darttemplate @@ -249,8 +249,7 @@ $(ANNOTATIONS)class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC { /** * Print out a String representation of this Node. */ - String toString() => localName == null ? - (nodeValue == null ? super.toString() : nodeValue) : localName; + String toString() => nodeValue == null ? super.toString() : nodeValue; /** * Binds the attribute [name] to the [path] of the [model].