Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(359)

Side by Side Diff: tools/dom/templates/html/impl/impl_Element.darttemplate

Issue 21607003: Add Event delegation to Elements and groups of elements. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 part of $LIBRARYNAME; 5 part of $LIBRARYNAME;
6 6
7 class _ChildrenElementList extends ListBase<Element> { 7 class _ChildrenElementList extends ListBase<Element> {
8 // Raw Element. 8 // Raw Element.
9 final Element _element; 9 final Element _element;
10 final HtmlCollection _childElements; 10 final HtmlCollection _childElements;
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
237 * border + margin box in this list. 237 * border + margin box in this list.
238 * 238 *
239 * This returns a rectangle with the dimenions actually available for content 239 * This returns a rectangle with the dimenions actually available for content
240 * in this element, in pixels, regardless of this element's box-sizing 240 * in this element, in pixels, regardless of this element's box-sizing
241 * property. Unlike [getBoundingClientRect], the dimensions of this rectangle 241 * property. Unlike [getBoundingClientRect], the dimensions of this rectangle
242 * will return the same numerical height if the element is hidden or not. This 242 * will return the same numerical height if the element is hidden or not. This
243 * can be used to retrieve jQuery's `outerHeight` value for an element. 243 * can be used to retrieve jQuery's `outerHeight` value for an element.
244 */ 244 */
245 @Experimental() 245 @Experimental()
246 CssRect get marginEdge; 246 CssRect get marginEdge;
247
248 @DomName('Element.onabort')
249 ElementStream<Event> get onAbort;
250 @DomName('Element.onbeforecopy')
blois 2013/08/08 00:12:11 Is it necessary to do all events? I'm worried abou
Emily Fortuna 2013/08/09 00:22:06 Now with autogeneration!
251 ElementStream<Event> get onBeforeCopy;
252 @DomName('Element.onbeforecut')
253 ElementStream<Event> get onBeforeCut;
254 @DomName('Element.onbeforepaste')
255 ElementStream<Event> get onBeforePaste;
256 @DomName('Element.onblur')
257 ElementStream<Event> get onBlur;
258 @DomName('Element.onchange')
259 ElementStream<Event> get onChange;
260 @DomName('Element.onclick')
261 ElementStream<MouseEvent> get onClick;
262 @DomName('Element.oncontextmenu')
263 ElementStream<MouseEvent> get onContextMenu;
264 @DomName('Element.oncopy')
265 ElementStream<Event> get onCopy;
266 @DomName('Element.oncut')
267 ElementStream<Event> get onCut;
268 @DomName('Element.ondblclick')
269 ElementStream<Event> get onDoubleClick;
270 @DomName('Element.ondrag')
271 ElementStream<MouseEvent> get onDrag;
272 @DomName('Element.ondragend')
273 ElementStream<MouseEvent> get onDragEnd;
274 @DomName('Element.ondragenter')
275 ElementStream<MouseEvent> get onDragEnter;
276 @DomName('Element.ondragleave')
277 ElementStream<MouseEvent> get onDragLeave;
278 @DomName('Element.ondragover')
279 ElementStream<MouseEvent> get onDragOver;
280 @DomName('Element.ondragstart')
281 ElementStream<MouseEvent> get onDragStart;
282 @DomName('Element.ondrop')
283 ElementStream<MouseEvent> get onDrop;
284 @DomName('Element.onerror')
285 ElementStream<Event> get onError;
286 @DomName('Element.onfocus')
287 ElementStream<Event> get onFocus;
288 @DomName('Element.oninput')
289 ElementStream<Event> get onInput;
290 @DomName('Element.oninvalid')
291 ElementStream<Event> get onInvalid;
292 @DomName('Element.onkeydown')
293 ElementStream<KeyboardEvent> get onKeyDown;
294 @DomName('Element.onkeypress')
295 ElementStream<KeyboardEvent> get onKeyPress;
296 @DomName('Element.onkeyup')
297 ElementStream<KeyboardEvent> get onKeyUp;
298 @DomName('Element.onload')
299 ElementStream<Event> get onLoad;
300 @DomName('Element.onmousedown')
301 ElementStream<MouseEvent> get onMouseDown;
302 @DomName('Element.onmousemove')
303 ElementStream<MouseEvent> get onMouseMove;
304 @DomName('Element.onmouseout')
305 ElementStream<MouseEvent> get onMouseOut;
306 @DomName('Element.onmouseover')
307 ElementStream<MouseEvent> get onMouseOver;
308 @DomName('Element.onmouseup')
309 ElementStream<MouseEvent> get onMouseUp;
310 @DomName('Element.onmousewheel')
311 ElementStream<WheelEvent> get onMouseWheel;
312 @DomName('Element.onpaste')
313 ElementStream<Event> get onPaste;
314 @DomName('Element.onreset')
315 ElementStream<Event> get onReset;
316 @DomName('Element.onscroll')
317 ElementStream<Event> get onScroll;
318 @DomName('Element.onsearch')
319 ElementStream<Event> get onSearch;
320 @DomName('Element.onselect')
321 ElementStream<Event> get onSelect;
322 @DomName('Element.onselectstart')
323 ElementStream<Event> get onSelectStart;
324 @DomName('Element.onsubmit')
325 ElementStream<Event> get onSubmit;
326 @DomName('Element.ontouchcancel')
327 ElementStream<TouchEvent> get onTouchCancel;
328 @DomName('Element.ontouchend')
329 ElementStream<TouchEvent> get onTouchEnd;
330 @DomName('Element.ontouchenter')
331 ElementStream<TouchEvent> get onTouchEnter;
332 @DomName('Element.ontouchleave')
333 ElementStream<TouchEvent> get onTouchLeave;
334 @DomName('Element.ontouchmove')
335 ElementStream<TouchEvent> get onTouchMove;
336 @DomName('Element.ontouchl')
337 ElementStream<TouchEvent> get onTouchStart;
338 @DomName('Element.ontransitionend')
339 @SupportedBrowser(SupportedBrowser.CHROME)
340 @SupportedBrowser(SupportedBrowser.FIREFOX)
341 @SupportedBrowser(SupportedBrowser.IE, '10')
342 @SupportedBrowser(SupportedBrowser.SAFARI)
343 ElementStream<TransitionEvent> get onTransitionEnd;
344 @DomName('Element.onwebkitfullscreenchange')
345 ElementStream<Event> get onFullscreenChange;
346 @DomName('Element.onwebkitfullscreenerror')
347 ElementStream<Event> get onFullscreenError;
247 } 348 }
248 349
249 // TODO(jacobr): this is an inefficient implementation but it is hard to see 350 // TODO(jacobr): this is an inefficient implementation but it is hard to see
250 // a better option given that we cannot quite force NodeList to be an 351 // a better option given that we cannot quite force NodeList to be an
251 // ElementList as there are valid cases where a NodeList JavaScript object 352 // ElementList as there are valid cases where a NodeList JavaScript object
252 // contains Node objects that are not Elements. 353 // contains Node objects that are not Elements.
253 class _FrozenElementList<T extends Element> extends ListBase<T> implements Eleme ntList { 354 class _FrozenElementList<T extends Element> extends ListBase<T> implements Eleme ntList {
254 final List<Node> _nodeList; 355 final List<Node> _nodeList;
255 // The subset of _nodeList that are Elements. 356 // The subset of _nodeList that are Elements.
256 List<Element> _elementList; 357 List<Element> _elementList;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 _elementList.forEach((e) => e.classes = value); 391 _elementList.forEach((e) => e.classes = value);
291 } 392 }
292 393
293 CssRect get contentEdge => new _ContentCssListRect(_elementList); 394 CssRect get contentEdge => new _ContentCssListRect(_elementList);
294 395
295 CssRect get paddingEdge => _elementList.first.paddingEdge; 396 CssRect get paddingEdge => _elementList.first.paddingEdge;
296 397
297 CssRect get borderEdge => _elementList.first.borderEdge; 398 CssRect get borderEdge => _elementList.first.borderEdge;
298 399
299 CssRect get marginEdge => _elementList.first.marginEdge; 400 CssRect get marginEdge => _elementList.first.marginEdge;
401
402 ElementStream<Event> get onAbort =>
403 Element.abortEvent._forElementTargetList(this);
404 ElementStream<Event> get onBeforeCopy =>
405 Element.beforeCopyEvent._forElementTargetList(this);
406 ElementStream<Event> get onBeforeCut =>
407 Element.beforeCutEvent._forElementTargetList(this);
408 ElementStream<Event> get onBeforePaste =>
409 Element.beforePasteEvent._forElementTargetList(this);
410 ElementStream<Event> get onBlur =>
411 Element.blurEvent._forElementTargetList(this);
412 ElementStream<Event> get onChange =>
413 Element.changeEvent._forElementTargetList(this);
414 ElementStream<MouseEvent> get onClick =>
415 Element.clickEvent._forElementTargetList(this);
416 ElementStream<MouseEvent> get onContextMenu =>
417 Element.contextMenuEvent._forElementTargetList(this);
418 ElementStream<Event> get onCopy =>
419 Element.copyEvent._forElementTargetList(this);
420 ElementStream<Event> get onCut =>
421 Element.cutEvent._forElementTargetList(this);
422 ElementStream<Event> get onDoubleClick =>
423 Element.doubleClickEvent._forElementTargetList(this);
424 ElementStream<MouseEvent> get onDrag =>
425 Element.dragEvent._forElementTargetList(this);
426 ElementStream<MouseEvent> get onDragEnd =>
427 Element.dragEndEvent._forElementTargetList(this);
428 ElementStream<MouseEvent> get onDragEnter =>
429 Element.dragEnterEvent._forElementTargetList(this);
430 ElementStream<MouseEvent> get onDragLeave =>
431 Element.dragLeaveEvent._forElementTargetList(this);
432 ElementStream<MouseEvent> get onDragOver =>
433 Element.dragOverEvent._forElementTargetList(this);
434 ElementStream<MouseEvent> get onDragStart =>
435 Element.dragStartEvent._forElementTargetList(this);
436 ElementStream<MouseEvent> get onDrop =>
437 Element.dropEvent._forElementTargetList(this);
438 ElementStream<Event> get onError =>
439 Element.errorEvent._forElementTargetList(this);
440 ElementStream<Event> get onFocus =>
441 Element.focusEvent._forElementTargetList(this);
442 ElementStream<Event> get onInput =>
443 Element.inputEvent._forElementTargetList(this);
444 ElementStream<Event> get onInvalid =>
445 Element.invalidEvent._forElementTargetList(this);
446 ElementStream<KeyboardEvent> get onKeyDown =>
447 Element.keyDownEvent._forElementTargetList(this);
448 ElementStream<KeyboardEvent> get onKeyPress =>
449 Element.keyPressEvent._forElementTargetList(this);
450 ElementStream<KeyboardEvent> get onKeyUp =>
451 Element.keyUpEvent._forElementTargetList(this);
452 ElementStream<Event> get onLoad =>
453 Element.loadEvent._forElementTargetList(this);
454 ElementStream<MouseEvent> get onMouseDown =>
455 Element.mouseDownEvent._forElementTargetList(this);
456 ElementStream<MouseEvent> get onMouseMove =>
457 Element.mouseMoveEvent._forElementTargetList(this);
458 ElementStream<MouseEvent> get onMouseOut =>
459 Element.mouseOutEvent._forElementTargetList(this);
460 ElementStream<MouseEvent> get onMouseOver =>
461 Element.mouseOverEvent._forElementTargetList(this);
462 ElementStream<MouseEvent> get onMouseUp =>
463 Element.mouseUpEvent._forElementTargetList(this);
464 ElementStream<WheelEvent> get onMouseWheel =>
465 Element.mouseWheelEvent._forElementTargetList(this);
466 ElementStream<Event> get onPaste =>
467 Element.pasteEvent._forElementTargetList(this);
468 ElementStream<Event> get onReset =>
469 Element.resetEvent._forElementTargetList(this);
470 ElementStream<Event> get onScroll =>
471 Element.scrollEvent._forElementTargetList(this);
472 ElementStream<Event> get onSearch =>
473 Element.searchEvent._forElementTargetList(this);
474 ElementStream<Event> get onSelect =>
475 Element.selectEvent._forElementTargetList(this);
476 ElementStream<Event> get onSelectStart =>
477 Element.selectStartEvent._forElementTargetList(this);
478 ElementStream<Event> get onSubmit =>
479 Element.submitEvent._forElementTargetList(this);
480 ElementStream<TouchEvent> get onTouchCancel =>
481 Element.touchCancelEvent._forElementTargetList(this);
482 ElementStream<TouchEvent> get onTouchEnd =>
483 Element.touchEndEvent._forElementTargetList(this);
484 ElementStream<TouchEvent> get onTouchEnter =>
485 Element.touchEnterEvent._forElementTargetList(this);
486 ElementStream<TouchEvent> get onTouchLeave =>
487 Element.touchLeaveEvent._forElementTargetList(this);
488 ElementStream<TouchEvent> get onTouchMove =>
489 Element.touchMoveEvent._forElementTargetList(this);
490 ElementStream<TouchEvent> get onTouchStart =>
491 Element.touchStartEvent._forElementTargetList(this);
492 ElementStream<TransitionEvent> get onTransitionEnd =>
493 Element.transitionEndEvent._forElementTargetList(this);
494 ElementStream<Event> get onFullscreenChange =>
495 Element.fullscreenChangeEvent._forElementTargetList(this);
496 ElementStream<Event> get onFullscreenError =>
497 Element.fullscreenErrorEvent._forElementTargetList(this);
300 } 498 }
301 499
302 /** 500 /**
303 * An abstract class, which all HTML elements extend. 501 * An abstract class, which all HTML elements extend.
304 */ 502 */
305 $(ANNOTATIONS)abstract class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC { 503 $(ANNOTATIONS)abstract class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
306 504
307 /** 505 /**
308 * Creates an HTML element from a valid fragment of HTML. 506 * Creates an HTML element from a valid fragment of HTML.
309 * 507 *
(...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after
868 case 'afterend': 1066 case 'afterend':
869 this.parentNode.insertBefore(node, this.nextNode); 1067 this.parentNode.insertBefore(node, this.nextNode);
870 break; 1068 break;
871 default: 1069 default:
872 throw new ArgumentError("Invalid position ${where}"); 1070 throw new ArgumentError("Invalid position ${where}");
873 } 1071 }
874 } 1072 }
875 1073
876 /** 1074 /**
877 * Checks if this element matches the CSS selectors. 1075 * Checks if this element matches the CSS selectors.
1076 *
1077 * If `includeAncestors` is true, we examine all of this element's parent
1078 * elements and also return true if any of its parent elements matches
1079 * `selectors`.
878 */ 1080 */
879 @Experimental() 1081 @Experimental()
880 bool matches(String selectors) { 1082 bool matches(String selectors, [includeAncestors = false]) {
blois 2013/08/08 00:12:11 This API should become an inlined native API, I'm
Emily Fortuna 2013/08/09 00:22:06 Where is there information about it becoming an in
881 if (JS('bool', '!!#.matches', this)) { 1083 var elem = this;
882 return JS('bool', '#.matches(#)', this, selectors); 1084 do {
883 } else if (JS('bool', '!!#.webkitMatchesSelector', this)) { 1085 bool matches = false;
884 return JS('bool', '#.webkitMatchesSelector(#)', this, selectors); 1086 if (JS('bool', '!!#.matches', elem)) {
885 } else if (JS('bool', '!!#.mozMatchesSelector', this)) { 1087 matches = JS('bool', '#.matches(#)', elem, selectors);
886 return JS('bool', '#.mozMatchesSelector(#)', this, selectors); 1088 } else if (JS('bool', '!!#.webkitMatchesSelector', elem)) {
887 } else if (JS('bool', '!!#.msMatchesSelector', this)) { 1089 matches = JS('bool', '#.webkitMatchesSelector(#)', elem, selectors);
888 return JS('bool', '#.msMatchesSelector(#)', this, selectors); 1090 } else if (JS('bool', '!!#.mozMatchesSelector', elem)) {
889 } 1091 matches = JS('bool', '#.mozMatchesSelector(#)', elem, selectors);
890 throw new UnsupportedError("Not supported on this platform"); 1092 } else if (JS('bool', '!!#.msMatchesSelector', elem)) {
1093 matches = JS('bool', '#.msMatchesSelector(#)', elem, selectors);
1094 } else {
1095 throw new UnsupportedError("Not supported on this platform");
1096 }
1097 if (matches) return true;
1098 elem = elem.parent;
1099 } while(includeAncestors && elem != null);
1100 return false;
891 } 1101 }
892 $else 1102 $else
893 $endif 1103 $endif
894 1104
895 $if DART2JS 1105 $if DART2JS
896 @Creates('Null') // Set from Dart code; does not instantiate a native type. 1106 @Creates('Null') // Set from Dart code; does not instantiate a native type.
897 $endif 1107 $endif
898 Element _templateInstanceRef; 1108 Element _templateInstanceRef;
899 1109
900 // Note: only used if `this is! TemplateElement` 1110 // Note: only used if `this is! TemplateElement`
(...skipping 395 matching lines...) Expand 10 before | Expand all | Expand 10 after
1296 const ScrollAlignment._internal(this._value); 1506 const ScrollAlignment._internal(this._value);
1297 toString() => 'ScrollAlignment.$_value'; 1507 toString() => 'ScrollAlignment.$_value';
1298 1508
1299 /// Attempt to align the element to the top of the scrollable area. 1509 /// Attempt to align the element to the top of the scrollable area.
1300 static const TOP = const ScrollAlignment._internal('TOP'); 1510 static const TOP = const ScrollAlignment._internal('TOP');
1301 /// Attempt to center the element in the scrollable area. 1511 /// Attempt to center the element in the scrollable area.
1302 static const CENTER = const ScrollAlignment._internal('CENTER'); 1512 static const CENTER = const ScrollAlignment._internal('CENTER');
1303 /// Attempt to align the element to the bottom of the scrollable area. 1513 /// Attempt to align the element to the bottom of the scrollable area.
1304 static const BOTTOM = const ScrollAlignment._internal('BOTTOM'); 1514 static const BOTTOM = const ScrollAlignment._internal('BOTTOM');
1305 } 1515 }
OLDNEW
« tools/dom/src/EventStreamProvider.dart ('K') | « tools/dom/src/EventStreamProvider.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698