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

Side by Side Diff: lib/templating.dart

Issue 23532024: Changes in webui to comply with the safe html changes. Now that Nodes can be (Closed) Base URL: git@github.com:dart-lang/web-ui.git@master
Patch Set: Created 7 years, 3 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
« no previous file with comments | « lib/src/emitters.dart ('k') | pubspec.yaml » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 /** Common utility functions used by code generated by the dwc compiler. */ 5 /** Common utility functions used by code generated by the dwc compiler. */
6 library templating; 6 library templating;
7 7
8 import 'dart:async'; 8 import 'dart:async';
9 import 'dart:collection'; 9 import 'dart:collection';
10 import 'dart:html'; 10 import 'dart:html';
11 import 'dart:svg' as svg;
11 import 'package:web_ui/safe_html.dart'; 12 import 'package:web_ui/safe_html.dart';
12 import 'package:web_ui/observe.dart'; 13 import 'package:web_ui/observe.dart';
13 import 'package:web_ui/watcher.dart'; 14 import 'package:web_ui/watcher.dart';
14 import 'package:web_ui/web_ui.dart' show WebComponent; 15 import 'package:web_ui/web_ui.dart' show WebComponent;
15 16
16 /** 17 /**
17 * Take the value of a bound expression and creates an HTML node with its value. 18 * Empty sanitizer used to create HTML content that was already sanitized during
18 * Normally bindings are associated with text nodes, unless [binding] has the 19 * compilation.
19 * [SafeHtml] type, in which case an html element is created for it.
20 */ 20 */
21 Node nodeForBinding(binding) => binding is SafeHtml 21 NodeTreeSanitizer nullTreeSanitizer = new _NullTreeSanitizer();
22 ? new Element.html(binding.toString()) : new Text(binding.toString()); 22 class _NullTreeSanitizer implements NodeTreeSanitizer {
23 void sanitizeTree(Node node) {}
24 }
23 25
24 /** 26 /**
25 * Updates a data-bound [node] to a new [value]. If the new value is not 27 * Helper function to create a tag without it's context. Used to workaround the
26 * [SafeHtml] and the node is a [Text] node, then we update the node in place. 28 * change that removed support for `new Element.html('<td attr=foo></td>')`.
27 * Otherwise, the node is replaced in the DOM tree and the new node is returned. 29 */
30 Node createSafeNode(String tag, Map<String, String> attributes, String body) {
31 var node = new Element.tag(tag);
32 for (var key in attributes.keys) {
33 node.attributes[key] = attributes[key];
34 }
35 if (body != '') node.setInnerHtml(body, treeSanitizer: nullTreeSanitizer);
36 return node;
37 }
38
39 /**
40 * Take the value of a bound expression and creates an HTML node with its value.
41 * Normally bindings are associated with text nodes, unless [binding] is a
42 * [Node] (in which case the Node it self is used as the binding) or has the
43 * [SafeHtml] type (in which case an html element is created for it).
44 */
45 Node nodeForBinding(binding) => binding is Node ? binding
46 : (binding is SafeHtml ? new Element.html(binding.toString())
47 : new Text(binding.toString()));
48
49 /**
50 * Updates a data-bound [node] to a new [value]. If the new value is a [Node],
51 * then the new node will replace the old node. If value is not [SafeHtml] and
52 * the node is a [Text] node, we try to update the node in place. Otherwise,
53 * the node is replaced in the DOM tree and the new node is returned.
28 * [stringValue] should be equivalent to `value.toString()` and can be passed 54 * [stringValue] should be equivalent to `value.toString()` and can be passed
29 * here if it has already been computed. 55 * here if it has already been computed.
30 */ 56 */
31 Node updateBinding(value, Node node, [String stringValue]) { 57 Node updateBinding(value, Node node, [String stringValue]) {
58 if (value is Node) {
59 node.replaceWith(value);
60 return value;
61 }
62
32 var isSafeHtml = value is SafeHtml; 63 var isSafeHtml = value is SafeHtml;
33 if (stringValue == null) { 64 if (stringValue == null) {
34 stringValue = value.toString(); 65 stringValue = value.toString();
35 } 66 }
36 67
37 if (!isSafeHtml && node is Text) { 68 if (!isSafeHtml && node is Text) {
38 node.text = stringValue; 69 node.text = stringValue;
39 } else { 70 } else {
40 var old = node; 71 var old = node;
41 node = isSafeHtml ? new Element.html(stringValue) : new Text(stringValue); 72 node = !isSafeHtml ? new Text(stringValue)
73 : new Element.html(stringValue, treeSanitizer: nullTreeSanitizer);
42 old.replaceWith(node); 74 old.replaceWith(node);
43 } 75 }
44 return node; 76 return node;
45 } 77 }
46 78
47 /** 79 /**
48 * Adds CSS [classes] if [addClasses] is true, otherwise removes them. 80 * Adds CSS [classes] if [addClasses] is true, otherwise removes them.
49 * This is useful to keep one or more CSS classes in sync with a boolean 81 * This is useful to keep one or more CSS classes in sync with a boolean
50 * property. 82 * property.
51 * 83 *
(...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 node.nodes.clear(); 677 node.nodes.clear();
646 nodes.clear(); 678 nodes.clear();
647 } 679 }
648 680
649 void remove() { 681 void remove() {
650 _removeInternal(); 682 _removeInternal();
651 stopper(); 683 stopper();
652 stopper = null; 684 stopper = null;
653 } 685 }
654 } 686 }
OLDNEW
« no previous file with comments | « lib/src/emitters.dart ('k') | pubspec.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698