| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011, 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 // TODO(jacobr): use Lists.dart to remove some of the duplicated functionality. | |
| 6 class _ChildrenElementList implements ElementList { | |
| 7 // Raw Element. | |
| 8 final _element; | |
| 9 final _childElements; | |
| 10 | |
| 11 _ChildrenElementList._wrap(var element) | |
| 12 : _childElements = element.children, | |
| 13 _element = element; | |
| 14 | |
| 15 List<Element> _toList() { | |
| 16 final output = new List(_childElements.length); | |
| 17 for (int i = 0, len = _childElements.length; i < len; i++) { | |
| 18 output[i] = LevelDom.wrapElement(_childElements[i]); | |
| 19 } | |
| 20 return output; | |
| 21 } | |
| 22 | |
| 23 Element get first() { | |
| 24 return LevelDom.wrapElement(_element.firstElementChild); | |
| 25 } | |
| 26 | |
| 27 void forEach(void f(Element element)) => _toList().forEach(f); | |
| 28 | |
| 29 Collection map(f(Element element)) => _toList().map(f); | |
| 30 | |
| 31 ElementList filter(bool f(Element element)) => | |
| 32 new _ElementList(_toList().filter(f)); | |
| 33 | |
| 34 bool every(bool f(Element element)) { | |
| 35 for(Element element in this) { | |
| 36 if (!f(element)) { | |
| 37 return false; | |
| 38 } | |
| 39 }; | |
| 40 return true; | |
| 41 } | |
| 42 | |
| 43 bool some(bool f(Element element)) { | |
| 44 for(Element element in this) { | |
| 45 if (f(element)) { | |
| 46 return true; | |
| 47 } | |
| 48 }; | |
| 49 return false; | |
| 50 } | |
| 51 | |
| 52 bool isEmpty() { | |
| 53 return _element.firstElementChild === null; | |
| 54 } | |
| 55 | |
| 56 int get length() { | |
| 57 return _childElements.length; | |
| 58 } | |
| 59 | |
| 60 Element operator [](int index) { | |
| 61 return LevelDom.wrapElement(_childElements[index]); | |
| 62 } | |
| 63 | |
| 64 void operator []=(int index, Element value) { | |
| 65 _element.replaceChild(LevelDom.unwrap(value), _childElements.item(index)); | |
| 66 } | |
| 67 | |
| 68 void set length(int newLength) { | |
| 69 // TODO(jacobr): remove children when length is reduced. | |
| 70 throw const UnsupportedOperationException(''); | |
| 71 } | |
| 72 | |
| 73 Element add(Element value) { | |
| 74 _element.appendChild(LevelDom.unwrap(value)); | |
| 75 return value; | |
| 76 } | |
| 77 | |
| 78 Element addLast(Element value) => add(value); | |
| 79 | |
| 80 Iterator<Element> iterator() => _toList().iterator(); | |
| 81 | |
| 82 void addAll(Collection<Element> collection) { | |
| 83 for (Element element in collection) { | |
| 84 _element.appendChild(LevelDom.unwrap(element)); | |
| 85 } | |
| 86 } | |
| 87 | |
| 88 void sort(int compare(Element a, Element b)) { | |
| 89 throw const UnsupportedOperationException('TODO(jacobr): should we impl?'); | |
| 90 } | |
| 91 | |
| 92 void copyFrom(List<Object> src, int srcStart, int dstStart, int count) { | |
| 93 throw 'Not impl yet. todo(jacobr)'; | |
| 94 } | |
| 95 | |
| 96 void setRange(int start, int length, List from, [int startFrom = 0]) => | |
| 97 Lists.setRange(this, start, length, from, startFrom); | |
| 98 | |
| 99 void removeRange(int start, int length) => | |
| 100 Lists.removeRange(this, start, length, (i) => this[i].remove()); | |
| 101 | |
| 102 void insertRange(int start, int length, [initialValue = null]) { | |
| 103 throw const NotImplementedException(); | |
| 104 } | |
| 105 | |
| 106 ElementList getRange(int start, int length) => | |
| 107 new _ElementList(Lists.getRange(this, start, length)); | |
| 108 | |
| 109 int indexOf(Element element, [int start = 0]) { | |
| 110 return Lists.indexOf(this, element, start, this.length); | |
| 111 } | |
| 112 | |
| 113 int lastIndexOf(Element element, [int start = null]) { | |
| 114 if (start === null) start = length - 1; | |
| 115 return Lists.lastIndexOf(this, element, start); | |
| 116 } | |
| 117 | |
| 118 void clear() { | |
| 119 // It is unclear if we want to keep non element nodes? | |
| 120 _element.textContent = ''; | |
| 121 } | |
| 122 | |
| 123 Element removeLast() { | |
| 124 final last = this.last(); | |
| 125 if (last != null) { | |
| 126 _element.removeChild(LevelDom.unwrap(last)); | |
| 127 } | |
| 128 return last; | |
| 129 } | |
| 130 | |
| 131 Element last() { | |
| 132 return LevelDom.wrapElement(_element.lastElementChild); | |
| 133 } | |
| 134 } | |
| 135 | |
| 136 class FrozenElementList implements ElementList { | |
| 137 final _ptr; | |
| 138 | |
| 139 FrozenElementList._wrap(this._ptr); | |
| 140 | |
| 141 Element get first() { | |
| 142 return this[0]; | |
| 143 } | |
| 144 | |
| 145 void forEach(void f(Element element)) { | |
| 146 for (Element el in this) { | |
| 147 f(el); | |
| 148 } | |
| 149 } | |
| 150 | |
| 151 Collection map(f(Element element)) { | |
| 152 final out = []; | |
| 153 for (Element el in this) { | |
| 154 out.add(f(el)); | |
| 155 } | |
| 156 return out; | |
| 157 } | |
| 158 | |
| 159 ElementList filter(bool f(Element element)) { | |
| 160 final out = new _ElementList([]); | |
| 161 for (Element el in this) { | |
| 162 if (f(el)) out.add(el); | |
| 163 } | |
| 164 return out; | |
| 165 } | |
| 166 | |
| 167 bool every(bool f(Element element)) { | |
| 168 for(Element element in this) { | |
| 169 if (!f(element)) { | |
| 170 return false; | |
| 171 } | |
| 172 }; | |
| 173 return true; | |
| 174 } | |
| 175 | |
| 176 bool some(bool f(Element element)) { | |
| 177 for(Element element in this) { | |
| 178 if (f(element)) { | |
| 179 return true; | |
| 180 } | |
| 181 }; | |
| 182 return false; | |
| 183 } | |
| 184 | |
| 185 bool isEmpty() { | |
| 186 return _ptr.length == 0; | |
| 187 } | |
| 188 | |
| 189 int get length() { | |
| 190 return _ptr.length; | |
| 191 } | |
| 192 | |
| 193 Element operator [](int index) { | |
| 194 return LevelDom.wrapElement(_ptr[index]); | |
| 195 } | |
| 196 | |
| 197 void operator []=(int index, Element value) { | |
| 198 throw const UnsupportedOperationException(''); | |
| 199 } | |
| 200 | |
| 201 void set length(int newLength) { | |
| 202 throw const UnsupportedOperationException(''); | |
| 203 } | |
| 204 | |
| 205 void add(Element value) { | |
| 206 throw const UnsupportedOperationException(''); | |
| 207 } | |
| 208 | |
| 209 | |
| 210 void addLast(Element value) { | |
| 211 throw const UnsupportedOperationException(''); | |
| 212 } | |
| 213 | |
| 214 Iterator<Element> iterator() => new FrozenElementListIterator(this); | |
| 215 | |
| 216 void addAll(Collection<Element> collection) { | |
| 217 throw const UnsupportedOperationException(''); | |
| 218 } | |
| 219 | |
| 220 void sort(int compare(Element a, Element b)) { | |
| 221 throw const UnsupportedOperationException(''); | |
| 222 } | |
| 223 | |
| 224 void copyFrom(List<Object> src, int srcStart, int dstStart, int count) { | |
| 225 throw 'Not impl yet. todo(jacobr)'; | |
| 226 } | |
| 227 | |
| 228 void setRange(int start, int length, List from, [int startFrom = 0]) { | |
| 229 throw const UnsupportedOperationException(''); | |
| 230 } | |
| 231 | |
| 232 void removeRange(int start, int length) { | |
| 233 throw const UnsupportedOperationException(''); | |
| 234 } | |
| 235 | |
| 236 void insertRange(int start, int length, [initialValue = null]) { | |
| 237 throw const UnsupportedOperationException(''); | |
| 238 } | |
| 239 | |
| 240 ElementList getRange(int start, int length) => | |
| 241 new _ElementList(Lists.getRange(this, start, length)); | |
| 242 | |
| 243 int indexOf(Element element, [int start = 0]) => | |
| 244 Lists.indexOf(this, element, start, this.length); | |
| 245 | |
| 246 int lastIndexOf(Element element, [int start = null]) { | |
| 247 if (start === null) start = length - 1; | |
| 248 return Lists.lastIndexOf(this, element, start); | |
| 249 } | |
| 250 | |
| 251 void clear() { | |
| 252 throw const UnsupportedOperationException(''); | |
| 253 } | |
| 254 | |
| 255 Element removeLast() { | |
| 256 throw const UnsupportedOperationException(''); | |
| 257 } | |
| 258 | |
| 259 Element last() { | |
| 260 return this[length-1]; | |
| 261 } | |
| 262 } | |
| 263 | |
| 264 class FrozenElementListIterator implements Iterator<Element> { | |
| 265 final FrozenElementList _list; | |
| 266 int _index = 0; | |
| 267 | |
| 268 FrozenElementListIterator(this._list); | |
| 269 | |
| 270 /** | |
| 271 * Gets the next element in the iteration. Throws a | |
| 272 * [NoMoreElementsException] if no element is left. | |
| 273 */ | |
| 274 Element next() { | |
| 275 if (!hasNext()) { | |
| 276 throw const NoMoreElementsException(); | |
| 277 } | |
| 278 | |
| 279 return _list[_index++]; | |
| 280 } | |
| 281 | |
| 282 /** | |
| 283 * Returns whether the [Iterator] has elements left. | |
| 284 */ | |
| 285 bool hasNext() => _index < _list.length; | |
| 286 } | |
| 287 | |
| 288 class _ElementList extends _ListWrapper<Element> implements ElementList { | |
| 289 _ElementList(List<Element> list) : super(list); | |
| 290 | |
| 291 ElementList filter(bool f(Element element)) => | |
| 292 new _ElementList(super.filter(f)); | |
| 293 | |
| 294 ElementList getRange(int start, int length) => | |
| 295 new _ElementList(super.getRange(start, length)); | |
| 296 } | |
| 297 | |
| 298 class ElementAttributeMap implements Map<String, String> { | |
| 299 | |
| 300 final _element; | |
| 301 | |
| 302 ElementAttributeMap._wrap(this._element); | |
| 303 | |
| 304 bool containsValue(String value) { | |
| 305 final attributes = _element.attributes; | |
| 306 for (int i = 0, len = attributes.length; i < len; i++) { | |
| 307 if(value == attributes.item(i).value) { | |
| 308 return true; | |
| 309 } | |
| 310 } | |
| 311 return false; | |
| 312 } | |
| 313 | |
| 314 bool containsKey(String key) { | |
| 315 return _element.hasAttribute(key); | |
| 316 } | |
| 317 | |
| 318 String operator [](String key) { | |
| 319 return _element.getAttribute(key); | |
| 320 } | |
| 321 | |
| 322 void operator []=(String key, String value) { | |
| 323 _element.setAttribute(key, value); | |
| 324 } | |
| 325 | |
| 326 String putIfAbsent(String key, String ifAbsent()) { | |
| 327 if (!containsKey(key)) { | |
| 328 this[key] = ifAbsent(); | |
| 329 } | |
| 330 } | |
| 331 | |
| 332 String remove(String key) { | |
| 333 _element.removeAttribute(key); | |
| 334 } | |
| 335 | |
| 336 void clear() { | |
| 337 final attributes = _element.attributes; | |
| 338 for (int i = attributes.length - 1; i >= 0; i--) { | |
| 339 _element.removeAttribute(attributes.item(i).name); | |
| 340 } | |
| 341 } | |
| 342 | |
| 343 void forEach(void f(String key, String value)) { | |
| 344 final attributes = _element.attributes; | |
| 345 for (int i = 0, len = attributes.length; i < len; i++) { | |
| 346 final item = attributes.item(i); | |
| 347 f(item.name, item.value); | |
| 348 } | |
| 349 } | |
| 350 | |
| 351 Collection<String> getKeys() { | |
| 352 // TODO(jacobr): generate a lazy collection instead. | |
| 353 final attributes = _element.attributes; | |
| 354 final keys = new List<String>(attributes.length); | |
| 355 for (int i = 0, len = attributes.length; i < len; i++) { | |
| 356 keys[i] = attributes.item(i).name; | |
| 357 } | |
| 358 return keys; | |
| 359 } | |
| 360 | |
| 361 Collection<String> getValues() { | |
| 362 // TODO(jacobr): generate a lazy collection instead. | |
| 363 final attributes = _element.attributes; | |
| 364 final values = new List<String>(attributes.length); | |
| 365 for (int i = 0, len = attributes.length; i < len; i++) { | |
| 366 values[i] = attributes.item(i).value; | |
| 367 } | |
| 368 return values; | |
| 369 } | |
| 370 | |
| 371 /** | |
| 372 * The number of {key, value} pairs in the map. | |
| 373 */ | |
| 374 int get length() { | |
| 375 return _element.attributes.length; | |
| 376 } | |
| 377 | |
| 378 /** | |
| 379 * Returns true if there is no {key, value} pair in the map. | |
| 380 */ | |
| 381 bool isEmpty() { | |
| 382 return !_element.hasAttributes(); | |
| 383 } | |
| 384 } | |
| 385 | |
| 386 class ElementEventsImplementation extends EventsImplementation implements Elemen
tEvents { | |
| 387 ElementEventsImplementation._wrap(_ptr) : super._wrap(_ptr); | |
| 388 | |
| 389 EventListenerList get abort() => _get("abort"); | |
| 390 EventListenerList get beforeCopy() => _get("beforecopy"); | |
| 391 EventListenerList get beforeCut() => _get("beforecut"); | |
| 392 EventListenerList get beforePaste() => _get("beforepaste"); | |
| 393 EventListenerList get blur() => _get("blur"); | |
| 394 EventListenerList get change() => _get("change"); | |
| 395 EventListenerList get click() => _get("click"); | |
| 396 EventListenerList get contextMenu() => _get("contextmenu"); | |
| 397 EventListenerList get copy() => _get("copy"); | |
| 398 EventListenerList get cut() => _get("cut"); | |
| 399 EventListenerList get dblClick() => _get("dblclick"); | |
| 400 EventListenerList get drag() => _get("drag"); | |
| 401 EventListenerList get dragEnd() => _get("dragend"); | |
| 402 EventListenerList get dragEnter() => _get("dragenter"); | |
| 403 EventListenerList get dragLeave() => _get("dragleave"); | |
| 404 EventListenerList get dragOver() => _get("dragover"); | |
| 405 EventListenerList get dragStart() => _get("dragstart"); | |
| 406 EventListenerList get drop() => _get("drop"); | |
| 407 EventListenerList get error() => _get("error"); | |
| 408 EventListenerList get focus() => _get("focus"); | |
| 409 EventListenerList get input() => _get("input"); | |
| 410 EventListenerList get invalid() => _get("invalid"); | |
| 411 EventListenerList get keyDown() => _get("keydown"); | |
| 412 EventListenerList get keyPress() => _get("keypress"); | |
| 413 EventListenerList get keyUp() => _get("keyup"); | |
| 414 EventListenerList get load() => _get("load"); | |
| 415 EventListenerList get mouseDown() => _get("mousedown"); | |
| 416 EventListenerList get mouseMove() => _get("mousemove"); | |
| 417 EventListenerList get mouseOut() => _get("mouseout"); | |
| 418 EventListenerList get mouseOver() => _get("mouseover"); | |
| 419 EventListenerList get mouseUp() => _get("mouseup"); | |
| 420 EventListenerList get mouseWheel() => _get("mousewheel"); | |
| 421 EventListenerList get paste() => _get("paste"); | |
| 422 EventListenerList get reset() => _get("reset"); | |
| 423 EventListenerList get scroll() => _get("scroll"); | |
| 424 EventListenerList get search() => _get("search"); | |
| 425 EventListenerList get select() => _get("select"); | |
| 426 EventListenerList get selectStart() => _get("selectstart"); | |
| 427 EventListenerList get submit() => _get("submit"); | |
| 428 EventListenerList get touchCancel() => _get("touchcancel"); | |
| 429 EventListenerList get touchEnd() => _get("touchend"); | |
| 430 EventListenerList get touchLeave() => _get("touchleave"); | |
| 431 EventListenerList get touchMove() => _get("touchmove"); | |
| 432 EventListenerList get touchStart() => _get("touchstart"); | |
| 433 EventListenerList get transitionEnd() => _get("webkitTransitionEnd"); | |
| 434 EventListenerList get fullscreenChange() => _get("webkitfullscreenchange"); | |
| 435 } | |
| 436 | |
| 437 class SimpleClientRect implements ClientRect { | |
| 438 final num left; | |
| 439 final num top; | |
| 440 final num width; | |
| 441 final num height; | |
| 442 num get right() => left + width; | |
| 443 num get bottom() => top + height; | |
| 444 | |
| 445 const SimpleClientRect(this.left, this.top, this.width, this.height); | |
| 446 | |
| 447 bool operator ==(ClientRect other) { | |
| 448 return other !== null && left == other.left && top == other.top | |
| 449 && width == other.width && height == other.height; | |
| 450 } | |
| 451 | |
| 452 String toString() => "($left, $top, $width, $height)"; | |
| 453 } | |
| 454 | |
| 455 // TODO(jacobr): we cannot currently be lazy about calculating the client | |
| 456 // rects as we must perform all measurement queries at a safe point to avoid | |
| 457 // triggering unneeded layouts. | |
| 458 /** | |
| 459 * All your element measurement needs in one place | |
| 460 * @domName none | |
| 461 */ | |
| 462 class ElementRectWrappingImplementation implements ElementRect { | |
| 463 final ClientRect client; | |
| 464 final ClientRect offset; | |
| 465 final ClientRect scroll; | |
| 466 | |
| 467 // TODO(jacobr): should we move these outside of ElementRect to avoid the | |
| 468 // overhead of computing them every time even though they are rarely used. | |
| 469 // This should be type dom.ClientRect but that fails on dartium. b/5522629 | |
| 470 final _boundingClientRect; | |
| 471 // an exception due to a dartium bug. | |
| 472 final _clientRects; // TODO(jacobr): should be dom.ClientRectList | |
| 473 | |
| 474 ElementRectWrappingImplementation(dom.HTMLElement element) : | |
| 475 client = new SimpleClientRect(element.clientLeft, | |
| 476 element.clientTop, | |
| 477 element.clientWidth, | |
| 478 element.clientHeight), | |
| 479 offset = new SimpleClientRect(element.offsetLeft, | |
| 480 element.offsetTop, | |
| 481 element.offsetWidth, | |
| 482 element.offsetHeight), | |
| 483 scroll = new SimpleClientRect(element.scrollLeft, | |
| 484 element.scrollTop, | |
| 485 element.scrollWidth, | |
| 486 element.scrollHeight), | |
| 487 _boundingClientRect = element.getBoundingClientRect(), | |
| 488 _clientRects = element.getClientRects(); | |
| 489 | |
| 490 ClientRect get bounding() => | |
| 491 LevelDom.wrapClientRect(_boundingClientRect); | |
| 492 | |
| 493 List<ClientRect> get clientRects() { | |
| 494 final out = new List(_clientRects.length); | |
| 495 for (num i = 0; i < _clientRects.length; i++) { | |
| 496 out[i] = LevelDom.wrapClientRect(_clientRects.item(i)); | |
| 497 } | |
| 498 return out; | |
| 499 } | |
| 500 } | |
| 501 | |
| 502 final _START_TAG_REGEXP = const RegExp('<(\\w+)'); | |
| 503 | |
| 504 /** @domName Element, HTMLElement */ | |
| 505 class ElementWrappingImplementation extends NodeWrappingImplementation implement
s Element { | |
| 506 | |
| 507 static final _CUSTOM_PARENT_TAG_MAP = const { | |
| 508 'body' : 'html', | |
| 509 'head' : 'html', | |
| 510 'caption' : 'table', | |
| 511 'td': 'tr', | |
| 512 'colgroup': 'table', | |
| 513 'col' : 'colgroup', | |
| 514 'tr' : 'tbody', | |
| 515 'tbody' : 'table', | |
| 516 'tfoot' : 'table', | |
| 517 'thead' : 'table', | |
| 518 'track' : 'audio', | |
| 519 }; | |
| 520 | |
| 521 /** @domName Document.createElement */ | |
| 522 factory ElementWrappingImplementation.html(String html) { | |
| 523 // TODO(jacobr): this method can be made more robust and performant. | |
| 524 // 1) Cache the dummy parent elements required to use innerHTML rather than | |
| 525 // creating them every call. | |
| 526 // 2) Verify that the html does not contain leading or trailing text nodes. | |
| 527 // 3) Verify that the html does not contain both <head> and <body> tags. | |
| 528 // 4) Detatch the created element from its dummy parent. | |
| 529 String parentTag = 'div'; | |
| 530 String tag; | |
| 531 final match = _START_TAG_REGEXP.firstMatch(html); | |
| 532 if (match !== null) { | |
| 533 tag = match.group(1).toLowerCase(); | |
| 534 if (_CUSTOM_PARENT_TAG_MAP.containsKey(tag)) { | |
| 535 parentTag = _CUSTOM_PARENT_TAG_MAP[tag]; | |
| 536 } | |
| 537 } | |
| 538 // TODO(jacobr): make type dom.HTMLElement when dartium allows it. | |
| 539 var temp = dom.document.createElement(parentTag); | |
| 540 temp.innerHTML = html; | |
| 541 | |
| 542 Element element; | |
| 543 if (temp.childElementCount == 1) { | |
| 544 element = LevelDom.wrapElement(temp.firstElementChild); | |
| 545 } else if (parentTag == 'html' && temp.childElementCount == 2) { | |
| 546 // Work around for edge case in WebKit and possibly other browsers where | |
| 547 // both body and head elements are created even though the inner html | |
| 548 // only contains a head or body element. | |
| 549 element = LevelDom.wrapElement(temp.children.item(tag == 'head' ? 0 : 1)); | |
| 550 } else { | |
| 551 throw new IllegalArgumentException('HTML had ${temp.childElementCount} ' + | |
| 552 'top level elements but 1 expected'); | |
| 553 } | |
| 554 element.remove(); | |
| 555 return element; | |
| 556 } | |
| 557 | |
| 558 /** @domName Document.createElement */ | |
| 559 factory ElementWrappingImplementation.tag(String tag) { | |
| 560 return LevelDom.wrapElement(dom.document.createElement(tag)); | |
| 561 } | |
| 562 | |
| 563 ElementWrappingImplementation._wrap(ptr) : super._wrap(ptr); | |
| 564 | |
| 565 ElementAttributeMap _elementAttributeMap; | |
| 566 ElementList _elements; | |
| 567 _CssClassSet _cssClassSet; | |
| 568 _DataAttributeMap _dataAttributes; | |
| 569 | |
| 570 /** | |
| 571 * @domName Element.hasAttribute, Element.getAttribute, Element.setAttribute, | |
| 572 * Element.removeAttribute | |
| 573 */ | |
| 574 Map<String, String> get attributes() { | |
| 575 if (_elementAttributeMap === null) { | |
| 576 _elementAttributeMap = new ElementAttributeMap._wrap(_ptr); | |
| 577 } | |
| 578 return _elementAttributeMap; | |
| 579 } | |
| 580 | |
| 581 void set attributes(Map<String, String> value) { | |
| 582 Map<String, String> attributes = this.attributes; | |
| 583 attributes.clear(); | |
| 584 for (String key in value.getKeys()) { | |
| 585 attributes[key] = value[key]; | |
| 586 } | |
| 587 } | |
| 588 | |
| 589 void set elements(Collection<Element> value) { | |
| 590 final elements = this.elements; | |
| 591 elements.clear(); | |
| 592 elements.addAll(value); | |
| 593 } | |
| 594 | |
| 595 /** | |
| 596 * @domName childElementCount, firstElementChild, lastElementChild, | |
| 597 * children, Node.appendChild | |
| 598 */ | |
| 599 ElementList get elements() { | |
| 600 if (_elements == null) { | |
| 601 _elements = new _ChildrenElementList._wrap(_ptr); | |
| 602 } | |
| 603 return _elements; | |
| 604 } | |
| 605 | |
| 606 /** @domName className, classList */ | |
| 607 Set<String> get classes() { | |
| 608 if (_cssClassSet === null) { | |
| 609 _cssClassSet = new _CssClassSet(_ptr); | |
| 610 } | |
| 611 return _cssClassSet; | |
| 612 } | |
| 613 | |
| 614 void set classes(Collection<String> value) { | |
| 615 _CssClassSet classSet = classes; | |
| 616 classSet.clear(); | |
| 617 classSet.addAll(value); | |
| 618 } | |
| 619 | |
| 620 Map<String, String> get dataAttributes() { | |
| 621 if (_dataAttributes === null) { | |
| 622 _dataAttributes = new _DataAttributeMap(attributes); | |
| 623 } | |
| 624 return _dataAttributes; | |
| 625 } | |
| 626 | |
| 627 void set dataAttributes(Map<String, String> value) { | |
| 628 Map<String, String> dataAttributes = this.dataAttributes; | |
| 629 dataAttributes.clear(); | |
| 630 for (String key in value.getKeys()) { | |
| 631 dataAttributes[key] = value[key]; | |
| 632 } | |
| 633 } | |
| 634 | |
| 635 String get contentEditable() => _ptr.contentEditable; | |
| 636 | |
| 637 void set contentEditable(String value) { _ptr.contentEditable = value; } | |
| 638 | |
| 639 String get dir() => _ptr.dir; | |
| 640 | |
| 641 void set dir(String value) { _ptr.dir = value; } | |
| 642 | |
| 643 bool get draggable() => _ptr.draggable; | |
| 644 | |
| 645 void set draggable(bool value) { _ptr.draggable = value; } | |
| 646 | |
| 647 Element get firstElementChild() => LevelDom.wrapElement(_ptr.firstElementChild
); | |
| 648 | |
| 649 bool get hidden() => _ptr.hidden; | |
| 650 | |
| 651 void set hidden(bool value) { _ptr.hidden = value; } | |
| 652 | |
| 653 String get id() => _ptr.id; | |
| 654 | |
| 655 void set id(String value) { _ptr.id = value; } | |
| 656 | |
| 657 String get innerHTML() => _ptr.innerHTML; | |
| 658 | |
| 659 void set innerHTML(String value) { _ptr.innerHTML = value; } | |
| 660 | |
| 661 bool get isContentEditable() => _ptr.isContentEditable; | |
| 662 | |
| 663 String get lang() => _ptr.lang; | |
| 664 | |
| 665 void set lang(String value) { _ptr.lang = value; } | |
| 666 | |
| 667 Element get lastElementChild() => LevelDom.wrapElement(_ptr.lastElementChild); | |
| 668 | |
| 669 Element get nextElementSibling() => LevelDom.wrapElement(_ptr.nextElementSibli
ng); | |
| 670 | |
| 671 Element get offsetParent() => LevelDom.wrapElement(_ptr.offsetParent); | |
| 672 | |
| 673 String get outerHTML() => _ptr.outerHTML; | |
| 674 | |
| 675 Element get previousElementSibling() => LevelDom.wrapElement(_ptr.previousElem
entSibling); | |
| 676 | |
| 677 bool get spellcheck() => _ptr.spellcheck; | |
| 678 | |
| 679 void set spellcheck(bool value) { _ptr.spellcheck = value; } | |
| 680 | |
| 681 CSSStyleDeclaration get style() => LevelDom.wrapCSSStyleDeclaration(_ptr.style
); | |
| 682 | |
| 683 int get tabIndex() => _ptr.tabIndex; | |
| 684 | |
| 685 void set tabIndex(int value) { _ptr.tabIndex = value; } | |
| 686 | |
| 687 String get tagName() => _ptr.tagName; | |
| 688 | |
| 689 String get title() => _ptr.title; | |
| 690 | |
| 691 void set title(String value) { _ptr.title = value; } | |
| 692 | |
| 693 String get webkitdropzone() => _ptr.webkitdropzone; | |
| 694 | |
| 695 void set webkitdropzone(String value) { _ptr.webkitdropzone = value; } | |
| 696 | |
| 697 void blur() { | |
| 698 _ptr.blur(); | |
| 699 } | |
| 700 | |
| 701 bool contains(Node element) { | |
| 702 return _ptr.contains(LevelDom.unwrap(element)); | |
| 703 } | |
| 704 | |
| 705 void focus() { | |
| 706 _ptr.focus(); | |
| 707 } | |
| 708 | |
| 709 Element insertAdjacentElement([String where = null, Element element = null]) { | |
| 710 return LevelDom.wrapElement(_ptr.insertAdjacentElement(where, LevelDom.unwra
p(element))); | |
| 711 } | |
| 712 | |
| 713 void insertAdjacentHTML([String position_OR_where = null, String text = null])
{ | |
| 714 _ptr.insertAdjacentHTML(position_OR_where, text); | |
| 715 } | |
| 716 | |
| 717 void insertAdjacentText([String where = null, String text = null]) { | |
| 718 _ptr.insertAdjacentText(where, text); | |
| 719 } | |
| 720 | |
| 721 /** @domName querySelector, Document.getElementById */ | |
| 722 Element query(String selectors) { | |
| 723 // TODO(jacobr): scope fix. | |
| 724 return LevelDom.wrapElement(_ptr.querySelector(selectors)); | |
| 725 } | |
| 726 | |
| 727 /** | |
| 728 * @domName querySelectorAll, getElementsByClassName, getElementsByTagName, | |
| 729 * getElementsByTagNameNS | |
| 730 */ | |
| 731 ElementList queryAll(String selectors) { | |
| 732 // TODO(jacobr): scope fix. | |
| 733 return new FrozenElementList._wrap(_ptr.querySelectorAll(selectors)); | |
| 734 } | |
| 735 | |
| 736 void scrollByLines([int lines = null]) { | |
| 737 _ptr.scrollByLines(lines); | |
| 738 } | |
| 739 | |
| 740 void scrollByPages([int pages = null]) { | |
| 741 _ptr.scrollByPages(pages); | |
| 742 } | |
| 743 | |
| 744 /** @domName scrollIntoView, scrollIntoViewIfNeeded */ | |
| 745 void scrollIntoView([bool centerIfNeeded = null]) { | |
| 746 _ptr.scrollIntoViewIfNeeded(centerIfNeeded); | |
| 747 } | |
| 748 | |
| 749 bool matchesSelector([String selectors = null]) { | |
| 750 return _ptr.webkitMatchesSelector(selectors); | |
| 751 } | |
| 752 | |
| 753 void set scrollLeft(int value) { _ptr.scrollLeft = value; } | |
| 754 | |
| 755 void set scrollTop(int value) { _ptr.scrollTop = value; } | |
| 756 | |
| 757 /** | |
| 758 * @domName getClientRects, getBoundingClientRect, clientHeight, clientWidth, | |
| 759 * clientTop, clientLeft, offsetHeight, offsetWidth, offsetTop, offsetLeft, | |
| 760 * scrollHeight, scrollWidth, scrollTop, scrollLeft | |
| 761 */ | |
| 762 Future<ElementRect> get rect() { | |
| 763 return _createMeasurementFuture( | |
| 764 () => new ElementRectWrappingImplementation(_ptr), | |
| 765 new Completer<ElementRect>()); | |
| 766 } | |
| 767 | |
| 768 /** @domName Window.getComputedStyle */ | |
| 769 Future<CSSStyleDeclaration> get computedStyle() { | |
| 770 // TODO(jacobr): last param should be null, see b/5045788 | |
| 771 return getComputedStyle(''); | |
| 772 } | |
| 773 | |
| 774 /** @domName Window.getComputedStyle */ | |
| 775 Future<CSSStyleDeclaration> getComputedStyle(String pseudoElement) { | |
| 776 return _createMeasurementFuture(() => | |
| 777 LevelDom.wrapCSSStyleDeclaration( | |
| 778 dom.window.getComputedStyle(_ptr, pseudoElement)), | |
| 779 new Completer<CSSStyleDeclaration>()); | |
| 780 } | |
| 781 | |
| 782 ElementEvents get on() { | |
| 783 if (_on === null) { | |
| 784 _on = new ElementEventsImplementation._wrap(_ptr); | |
| 785 } | |
| 786 return _on; | |
| 787 } | |
| 788 | |
| 789 Element clone(bool deep) => super.clone(deep); | |
| 790 } | |
| OLD | NEW |