| Index: sdk/lib/html/src/CssClassSet.dart | 
| diff --git a/sdk/lib/html/src/CssClassSet.dart b/sdk/lib/html/src/CssClassSet.dart | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..0add4f733498d28c65a7a38d6720ef53052fe639 | 
| --- /dev/null | 
| +++ b/sdk/lib/html/src/CssClassSet.dart | 
| @@ -0,0 +1,123 @@ | 
| +// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
| +// for details. All rights reserved. Use of this source code is governed by a | 
| +// BSD-style license that can be found in the LICENSE file. | 
| + | 
| +abstract class CssClassSet implements Set<String> { | 
| + | 
| +  String toString() { | 
| +    return Strings.join(new List.from(readClasses()), ' '); | 
| +  } | 
| + | 
| +  /** | 
| +   * Adds the class [token] to the element if it is not on it, removes it if it | 
| +   * is. | 
| +   */ | 
| +  bool toggle(String value) { | 
| +    Set<String> s = readClasses(); | 
| +    bool result = false; | 
| +    if (s.contains(value)) { | 
| +      s.remove(value); | 
| +    } else { | 
| +      s.add(value); | 
| +      result = true; | 
| +    } | 
| +    writeClasses(s); | 
| +    return result; | 
| +  } | 
| + | 
| +  /** | 
| +   * Returns [:true:] if classes cannot be added or removed from this | 
| +   * [:CssClassSet:]. | 
| +   */ | 
| +  bool get frozen => false; | 
| + | 
| +  // interface Iterable - BEGIN | 
| +  Iterator<String> iterator() => readClasses().iterator(); | 
| +  // interface Iterable - END | 
| + | 
| +  // interface Collection - BEGIN | 
| +  void forEach(void f(String element)) { | 
| +    readClasses().forEach(f); | 
| +  } | 
| + | 
| +  Collection map(f(String element)) => readClasses().map(f); | 
| + | 
| +  Collection<String> filter(bool f(String element)) => readClasses().filter(f); | 
| + | 
| +  bool every(bool f(String element)) => readClasses().every(f); | 
| + | 
| +  bool some(bool f(String element)) => readClasses().some(f); | 
| + | 
| +  bool get isEmpty => readClasses().isEmpty; | 
| + | 
| +  int get length =>readClasses().length; | 
| +  // interface Collection - END | 
| + | 
| +  // interface Set - BEGIN | 
| +  bool contains(String value) => readClasses().contains(value); | 
| + | 
| +  void add(String value) { | 
| +    // TODO - figure out if we need to do any validation here | 
| +    // or if the browser natively does enough | 
| +    _modify((s) => s.add(value)); | 
| +  } | 
| + | 
| +  bool remove(String value) { | 
| +    Set<String> s = readClasses(); | 
| +    bool result = s.remove(value); | 
| +    writeClasses(s); | 
| +    return result; | 
| +  } | 
| + | 
| +  void addAll(Collection<String> collection) { | 
| +    // TODO - see comment above about validation | 
| +    _modify((s) => s.addAll(collection)); | 
| +  } | 
| + | 
| +  void removeAll(Collection<String> collection) { | 
| +    _modify((s) => s.removeAll(collection)); | 
| +  } | 
| + | 
| +  bool isSubsetOf(Collection<String> collection) => | 
| +    readClasses().isSubsetOf(collection); | 
| + | 
| +  bool containsAll(Collection<String> collection) => | 
| +    readClasses().containsAll(collection); | 
| + | 
| +  Set<String> intersection(Collection<String> other) => | 
| +    readClasses().intersection(other); | 
| + | 
| +  void clear() { | 
| +    _modify((s) => s.clear()); | 
| +  } | 
| +  // interface Set - END | 
| + | 
| +  /** | 
| +   * Helper method used to modify the set of css classes on this element. | 
| +   * | 
| +   *   f - callback with: | 
| +   *      s - a Set of all the css class name currently on this element. | 
| +   * | 
| +   *   After f returns, the modified set is written to the | 
| +   *       className property of this element. | 
| +   */ | 
| +  void _modify( f(Set<String> s)) { | 
| +    Set<String> s = readClasses(); | 
| +    f(s); | 
| +    writeClasses(s); | 
| +  } | 
| + | 
| +  /** | 
| +   * Read the class names from the Element class property, | 
| +   * and put them into a set (duplicates are discarded). | 
| +   * This is intended to be overridden by specific implementations. | 
| +   */ | 
| +  Set<String> readClasses(); | 
| + | 
| +  /** | 
| +   * Join all the elements of a set into one string and write | 
| +   * back to the element. | 
| +   * This is intended to be overridden by specific implementations. | 
| +   */ | 
| +  void writeClasses(Set<String> s); | 
| +} | 
|  |