| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 1 part of fn; | 5 part of fn; |
| 2 | 6 |
| 3 void parentInsertBefore(sky.ParentNode parent, | 7 void _parentInsertBefore(sky.ParentNode parent, |
| 4 sky.Node node, | 8 sky.Node node, |
| 5 sky.Node ref) { | 9 sky.Node ref) { |
| 6 if (ref != null) { | 10 if (ref != null) { |
| 7 ref.insertBefore([node]); | 11 ref.insertBefore([node]); |
| 8 } else { | 12 } else { |
| 9 parent.appendChild(node); | 13 parent.appendChild(node); |
| 10 } | 14 } |
| 11 } | 15 } |
| 12 | 16 |
| 13 abstract class Node { | 17 abstract class Node { |
| 14 String _key = null; | 18 String _key = null; |
| 15 sky.Node _root = null; | 19 sky.Node _root = null; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 34 | 38 |
| 35 // Text nodes are special cases of having non-unique keys (which don't need | 39 // Text nodes are special cases of having non-unique keys (which don't need |
| 36 // to be assigned as part of the API). Since they are unique in not having | 40 // to be assigned as part of the API). Since they are unique in not having |
| 37 // children, there's little point to reordering, so we always just re-assign | 41 // children, there's little point to reordering, so we always just re-assign |
| 38 // the data. | 42 // the data. |
| 39 Text(this.data) : super(key:'*text*'); | 43 Text(this.data) : super(key:'*text*'); |
| 40 | 44 |
| 41 bool _sync(Node old, sky.ParentNode host, sky.Node insertBefore) { | 45 bool _sync(Node old, sky.ParentNode host, sky.Node insertBefore) { |
| 42 if (old == null) { | 46 if (old == null) { |
| 43 _root = new sky.Text(data); | 47 _root = new sky.Text(data); |
| 44 parentInsertBefore(host, _root, insertBefore); | 48 _parentInsertBefore(host, _root, insertBefore); |
| 45 return false; | 49 return false; |
| 46 } | 50 } |
| 47 | 51 |
| 48 _root = old._root; | 52 _root = old._root; |
| 49 (_root as sky.Text).data = data; | 53 (_root as sky.Text).data = data; |
| 50 return false; | 54 return false; |
| 51 } | 55 } |
| 52 } | 56 } |
| 53 | 57 |
| 54 var _emptyList = new List<Node>(); | 58 final List<Node> _emptyList = new List<Node>(); |
| 55 | 59 |
| 56 abstract class Element extends Node { | 60 abstract class Element extends Node { |
| 57 | 61 |
| 58 String get _tagName; | 62 String get _tagName; |
| 59 | 63 |
| 60 Element get _emptyElement; | 64 Element get _emptyElement; |
| 61 | 65 |
| 62 String inlineStyle; | 66 String inlineStyle; |
| 63 | 67 |
| 64 sky.EventListener onClick; | 68 sky.EventListener onClick; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 95 this.onPointerUp, | 99 this.onPointerUp, |
| 96 this.onScrollEnd, | 100 this.onScrollEnd, |
| 97 this.onScrollStart, | 101 this.onScrollStart, |
| 98 this.onScrollUpdate, | 102 this.onScrollUpdate, |
| 99 this.onWheel | 103 this.onWheel |
| 100 }) : super(key:key) { | 104 }) : super(key:key) { |
| 101 | 105 |
| 102 _className = style == null ? '': style._className; | 106 _className = style == null ? '': style._className; |
| 103 _children = children == null ? _emptyList : children; | 107 _children = children == null ? _emptyList : children; |
| 104 | 108 |
| 105 if (debugWarnings()) { | 109 if (_debugWarnings()) { |
| 106 _debugReportDuplicateIds(); | 110 _debugReportDuplicateIds(); |
| 107 } | 111 } |
| 108 } | 112 } |
| 109 | 113 |
| 110 void _remove() { | 114 void _remove() { |
| 111 super._remove(); | 115 super._remove(); |
| 112 if (_children != null) { | 116 if (_children != null) { |
| 113 for (var child in _children) { | 117 for (var child in _children) { |
| 114 child._remove(); | 118 child._remove(); |
| 115 } | 119 } |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 // print("...no oldElement, initial render"); | 191 // print("...no oldElement, initial render"); |
| 188 | 192 |
| 189 _root = sky.document.createElement(_tagName); | 193 _root = sky.document.createElement(_tagName); |
| 190 _syncNode(); | 194 _syncNode(); |
| 191 | 195 |
| 192 for (var child in _children) { | 196 for (var child in _children) { |
| 193 child._sync(null, _root, null); | 197 child._sync(null, _root, null); |
| 194 assert(child._root is sky.Node); | 198 assert(child._root is sky.Node); |
| 195 } | 199 } |
| 196 | 200 |
| 197 parentInsertBefore(host, _root, insertBefore); | 201 _parentInsertBefore(host, _root, insertBefore); |
| 198 return false; | 202 return false; |
| 199 } | 203 } |
| 200 | 204 |
| 201 _root = oldElement._root; | 205 _root = oldElement._root; |
| 202 oldElement._root = null; | 206 oldElement._root = null; |
| 203 sky.Element root = (_root as sky.Element); | 207 sky.Element root = (_root as sky.Element); |
| 204 | 208 |
| 205 _syncNode(oldElement); | 209 _syncNode(oldElement); |
| 206 | 210 |
| 207 var startIndex = 0; | 211 var startIndex = 0; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 if (currentNode is Text) | 280 if (currentNode is Text) |
| 277 return false; // Never re-order Text nodes. | 281 return false; // Never re-order Text nodes. |
| 278 | 282 |
| 279 ensureOldIdMap(); | 283 ensureOldIdMap(); |
| 280 oldNode = oldNodeIdMap[currentNode._key]; | 284 oldNode = oldNodeIdMap[currentNode._key]; |
| 281 if (oldNode == null) | 285 if (oldNode == null) |
| 282 return false; | 286 return false; |
| 283 | 287 |
| 284 oldNodeIdMap[currentNode._key] = null; // mark it reordered. | 288 oldNodeIdMap[currentNode._key] = null; // mark it reordered. |
| 285 // print("Reparenting ${currentNode._key}"); | 289 // print("Reparenting ${currentNode._key}"); |
| 286 parentInsertBefore(root, oldNode._root, nextSibling); | 290 _parentInsertBefore(root, oldNode._root, nextSibling); |
| 287 return true; | 291 return true; |
| 288 } | 292 } |
| 289 | 293 |
| 290 // Scan forwards, this time we may re-order; | 294 // Scan forwards, this time we may re-order; |
| 291 // print("...scanning forward"); | 295 // print("...scanning forward"); |
| 292 nextSibling = root.firstChild; | 296 nextSibling = root.firstChild; |
| 293 while (startIndex < endIndex && oldStartIndex < oldEndIndex) { | 297 while (startIndex < endIndex && oldStartIndex < oldEndIndex) { |
| 294 currentNode = _children[startIndex]; | 298 currentNode = _children[startIndex]; |
| 295 oldNode = oldChildren[oldStartIndex]; | 299 oldNode = oldChildren[oldStartIndex]; |
| 296 | 300 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 337 | 341 |
| 338 oldElement._children = null; | 342 oldElement._children = null; |
| 339 return false; | 343 return false; |
| 340 } | 344 } |
| 341 } | 345 } |
| 342 | 346 |
| 343 class Container extends Element { | 347 class Container extends Element { |
| 344 | 348 |
| 345 String get _tagName => 'div'; | 349 String get _tagName => 'div'; |
| 346 | 350 |
| 347 static Container _emptyContainer = new Container(); | 351 static final Container _emptyContainer = new Container(); |
| 348 | 352 |
| 349 Element get _emptyElement => _emptyContainer; | 353 Element get _emptyElement => _emptyContainer; |
| 350 | 354 |
| 351 Container({ | 355 Container({ |
| 352 Object key, | 356 Object key, |
| 353 List<Node> children, | 357 List<Node> children, |
| 354 Style style, | 358 Style style, |
| 355 String inlineStyle, | 359 String inlineStyle, |
| 356 sky.EventListener onClick, | 360 sky.EventListener onClick, |
| 357 sky.EventListener onFlingCancel, | 361 sky.EventListener onFlingCancel, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 382 onScrollStart: onScrollStart, | 386 onScrollStart: onScrollStart, |
| 383 onScrollUpdate: onScrollUpdate, | 387 onScrollUpdate: onScrollUpdate, |
| 384 onWheel: onWheel | 388 onWheel: onWheel |
| 385 ); | 389 ); |
| 386 } | 390 } |
| 387 | 391 |
| 388 class Image extends Element { | 392 class Image extends Element { |
| 389 | 393 |
| 390 String get _tagName => 'img'; | 394 String get _tagName => 'img'; |
| 391 | 395 |
| 392 static Image _emptyImage = new Image(); | 396 static final Image _emptyImage = new Image(); |
| 393 Element get _emptyElement => _emptyImage; | 397 Element get _emptyElement => _emptyImage; |
| 394 | 398 |
| 395 String src; | 399 String src; |
| 396 int width; | 400 int width; |
| 397 int height; | 401 int height; |
| 398 | 402 |
| 399 Image({ | 403 Image({ |
| 400 Object key, | 404 Object key, |
| 401 List<Node> children, | 405 List<Node> children, |
| 402 Style style, | 406 Style style, |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 if (height != oldImage.height) { | 454 if (height != oldImage.height) { |
| 451 skyImage.style['height'] = '${height}px'; | 455 skyImage.style['height'] = '${height}px'; |
| 452 } | 456 } |
| 453 } | 457 } |
| 454 } | 458 } |
| 455 | 459 |
| 456 class Anchor extends Element { | 460 class Anchor extends Element { |
| 457 | 461 |
| 458 String get _tagName => 'a'; | 462 String get _tagName => 'a'; |
| 459 | 463 |
| 460 static Anchor _emptyAnchor = new Anchor(); | 464 static final Anchor _emptyAnchor = new Anchor(); |
| 461 | 465 |
| 462 String href; | 466 String href; |
| 463 | 467 |
| 464 Anchor({ | 468 Anchor({ |
| 465 Object key, | 469 Object key, |
| 466 List<Node> children, | 470 List<Node> children, |
| 467 Style style, | 471 Style style, |
| 468 String inlineStyle, | 472 String inlineStyle, |
| 469 sky.EventListener onClick, | 473 sky.EventListener onClick, |
| 470 sky.EventListener onFlingCancel, | 474 sky.EventListener onFlingCancel, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 void _syncNode([Element old]) { | 507 void _syncNode([Element old]) { |
| 504 Anchor oldAnchor = old != null ? old as Anchor : _emptyAnchor; | 508 Anchor oldAnchor = old != null ? old as Anchor : _emptyAnchor; |
| 505 super._syncNode(oldAnchor); | 509 super._syncNode(oldAnchor); |
| 506 | 510 |
| 507 sky.HTMLAnchorElement skyAnchor = _root as sky.HTMLAnchorElement; | 511 sky.HTMLAnchorElement skyAnchor = _root as sky.HTMLAnchorElement; |
| 508 if (href != oldAnchor.href) { | 512 if (href != oldAnchor.href) { |
| 509 skyAnchor.href = href; | 513 skyAnchor.href = href; |
| 510 } | 514 } |
| 511 } | 515 } |
| 512 } | 516 } |
| OLD | NEW |