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

Side by Side Diff: lib/dom/src/native_EventsImplementation.dart

Issue 10332144: Move html events generation to domimpl. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments Created 8 years, 7 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
(Empty)
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
3 // BSD-style license that can be found in the LICENSE file.
4
5 class EventsImplementation implements html.Events {
6
7 final EventTarget _ptr;
8
9 final Map<String, html.EventListenerList> _listenerMap;
10
11 EventsImplementation(this._ptr) : _listenerMap = <html.EventListenerList>{};
12
13 html.EventListenerList operator [](String type) => _get(type);
14
15 html.EventListenerList _get(String type) {
16 return _listenerMap.putIfAbsent(type,
17 () => new EventListenerListImplementation(_ptr, type));
18 }
19 }
20
21 class EventListenerWrapper {
22 final html.EventListener raw;
23 final Function wrapped;
24 final bool useCapture;
25 EventListenerWrapper(this.raw, this.wrapped, this.useCapture);
26 }
27
28 class EventListenerListImplementation implements html.EventListenerList {
29 final EventTarget _ptr;
30 final String _type;
31 List<EventListenerWrapper> _wrappers;
32
33 EventListenerListImplementation(this._ptr, this._type)
34 // TODO(jacobr): switch to <EventListenerWrapper>[] when the VM allow it.
35 : _wrappers = new List<EventListenerWrapper>();
36
37 html.EventListenerList add(html.EventListener listener, [bool useCapture = fal se]) {
38 _add(listener, useCapture);
39 return this;
40 }
41
42 html.EventListenerList remove(html.EventListener listener, [bool useCapture = false]) {
43 _remove(listener, useCapture);
44 return this;
45 }
46
47 bool dispatch(html.Event evt) {
48 // TODO(jacobr): what is the correct behavior here. We could alternately
49 // force the event to have the expected type.
50 assert(evt.type == _type);
51 return _ptr.dispatchEvent(html.unwrap_internal(evt));
52 }
53
54 void _add(html.EventListener listener, bool useCapture) {
55 _ptr.addEventListener(_type,
56 _findOrAddWrapper(listener, useCapture),
57 useCapture);
58 }
59
60 void _remove(html.EventListener listener, bool useCapture) {
61 Function wrapper = _removeWrapper(listener, useCapture);
62 if (wrapper !== null) {
63 _ptr.removeEventListener(_type, wrapper, useCapture);
64 }
65 }
66
67 Function _removeWrapper(html.EventListener listener, bool useCapture) {
68 if (_wrappers === null) {
69 return null;
70 }
71 for (int i = 0; i < _wrappers.length; i++) {
72 EventListenerWrapper wrapper = _wrappers[i];
73 if (wrapper.raw === listener && wrapper.useCapture == useCapture) {
74 // Order doesn't matter so we swap with the last element instead of
75 // performing a more expensive remove from the middle of the list.
76 if (i + 1 != _wrappers.length) {
77 _wrappers[i] = _wrappers.removeLast();
78 } else {
79 _wrappers.removeLast();
80 }
81 return wrapper.wrapped;
82 }
83 }
84 return null;
85 }
86
87 Function _findOrAddWrapper(html.EventListener listener, bool useCapture) {
88 if (_wrappers === null) {
89 _wrappers = <EventListenerWrapper>[];
90 } else {
91 for (EventListenerWrapper wrapper in _wrappers) {
92 if (wrapper.raw === listener && wrapper.useCapture == useCapture) {
93 return wrapper.wrapped;
94 }
95 }
96 }
97 final wrapped = (e) { listener(html.wrap_internal(e)); };
98 _wrappers.add(new EventListenerWrapper(listener, wrapped, useCapture));
99 return wrapped;
100 }
101 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698